activex控件被windows阻止,调用activex控件出错

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

activex控件被windows阻止,调用activex控件出错