在VC中,让动态创建的ActiveX控件响应Windows消息。

王朝vc·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

当我们通过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);

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航