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

  • 相关阅读:
    网络时钟同步SOCKET代码
    NTP时间同步之同步时钟要领
    3分钟 Markdown 快速入门(超详细)(Day_33)
    如何在idea中将项目生成API文档(超详细)(Day_32)
    多条件分页 (Day_31)
    常见判断错误 (Day_30)
    HTML 标签隐藏占用空间与不占用空间(Day_29)
    EasyUI_使用datagrid分页 (Day_28)
    (xxx) is not defined at HTMLInputElement.onblur(Day_27)
    EasyUI系列—点击按钮加载tabs_day26
  • 原文地址:https://www.cnblogs.com/bigfi/p/7608237.html
Copyright © 2020-2023  润新知