子窗口将消息转发给父窗口
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