1.对于SDI与MDI,重写窗口的 PreCreateWindow函数即可。 参考:http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/vccore/html/_core_changing_the_styles_of_a_window_created_by_mfc.asp 2.可是对于基于对话框的MFC应用程序,这就不行了。 原因:一般的窗口的创建是使用Create函数,这个函数在创建窗口之前调用了PreCreateWindow函数,并且允许在创建创建之前在 PreCreateWindow注册一个拥有自定义窗口样式的新的窗口类,来创建一个拥有自定义类名新的窗口。而模式对话框是通过 CreateDialogIndirect来创建的,在这当中并没有调用PreCreateWindow函数,重载的PreCreateWindow函数根本就不被执行,因此在这个函数里修改对话框的窗口类是没有用的。 解决方法: 在CXXXDlg::OnInitDialog()中,添加下列2者之一均可。 —————————————————————————— CRect rect; rect.left=0; rect.top=0; rect.right=200; rect.bottom=100; MoveWindow(&rect); —————————————————————————— SetWindowPos(&wndTopMost,0,0,200,100,SWP_NOMOVE); —————————————————————————— 3.可是用了以上方法,你会突然发现,为什么窗口没去(0,0)的左上角,而呆在中央呢? 还是来看看MFC的源码吧。 AfxWndProc() -> AfxCallWndProc() —————————————————————————— …… if (nMsg == WM_INITDIALOG) _AfxPreInitDialog(pWnd, &rectOld, &dwStyle); // delegate to object’s WindowProc lResult = pWnd->WindowProc(nMsg, wParam, lParam); // more special case for WM_INITDIALOG if (nMsg == WM_INITDIALOG) _AfxPostInitDialog(pWnd, rectOld, dwStyle); …… —————————————————————————— 从这里可以看到,在调用OnInitDialog()之后,紧接着调用了_AfxPostInitDialog()。我们再去 _AfxPostInitDialog()里看看。 —————————————————————————— …… if (!pWnd->CheckAutoCenter()) return; // center modal dialog boxes/message boxes pWnd->CenterWindow(); …… —————————————————————————— 看来如果CheckAutoCenter()的返回值为TRUE的话,就会调用CenterWindow()来让窗口居中了。 Go CheckAutoCenter()! —————————————————————————— …… bResult = !(dwStyle & (DS_CENTER|DS_CENTERMOUSE|DS_ABSALIGN)) && x == 0 && y == 0; …… return bResult; // TRUE if auto-center is ok —————————————————————————— 到此真相大白了。要想把窗口能放在(0, 0),DS_CENTER,DS_CENTERMOUSE,DS_ABSALIGN必须有一为TRUE,Center和Center Mouse显然不是我们想要的,那么把对话框的Absolute Align属性设置为TRUE。问题搞定。 |