【发布时间】:2011-01-16 06:13:25
【问题描述】:
我最近使用 Microsoft 的 Spy++ 检查了一个 GUI,发现了一个奇怪的结构;它看起来像这样(警告,前面的 ASCII 艺术):
| + 002004D6 "MyRootWindow1" FooClassName | | | + 001F052C“MyChildWindow”ClassOfChildWindow | \ 001D0A8C "MyRootWindow2" SomeOtherClassName有两个根窗口002004D6和001D0A8c,其中一个有一个子窗口001F052C。
现在,如果不是为了一件事,这一切都会好起来的:在子窗口 (001F052C ) 产生001D0A8C。
读取:“MyChildWindow”是“MyRootWindow1”的子级,但“MyRootWindow1”不是“MyChildWindow”的父级。相反,“MyChildWindow”的父级是“MyRootWindow2” - 但是,为了完成这一点,枚举“MyRootWindow2”的子级不会产生“MyChildWindow”。
这是一个完全静态的 GUI 应用程序,所以这里没有竞争条件或任何东西。
有人知道这是怎么发生的吗?有人知道我该如何解决这个问题吗?直到 现在,我使用GetParent 和EnumChildWindows 来获取给定HWND 的父(或子),并且我假设这种关系是对称的。还有什么我应该使用的吗?
编辑:这是一个演示问题的小型 C++ 程序的代码:
const HINSTANCE thisModule = ::GetModuleHandle( NULL );
HWND oldParent = ::CreateWindow( TEXT("STATIC"),
TEXT("Old parent"),
WS_VISIBLE | WS_BORDER,
0, 0, 850, 500,
NULL,
NULL,
thisModule,
NULL );
HWND child = ::CreateWindow( TEXT("STATIC"),
TEXT("This is a sample dialog"),
WS_OVERLAPPED | WS_POPUP | WS_VISIBLE | WS_BORDER,
100, 100, 300, 300,
oldParent,
NULL,
thisModule,
NULL );
HWND newParent = ::CreateWindow( TEXT("STATIC"),
TEXT("Fake main window"),
WS_VISIBLE | WS_BORDER,
0, 0, 850, 500,
NULL,
NULL,
thisModule,
NULL );
::SetParent( child, newParent );
注意“子”对象如何设置WS_POPUP 和 WS_OVERLAPPED,但不设置WS_CHILD。
【问题讨论】:
-
缺少子窗口
WS_CHILD。此外,有可能(尽管不寻常)有一个与您的所有者窗口不同的父窗口。看起来您可能正在为子窗口设置两者。您能否详细说明您要完成的工作? -
是的,缺少 WS_CHILD。我在最后一句话中指出了这一点。 :-) 不幸的是,显示的代码不在我的控制之下。它是我想要自省的 GUI 应用程序代码的一部分。
标签: c++ c user-interface winapi