当前位置:C++技术网 > 资讯 > PreCreateWindow不能修改对话框工程的原因

PreCreateWindow不能修改对话框工程的原因

更新时间:2016-01-18 21:35:52浏览次数:1+次

《PreCreateWindow不允许修改对话框工程》里,介绍了一些基本知识,你可以看看。在vs2010中建立的MFC单文档程序,无论是在CMainFrame里的PreCreateWindow函数中对cs进行修改,还是使用SetWindowPos或MoveWindow函数,都无法实现对窗口的修改。

现在的状态是,如果给窗口加上可以调节大小这一style,那么窗口会自动保留上次更改后的大小,如果不加可调,那窗口就会按系统所固定的一个大小进行显示,根本无视我的所有设置,怎么办?

问:BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
  if(!CFrameWnd::PreCreateWindow(cs))
  {
  return FALSE;
  }
  cs.style &= ~WS_OVERLAPPED
  cs.cy = 300;
  cs.cx = 100;
  return TRUE;
}
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)

{

.....//MFC自己生产的代码

SetWindowPos(CWnd::FromHandle(HWND_NOTOPMOST),200,200,300,300,SWP_FRAMECHANGED|SWP_SHOWWINDOW);

return0;

}
这时你会发现窗口的大小先变成自定义的大小,紧接着又改变成了系统默认的大小,如果变化太快看不清。
这要了解MFC9.0中,窗口到显示的整个过程。首先调用PreCreateWindow和 OnCreateWindow按cs中设定的值创建窗口(这时的窗口并没有显示出来),再调用
m_pMainWnd->ShowWindow(SW_SHOW);

m_pMainWnd->UpdateWindow();
之前会从注册表中读取包括窗口上一次关闭时的大小和位置等其他信息(第一次创建时会把系统默认的信息写到注册表),并根据这些信息改变窗口。这就是为什么在PreCreateWindow中更改窗口的大小和位置不起作用的原因。
你要修改窗口大小,可以直接在App类的InitInstance中ShowWindow();UpdateWindow()之前修改窗口大小,例如 m_pMainWnd->MoveWindow(CRect(100, 100, 600, 400), FALSE);
程序在注册表里保留了FRAME上次的状态,包括大小位置以及各工具类窗口的布局等.
解决方法有二,其中第一个简单, 第二更稳妥:
1.)在InitInstance(..)调用CleanState(_T("WorkSpace"));(不过这方法,我感觉比较悬)