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

  • 相关阅读:
    零零碎碎
    MFC入门--显示静态图片及调用本地软件
    Python版本OpenCV安装配置及简单实例
    用星星画菱形--Java
    pycharm IDE在导入自定义模块时提示有错,但实际没错
    Cmd使用方式--命令行运行程序
    cv2 & PIL(pillow)显示图像
    C++命令行多文件编译(g++)
    MNIST多图显示--Python练习
    visual studio 2017--括号自动补全
  • 原文地址:https://www.cnblogs.com/bigfi/p/7608237.html
Copyright © 2011-2022 走看看