Подтвердить что ты не робот

Win32 окно Владелец против окна Родитель?

В программировании Win32 в чем разница между родителем окна и владельцем окна? Я думал, что понял, понял ли я этот код:

SetWindowLong(handle, GWL_HWNDPARENT, foo);

Это фактически устанавливает владельца окна, а не родителя - несмотря на использование GWL_HWNDPARENT. Являются ли термины родитель/владелец взаимозаменяемыми, или есть ли разница?

4b9b3361

Ответ 1

Владелец - это окно *, ответственное за управление или диалог (например, ответственный за создание/уничтожение окна).

Родитель является следующим старшим окном * для управления или диалога в цепочке окон, но на самом деле не отвечает за него (не обязательно заботится о его жизненном цикле и т.д.). Родитель окна также может быть его владельцем.

* Окно против окна: окно - это фактическое окно, отображаемое на экране; window - любой объект с HWND (включая кнопки, панели и т.д.).

Ответ 2

Собственность - это взаимоотношение между двумя окнами верхнего уровня, в то время как Parent - это отношения между верхним уровнем и WS_CHILD, или WS_CHILD и еще одним WS_CHILD.

Родитель кнопки - это форма, в которой он включен, а окно сообщения принадлежит форме, которая его показывала.

Прочтите эту статью от Microsoft Иерархия и стили окон Win32, чтобы получить более четкое представление о правах собственности, родительском, ZOrder, SetWindowLong, GetWindow и всех другие неприятные биты Win32 api для создания отношений окна.

EDIT: Похоже, Microsoft сбила этот контент, вот еще одно разумное резюме Ownershiphip/Parenting.

Ответ 4

Разъяснено полностью в msdn

Ответ 5

Запись блога Чена - это тот, который нужно прочитать. Ключевым моментом для меня является то, что стиль WS_CHILD должен использоваться в дочернем окне. Вы можете попытаться создать дочернее окно и передать родительский дескриптор в CreateWindow(), но если у вас нет установленного стиля WS_CHILD, у двух окон будет отношение владельца, а не от отношения родительский/дочерний.