Re: Особенность или глюк функции SetWindowLong, SetParent и GetP
От: qaz77  
Дата: 23.11.20 07:25
Оценка: 2 (1)
Здравствуйте, Melamed, Вы писали:

M>Если окно имеет стиль WS_POPUP, то результат функции GetParent() всегда возвращает NULL. Если даже вы поменяли родительское окно у такого окна функцией SetParent() на требуемое родительское окно, то несмотря на что забота функции завершается без ошибки, но при функция GetParent() возвращает NULL.


Понятие родителя поддерживается только для дочерних окон WS_CHILD. Стиль WS_CHILD ортогонален WS_POPUP.

Для попап окон существует понятие owner window, которое в просторечье часто также называют родителем.
В Win API существует некоторая путаница, т.к. функции CreateWindow(Ex), SetParent для попап окон устанавливают owner, а не parent вопреки названию параметра/функции.

Получить owner window можно так: GetWindow(hwnd, GW_OWNER)
Особенность или глюк функции SetWindowLong, SetParent и GetP
От: Melamed Россия  
Дата: 21.11.20 21:35
Оценка:
Если окно имеет стиль WS_POPUP, то результат функции GetParent() всегда возвращает NULL. Если даже вы поменяли родительское окно у такого окна функцией SetParent() на требуемое родительское окно, то несмотря на что забота функции завершается без ошибки, но при функция GetParent() возвращает NULL. Тот же результат, когда вы меняете родительское окно на нужное у окна, которое не имеет стиль WS_POPUP, а потом с помощью функции SetWindowLong() устанавливается данный стиль окна. А окно ведет так, как-будто родительское окно установлено правильно
Если не устанавливать стиль WS_POPUP у окна дочерного, то все работает нормально.
ОС MS Windows 10 среда разработки MS VS2015 C++. Проект WINAPI32 + STL
Отредактировано 22.11.2020 9:23 Melamed . Предыдущая версия .
Re[2]: Особенность или глюк функции SetWindowLong, SetParent и GetP
От: RonWilson Россия  
Дата: 08.01.21 18:07
Оценка:
Здравствуйте, qaz77, Вы писали:

Q>Получить owner window можно так: GetWindow(hwnd, GW_OWNER)


И у самого Microsoft-а полно подобного кода, например из shell-а:

    if (hwnd && IsWindow(hwnd)) {
        HWND hwndOwner;
        while((NULL != (hwndOwner = GetParent(hwnd))) || (NULL != (hwndOwner = GetWindow(hwnd, GW_OWNER)))) {
            hwnd = hwndOwner;
        }
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.