zoukankan      html  css  js  c++  java
  • 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也不会崩溃。

  • 相关阅读:
    LeetCode Subsets II
    LeetCode Rotate Image
    LeetCode Palidrome Number
    LeetCode Generate Parentheses
    LeetCode Maximum Subarray
    LeetCode Set Matrix Zeroes
    LeetCode Remove Nth Node From End of List
    Linux Loop设备 使用
    Linux 文件系统大小调整
    LeetCode N-Queens II
  • 原文地址:https://www.cnblogs.com/bigfi/p/7608237.html
Copyright © 2011-2022 走看看