子窗口将消息转发给父级

时间:2012-08-06 16:28:12

标签: winapi mfc

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

appearance of the initial dialog

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

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

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

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

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

parent with child window which covers controls

问题是,当我移动鼠标光标或点击这个新的子窗口时,消息被转发到父窗口(我使用Spy ++检查),其他子控件重新绘制在新的子窗口上,如波纹管。

children redrawn over

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

  1. 将所有隐藏控件的状态更改为已禁用,因此它们不会对任何消息做出反应。
  2. 确保叠加窗口位于Z顺序的顶部。您可以在创建窗口时执行此操作,也可以稍后使用SetWindowPos
  3. 执行此操作