1

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

初始对话框的外观

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

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

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

BOOL CLayerWnd::OnEraseBkgnd(CDC* pDC)
{
  CBrush b(RGB(0, 100, 100));
  RECT r;
  GetClientRect(&r);
  pDC->FillRect(&r, &b);
  return TRUE;
}

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

带有覆盖控件的子窗口的父级

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

孩子们重画了

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

4

2 回答 2

0

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

于 2012-08-06T16:33:53.017 回答
0

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

  1. 将所有隐藏控件的状态更改为禁用,这样它们就不会对任何消息做出反应。
  2. 确保覆盖窗口位于 Z 顺序的顶部。您可以在创建窗口时或稍后使用SetWindowPos.
于 2012-08-06T16:40:03.813 回答