WM_MOUSEWHEEL、WM_LBUTTONDOWN等父子窗口消息传递陷阱

本文讨论了MFC中父对话框A如何正确地将鼠标滚轮和左键按下等消息传递给子窗口B的问题。作者尝试了几种解决方案,包括在PreTranslateMessage中返回FALSE以及使用SendMessage直接发送消息到B。最终通过修改子窗口B的消息处理函数解决了死循环的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

转载于:https://www.cnblogs.com/bigfi/p/7608237.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值