CWnd建立WS_CHILD和WS_POPUP視窗的不同
最近在寫一個從CWnd派生出來的自繪視窗,以前在封裝自己的類的Create函數都是這麼寫的:
BOOL CGG::Create(DWORD dwStyle, const RECT &rect, CWnd *pParentWnd, UINT nID, CCreateContext *pContext)<br />{<br />if (!CWnd::Create(GUOGUOTIPSUPWINDOW_CLASSNAME, NULL, dwStyle, rect, pParentWnd, nID, pContext))<br />return FALSE;</p><p> return true;<br />}<br />
這次也這麼寫,以前都是建立的WS_CHILD的視窗,都是這麼調用的:
DWORD style=WS_CHILD|WS_OVERLAPPED;
m_tooltips.Create(style,CRect(0,0,300,300),NULLthis,NULL,NULL);
沒有任何問題。
這次要建立一個WS_POPUP類型的視窗,當然就按照下面這麼調用了:
DWORD style=WS_POPUP|WS_OVERLAPPED;
m_tooltips.Create(style,CRect(0,0,300,300),NULL,NULL,NULL);
但是,結果卻crash了,鬱悶了。
查了半天發現,原來是Create函數的實現出了問題。
CWnd::Create函數只能建立非WS_POPUP的視窗風格的視窗。而如果要建立WS_POPUP的視窗和有擴充風格的視窗,必須調用CWnd::CreateEx才能搞定。
MSDN對Create的說明:
Creates and initializes the child window associated with the CWnd object.
MSDN對CreateEx的說明:
Creates a Windows overlapped, pop-up, or child window and attaches it to a CWnd object.