问题描述:
新建一个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) ;