在VC中,讓動態建立的ActiveX控制元件響應Windows訊息。 (轉)

gugu99發表於2008-07-17
在VC中,讓動態建立的ActiveX控制元件響應Windows訊息。 (轉)[@more@]

當我們透過CWnd::CreateControl()動態建立時,訊息並不會被髮送給我們的由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 CMlexGrid;

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);
}


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-1007385/,如需轉載,請註明出處,否則將追究法律責任。

相關文章