在MFC中,经常如果你的程序窗口需要在弹出窗口和子窗口之间转换,那么,我们来看下面的问题:
假设有CTestDlg,CPopDlg的继承自CDialog的对话框类
1.模式对话框
CTestDlg dlg1
dlg1.DoModal()
.....
dlg1的某个按钮处理函数
CPopDlg dlg2;
dlg2.DoModal();
.....
2.无模式对话框
CTestDlg dlg1
dlg1.DoModal()
.....
dlg1的某个按钮处理函数
CPopDlg *dlg2;
dlg2=new CPopDlg;
dlg2->Crate(IDD_DLG2,this);
dlg2->ModifyStyle(WS_POPUP|WS_BORDER,WS_CHILD,true)
RECT rc;
GetDlgItem(IDC_DLG2_POS)->GetDWindowRect(&rc);
ScreenToClient(&rc);
dlg2->MoveWindow(&rc,true);
dlg2->ShowWindow(SW_SHOW);
.....
第一段代码没有问题,第二段代码很有问题,第二段代码目的是要实现类似属性页的功能,但是未了代码通用性,没有为DLG2重新写过一个对象,而是重用弹出对话框的代码。结果,我们发现没有办法把dlg2移动到IDC_DLG2_POS控件的位置上,而且dlg2的编辑控件没有响应用户界面消息,下面详细解释这是为什么。
1。关于MoveWindow
MoveWindow是移动窗口的WINAPI,其有一个LPRECT的参数,代表新的窗口坐标,如果窗口本省具有WS_POPUP属性,那么新的窗口坐标是以屏幕坐标为坐标系,如果具有WS_CHILD属性,那么以父窗口坐标为坐标系,但是不能同时具有WS_POPUP和WS_CHILD属性。
在上面的代码中,已经取消了WS_POPUP属性,同时也增加了WS_CHILD属性,获得的IDC_DLG2_POS也从屏幕坐标系转换成了客户坐标系,但是位置怎么就是不对呢,而且子控件没有响应?
2.关于WS_CHILD,WS_POPUP之间的切换
如果将WS_POPUP改成WS_CHILD的时候,有一点很容易忽视
CPopDlg *dlg2;
dlg2=new CPopDlg;
dlg2->Crate(IDD_DLG2,this);
dlg2->ModifyStyle(WS_POPUP|WS_BORDER,WS_CHILD,true)
dlg2在Create的时候,指定了父窗口,所有ModifyStyle之后,就利索当然的是WS_CHILD了,错!在Create的时候,dlg2还是WS_POPUP属性,所以,千万要记住,在将WS_POPUP修改成WS_CHILD之后,一定要调用下面的语句:
dlg2->SetParent(this);
所用功能正常了,dlg2的子窗口————也有响应了。当然如果你的资源定义的本来就是WS_CHILD,那么就没有那么复杂了,希望对大家有用!