WM_MOUSEWHEEL、WM_LBUTTONDOWN等父子窗口消息传递陷阱
mfc中,碰到以下问题:父对话框A、子窗口B。B是CWnd对象。需要在B中处理WM_MOUSEWHEEL、WM_LBUTTONDOWN等消息。
所以在B中增加对应的消息处理,发现B中的消息循环中,收不到WM_MOUSEWHEEL、WM_LBUTTONDOWN这些消息。
但是在A中却可以收到这些消息,应该是这些消息被A截获了,因为我在A中响应了PreTranslateMessage函数
BOOL A::PreTranslateMessage(MSG* pMsg){
return __super::PreTranslateMessage(pMsg);
}
。那么怎么让B响应这些消息呢。
一般的做法是:1.在A中响应这些消息,然后调用B对象的方法。如果A或B所处的文件结构不是很复杂的话,这样应该是最简单的。
2.PreTranslateMessage函数最后,改为return FALSE。让消息往子窗口B传递。
但是我的情况是B是在一个单独的dll里的,所以不打算增加额外接口,直接通过:
SendMessage(B.hWnd,WM_MOUSEWHEEL,zDelta, MAKELPARAM(pt.x, pt.y));这样的方式传递消息。
但是我在B中接收这个WM_MOUSEWHEEL消息的时候,
BOOL OnMouseWheel(UINT nFlags, short zDelta, CPoint pt){
return CWnd::OnMouseWheel(nFlags,zDelta,pt);
}
导致了程序的崩溃。
其实,通过调试可以发现,B中的该处理函数是处于死循环状态。所以修改为
BOOL OnMouseWheel(UINT nFlags, short zDelta, CPoint pt){
return TRUE;//因为此时B已经是最顶层的窗口了,无子窗口,所以直接截获(别的消息却不会崩溃)
}
该问题解决。注:如果是WM_LBUTTONDOWN等消息,调用CWnd::OnLButtonDown却不会崩溃,即使是CDialog::OnMouseWheel也不会崩溃。
最新文章
- kindeditor4整合SyntaxHighlighter,让代码亮起来
- Solve
- VitualBox环境下,实现windows系统与虚拟机Linux文件互传
- SPSS数据分析—判别分析
- SQL Server存储过程复习(一)
- 使用JS启动本地应用程序、屏幕键盘
- 转:MFC之COleVariant
- DataGrid GridView 单页javascript 表头排序
- Win8 弹出窗口不在最前端的解决方法
- 浅谈localStorage本地存储
- 禁止select下拉框的其中某个选择项不能被选择
- oracle ORA-00913: 值过多
- 阿里云部署 Flask + WSGI + Nginx 详解
- C++数据结构之图
- Quartz (二) 和Spring整合
- 新技术探究之 GraphQL
- Nginx日志切割案例讲解,Nginx的知识讲解
- PHP中文网上的分页代码
- Java对List进行分页
- new function
热门文章
- maven cloudara依赖下载
- 在Gridview 中 对日期格式的控制
- Idea打jar包(包含依赖的jar)
- logback--日志在windows上可以打印,在linux上不能打印的问题
- Java基础知识点总结(三)
- MySQL视图、触发器、事务、存储过程、内置函数、流程控制、索引
- Harbor配置自签名证书,docker login+web https访问,helm chart推送应用
- 开启Telnet服务
- 正在阅读的tex教程
- Ambari调整日志级别:How to enable debug logging in Ambari Server and Ambari Agent ?