2011-03-29 14:53 ActiveX控件中接收并处理Windows消息的问题

问题描述:

新建一个MFC ActiveX工程,添加一对话框资源,上面有一些标准控件,如按钮、编辑框、树形列表等,并生成一个类CCtrlPanel。
在CXXXXCtrl类中:
int   CXXXXCtrl::OnCreate(LPCREATESTRUCT   lpCreateStruct)  
{
if   (COleControl::OnCreate(lpCreateStruct)   ==   -1)
return   -1;
m_CtrlPanel.Create(IDD_CTRLPANEL,this);
//m_CtrlPanel在.h文件中申明为:CCtrlPanel   m_CtrlPanel;
OnActivateInPlace(TRUE,NULL);
return   0;
}
这样一来,的确做了个带界面的ActiveX控件,可是用于网页中的时候,控件的子窗口,就是CCtrlPanel类收不到tab键、回车键和方向键,这样控件显得很不专业。本想使用 BOOL   CSluiceCtrl::PreTranslateMessage(MSG*   pMsg) 来实现,但没成功。

问题分析:

引用蒋晟:“PretranslateMessage依赖于MFC的消息循环。如果容器的消息循环不是MFC的,那么PretranslateMessage不会被调用。
MFC对话框相应的键盘处理依赖于MFC的消息循环。如果容器的消息循环没有调用IsDialogMessage,那么相应的键盘处理不会被调用
。”

PreTranslateMessage是在CWinThread::PumpMessage内调用的,而ocx内本就没有CWinThread线程,所以ocx内是不会调用PreTranslateMessage的。 但ocx是窗口的话,它会来窗口消息,重载DefWindowProc,直接在内处理就行了。

解决方法:

1、重载DefWindowProc函数CXXXXCtrl::DefWindowProc(),在其中增加处理过程如下:
if (message == WM_KEYDOWN)
{
AfxMessageBox("Hey");
OnBtnMakecall();
return 0L;
}
//AfxMessageBox("Hey1");

return CDialog::DefWindowProc(message, wParam, lParam);

2、重载OnCommand函数CCtrlPanel::OnCommand(WPARAM wParam, LPARAM lParam),在其中添加发送消息,如下:

SendMessage (hwnd, WM_LBUTTONDOWN, SB_TOP, 0) ;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值