Недавно я проверил графический интерфейс с Microsoft Spy ++ и заметил странную структуру; Выглядело это (предупреждение, ASCII искусства впереди):Как я могу обойти асимметрию GetParent/EnumChildWindows?
| + 002004D6 "MyRootWindow1" FooClassName | | | + 001F052C "MyChildWindow" ClassOfChildWindow | \ 001D0A8C "MyRootWindow2" SomeOtherClassName
Есть два корня окна, 002004D6
и 001D0A8c
, бывший один из которых имеет одно дочернее окно, 001F052C
.
Теперь, это было бы все хорошо, и найти, если это не было для одной вещи: вызов GetParent (или смотреть «Родительское окно» или поля «Владелец окна» в Spy ++) на дочернем окне (001F052C
) дает 001D0A8C
,
Читайте: «MyChildWindow» является дочерним положением «MyRootWindow1», но «MyRootWindow1» не является родительским элементом «MyChildWindow». Вместо этого родителем «MyChildWindow» является «MyRootWindow2», но, чтобы сделать это полным, перечисление детей «MyRootWindow2» не дает «MyChildWindow».
Это совершенно статическое приложение графического интерфейса, поэтому здесь нет условий гонки.
Кто-нибудь знает, как это может произойти? Кто-нибудь знает, как я могу обойти это? До сейчас я использовал GetParent и EnumChildWindows, чтобы получить родительский (или дочерний) для данного HWND, и я предположил, что это соотношение является симметричным. Может быть, что-то еще я должен использовать?
EDIT: Вот код программы небольшой 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, которое я хочу изучить. –