现在需要将一个窗体放到一个控件中,默认情况下窗体的Style属性为Popup,而在控件的初始化时,代码如下:
m_dealDlg=shared_ptr<CImageDealDlg>(new CImageDealDlg()); m_dealDlg->Create(IDD_imageDeal); m_dealDlg->SetParent(this); m_dealDlg->ShowWindow(SW_SHOW);
这样做几乎没有问题——只有一个小小的完美之处——一个程序添加这个控件窗口后,如果有其它的非Topmost窗体有部分覆盖主程序,这时用鼠标直接点击子窗体,主程序不会弹到最上层来。用简洁的话说,即虽然用SetParent可以将一个窗体与虽一窗体设置为父子关系,但这时它们只是看起来像而已,即子窗体会跟随移动,可是没有没有消息通信。
于是想到将Style属性设置为Child,可这时在Release模式下,控件一片空白,在Debug模式下在winocc.cpp的328行ASSERT中断,发现是因为m_hWnd没有值的原因,而m_hWnd一般是在Create时被创建的,这时再研究下Create是否被正确调用,发现其后还可以指定第二个参数CWnd* pParentWnd。于是改成
m_dealDlg->Create(IDD_imageDeal,this);
发现程序正常运行,再去掉 m_dealDlg->SetParent(this); 也可正常运行。
原来如此,Parent得在Create函数中指定。这里再吐槽下,MFC中有三个地方可以设置父窗体——构造函数、Create参数、SetParent。
在MSDN中搜索Window Styles可以知道各种Style的区别,这里就不做翻译。