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

  • 相关阅读:
    多尺度双边滤波及基于小波变换的非线性扩散
    yum安装CentOS7+nginx+php7.3+mysql5.7
    python学习之特殊魔法__getattr__,__getattribute__
    python学习之特殊魔法__get__,__set__,__delete__
    python学习之装饰器
    python学习之私有属性
    python学习之包装与授权
    python学习之生成器(generator)
    python学习之运用特殊方法,定制类
    python学习之创建迭代器对象
  • 原文地址:https://www.cnblogs.com/bigfi/p/7608237.html
Copyright © 2011-2022 走看看