現在需要將一個窗體放到一個控件中,默認情況下窗體的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的區別,這里就不做翻譯。