碰到的問題:
我在MFC程序中使用一個由CWnd::CreateControl 創建的WebBrowser控件,這個控件是有CWnd繼承下來的,今天我有一個需求是要在當中響應Windows消息去重繪,但是我發現這個控件窗口居然不能夠接受父窗口的Windows窗口消息,很是無語。
問題產生的原因: 導致控件無法接收Windows窗口消息的原因是因為CreateControl 沒有子類化子窗口,自然是無法響應了。關于子類化的相關資料請查看參考資料,或者自行搜索。
解決的辦法: 在創建窗口以后調用CWnd::SubclassWindow即可。偽代碼如下:
CControlWnd* pWnd;
pWnd->Create();
HWND hWnd = pWnd->Detach();
pWnd->SubclassWindow(hWnd);
當然,你也可以再重載CWnd::Create()方法將以上代碼加入進去,比如:
BOOL CWebBrowser::Create( LPCTSTR lpszClassName,
LPCTSTR lpszWindowName,
DWORD dwStyle,
const RECT& rect,
CWnd* pParentWnd,
UINT nID,

CCreateContext* pContext /**//**//**//*= NULL*/ )


{
BOOL bRet = CreateControl(GetClsid(), lpszWindowName, dwStyle, rect, pParentWnd, nID);
HWND hWnd = Detach();
SubclassWindow(hWnd);
return bRet;
}

參考資料:1. 在VC中,讓動態創建的ActiveX控件響應Windows消息。
http://www.ttadd.com/diannao/HTML/152058.html2.CWnd中PreCreateWindow、PreSubclassWindow、SubclassWindow的區別
http://www.shnenglu.com/totti1006/archive/2009/01/15/72101.html