Что заставило бы родительское окно не знать, что у него был дочерний диалог? - PullRequest
0 голосов
/ 21 мая 2009

В моем родном приложении для Windows Mobile у меня есть окно, которое создает диалог. Допустим, мой дескриптор окна hMainWnd.

Я создаю диалог, используя DialogBoxParam() и передавая hMainWnd в качестве родителя диалога:

DialogBoxParam(_,_,hMainWnd,_,_);

Допустим, дескриптор диалога - hDlgWnd. В диалоговом окне GetParent() возвращает hMainWnd, как и ожидалось:

//We're inside the dialog created above
HWND hParent = GetParent(hDlgWnd); //hParent == hMainWnd

Вот странная вещь: звонить GetWindow(), чтобы найти детей hMainWnd, возвращает NULL, означая, что у него нет детей. Я ожидаю, что функция вернет hDlgWnd

//We're inside the main window    
HWND hChild = GetWindow(hMainWnd, GW_CHILD); //hChild == NULL

Как ребенок может знать своего родителя, если родитель не знает своего ребенка?

Ответы [ 2 ]

3 голосов
/ 21 мая 2009

GetWindow с GW_CHILD, по-видимому, не возвращает дочерние окна, только дочерние окна. От MSDN :

Найденный дескриптор идентифицирует дочернее окно в верхней части Z порядок, если указанное окно является родительское окно; в противном случае извлеченный дескриптор НЕДЕЙСТВИТЕЛЕН. Функция исследует только дочерние окна указанное окно. Не рассматривает потомок windows

В чем разница между ребенком и потомком? Я не знаю, но EnumChildWindows может дать вам то, что вам нужно.

0 голосов
/ 16 сентября 2016

Окно является либо дочерним окном (имеет стиль WS_CHILD), либо окном верхнего уровня.

Окна верхнего уровня не имеют родительского окна, но могут иметь окно владельца. У дочерних окон есть родитель, но нет владельца.

Функция GetParent () возвращает родителя дочернего окна или владельца окна верхнего уровня. Следовательно, он назван неправильно - он должен называться GetParentOrOwner ().

Итак, вы получаете владельца окна верхнего уровня от GetParent (), но поскольку он на самом деле не родительский, hDlgWnd не является дочерним элементом hMainWnd.

...