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也不会崩溃。

最新文章

  1. kindeditor4整合SyntaxHighlighter,让代码亮起来
  2. Solve
  3. VitualBox环境下,实现windows系统与虚拟机Linux文件互传
  4. SPSS数据分析—判别分析
  5. SQL Server存储过程复习(一)
  6. 使用JS启动本地应用程序、屏幕键盘
  7. 转:MFC之COleVariant
  8. DataGrid GridView 单页javascript 表头排序
  9. Win8 弹出窗口不在最前端的解决方法
  10. 浅谈localStorage本地存储
  11. 禁止select下拉框的其中某个选择项不能被选择
  12. oracle ORA-00913: 值过多
  13. 阿里云部署 Flask + WSGI + Nginx 详解
  14. C++数据结构之图
  15. Quartz (二) 和Spring整合
  16. 新技术探究之 GraphQL
  17. Nginx日志切割案例讲解,Nginx的知识讲解
  18. PHP中文网上的分页代码
  19. Java对List进行分页
  20. new function

热门文章

  1. maven cloudara依赖下载
  2. 在Gridview 中 对日期格式的控制
  3. Idea打jar包(包含依赖的jar)
  4. logback--日志在windows上可以打印,在linux上不能打印的问题
  5. Java基础知识点总结(三)
  6. MySQL视图、触发器、事务、存储过程、内置函数、流程控制、索引
  7. Harbor配置自签名证书,docker login+web https访问,helm chart推送应用
  8. 开启Telnet服务
  9. 正在阅读的tex教程
  10. Ambari调整日志级别:How to enable debug logging in Ambari Server and Ambari Agent ?