MFC子窗體、父窗體


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM