activex控件被windows阻止,调用activex控件出错
问题描述:
创建一个新的MFC ActiveX项目,添加一个带有一些标准控件的对话框资源,比如按钮,编辑框,树形列表等。并生成一个类CCtrlPanel。
在CXXXXCtrl类中:
int cxxxxxctrl:OnCreate(LPCREATESTRUCT LPCREATESTRUCT)
{
if(cole control:OnCreate(lpCreateStruct)==-1)
return-1;
m_CtrlPanel。Create(IDD_CTRLPANEL,this);
//m_CtrlPanel是在。h文件为:CCtrlPanel m _ CtrlPanel
OnActivateInPlace(TRUE,NULL);
返回0;
}
这样确实做成了一个有接口的ActiveX控件,但是在网页中使用时,控件的子窗口,也就是CCtrlPanel类,无法接收tab键、enter键和方向键,使得控件看起来不专业。本想用Bool CSLuicectrl:PretranslateMessage(msg * pmsg)实现,但是不行。
问题分析:
引用江生的话:“PretranslateMessage依赖于MFC的消息循环。如果容器的消息循环不是MFC的,那么将不会调用PretranslateMessage。
MFC对话框对应的键盘处理依赖于MFC的消息循环。如果容器的消息循环不调用IsDialogMessage,则不会调用相应的键盘处理。"
PreTranslateMessage在CWinThread:PumpMessage中被调用,但是ocx中没有CWinThread线程,所以在ocx中不会被调用。但是如果ocx是一个窗口,它会发送一个窗口消息,重载DefWindowProc,直接处理。
解决方法:
1.重载DefWindowProc函数cxxxxxctrl:DefWindowProc(),并添加以下处理过程:
if (message==WM_KEYDOWN)
{
AfxMessageBox( Hey );
OnBtnMakecall();
返回0L;
}
//AfxMessageBox( hey 1 );
返回CDialog:DefWindowProc(message,wParam,lParam);
2.重载OnCommand函数cctrlpanel:on command(wparam wparam,lparam lparam),并向其添加一条发送消息,如下所示:
SendMessage (hwnd,WM_LBUTTONDOWN,SB_TOP,0);