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

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

SetWindowLong(handle, GWL_HWNDPARENT, foo);

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

3 ответов


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

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

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


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

родителем кнопки является форма, в которой она находится, а окно сообщения принадлежит форме, которая его показала.

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

EDIT: похоже, Microsoft сняла этот контент, вот еще один разумный резюме владения / воспитания.


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