博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2011-03-29 14:53 ActiveX控件中接收并处理Windows消息的问题
阅读量:6237 次
发布时间:2019-06-22

本文共 1143 字,大约阅读时间需要 3 分钟。

问题描述:

新建一个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) ;

转载地址:http://etbia.baihongyu.com/

你可能感兴趣的文章
2.3 Rust函数
查看>>
1.3 IDAE 中使用GO开发项目
查看>>
Activity、Fragment、ViewPage
查看>>
《信息安全系统设计基础》课程总结
查看>>
衣码对照表
查看>>
Vue-Router导航守卫
查看>>
tool
查看>>
hdu2087 剪花布条
查看>>
获取现阶段选中的tab的标题(easyui)
查看>>
tty的核心位置,与运行调用过程
查看>>
Python全栈学习_day011作业
查看>>
20172304 实验三报告
查看>>
[转载]项目风险管理七种武器-霸王枪
查看>>
正则实例
查看>>
Hash与Map
查看>>
sqlmap使用笔记
查看>>
U盾技术学习笔记
查看>>
云计算面临的安全挑战 访北大计算机学院院长陈钟
查看>>
一起谈.NET技术,C#中标准Dispose模式的实现
查看>>
艾伟:C#对游戏手柄的编程开发-API篇(2)
查看>>