CWnd创建WS_CHILD和WS_POPUP窗口的不同
最近在写一个从CWnd派生出来的自绘窗口,以前在包装自己的类的Create函数都是这么写的:
BOOL CGG::Create(DWORD dwStyle, const RECT &rect, CWnd *pParentWnd, UINT nID, CCreateContext *pContext) { if (!CWnd::Create(GUOGUOTIPSUPWINDOW_CLASSNAME, NULL, dwStyle, rect, pParentWnd, nID, pContext)) return FALSE; return true; }
这次也这么写,以前都是创建的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.