子窗口将消息转发给父窗口

Posted

技术标签:

【中文标题】子窗口将消息转发给父窗口【英文标题】:Child window forwards messages to parent 【发布时间】:2012-08-06 16:28:11 【问题描述】:

我有一个父窗口(MFC 对话框),上面有一些控件(编辑框、按钮等),如下所示:

在运行时 (OnInitDialog),我创建了另一个子窗口,它覆盖并隐藏了对话框中的所有其他控件,使用以下代码:

  RECT r;
  GetClientRect(&r);
  m_layer.Create(NULL, NULL, WS_CHILD | WS_VISIBLE, r, this, 0);

m_layer 对象是继承自 CWnd 的类 CLaywerWnd 的一个实例。在这个类中,我重写了以下方法:

BOOL CLayerWnd::OnEraseBkgnd(CDC* pDC)

  CBrush b(RGB(0, 100, 100));
  RECT r;
  GetClientRect(&r);
  pDC->FillRect(&r, &b);
  return TRUE;

现在我的窗口看起来像这样:

问题是,当我移动鼠标光标或单击这个新的子窗口时,消息被转发到父窗口(我使用 Spy++ 进行了检查),并且其他子控件在新的子窗口上重绘,例如如下。

我不明白为什么会发生这种情况,我想知道如何避免这种行为。

【问题讨论】:

你真的想用这个层窗口做什么?隐藏控件?改变背景颜色?还有什么? @BrendanMcK - 实际上,最后,我希望图层窗口是透明的并在其上绘制一些东西。不良行为是当我移动鼠标时,下面的控件被绘制在我的图层窗口上,我不明白为什么。 【参考方案1】:

我可能错了,但我想知道您是否在代码中混淆了两个对话框的句柄,从而将消息发布到错误的对话框?

【讨论】:

【参考方案2】:

一个简单的避免它的方法需要两个步骤:

    将所有隐藏控件的状态更改为禁用,这样它们就不会对任何消息做出反应。 确保覆盖窗口位于 Z 顺序的顶部。您可以在创建窗口时或稍后使用SetWindowPos 执行此操作。

【讨论】:

以上是关于子窗口将消息转发给父窗口的主要内容,如果未能解决你的问题,请参考以下文章

16 Windows编程——系统内置窗口子类型之editComboBox

第12条:理解消息转发机制

Delphi主窗口任务栏菜单的问题(转发WM_SYSCOMMAND到Application)

理解消息转发机制

在mfc中 为啥关闭子窗口连带把主窗口关闭了??

用于打开新窗口的书签将当前窗口转发到 [对象窗口]?