在VC中,讓動態建立的ActiveX控制項響應Windows訊息。
作者:未知 來源:月光軟體站 加入時間:2005-2-28 月光軟體站
-
當我們通過CWnd::CreateControl()動態建立ActiveX控制項時,Windows訊息並不會被發送給我們的由CWnd派生得控制項類。例如,即使我們為WM_KILLFOCUS訊息建立了控制代碼,這個控制代碼也是不會被調用的。(不信你試試 :))
引起這個問題的原因時,CWnd::CreateControl()並不會使我控制項的HWND子類化。
知道了原因,要解決問題就不難了。我們只要在控制項建立之後使它子類化就行了。通過一下步驟可以實現:
1.當然是添加控制項啦,先產生控制項的C++包容類。
2.再要建立控制項的類中聲明成員變數,此成員變數是包容類的指標對象。
3.在包容類的標頭檔中添加:
//{{AFX_MSG(CMyClass)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
CMyClass是實際的類名。
4.在包容類的CPP檔案的#include段下面添加:
BEGIN_MESSAGE_MAP(CMyClass, CWnd)
//{{AFX_MSG_MAP(CMyClass)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
5.刪除工程目錄下的.clw檔案,在工程中開啟ClassWizard,先選yes,在選Add All。
6.現在你就可以使用ClassWizard為控制項包容類添加訊息映射和處理函數了。
完成這些修改後,你必須建立控制項並且使它子類化,下面是個例子:
void CSDIApp2View::OnInitialUpdate()
{
CView::OnInitialUpdate();
m_pFlexGrid = new CMSFlexGrid;
CRect rect;
GetClientRect(&rect);
m_pFlexGrid->Create(NULL, WS_CHILD | WS_VISIBLE, rect, this, IDC_FLEXGRID);
HWND hWnd = m_pFlexGrid->Detach();
m_pFlexGrid->SubclassWindow(hWnd);
}