2009-02-03 10 views
44

In der Win32-Programmierung, was ist der Unterschied zwischen einem Elternteil eines Fensters und einem Besitzer des Fensters? Ich dachte, ich hätte es herausgefunden, dann kam ich auf diesen Code:Win32 Fenster Besitzer vs Fenster Eltern?

SetWindowLong(handle, GWL_HWNDPARENT, foo); 

Dies ist eigentlich das Fenster der Eigentümer setzt, nicht die Eltern - trotz der GWL_HWNDPARENT verwendet wird. Sind die Begriffe Eltern/Besitzer austauschbar, oder gibt es tatsächlich einen Unterschied?

Antwort

17

Besitzer ist das Fenster * verantwortlich für ein Steuerelement oder einen Dialog (z. B. verantwortlich für das Erstellen/Zerstören des Fensters).

Parent ist das nächstältere Fenster * zu einem Steuerelement oder Dialog in der Fensterkette, ist aber nicht wirklich dafür verantwortlich (es interessiert sich nicht unbedingt für seinen Lebenszyklus usw.). Ein Elternteil eines Fensters kann auch sein Besitzer sein.

* Fenster vs. Fenster: Fenster ist ein aktuelles Fenster, das auf dem Bildschirm angezeigt wird; Fenster ist ein beliebiges Objekt mit einem HWND (einschließlich Schaltflächen, Panels usw.).

+3

Danke für das Fenster vs Fenster Tipp - manchmal diese Dinge ein wenig verwirrend, wenn Sie mit anderen Leuten zu diskutieren versuchen. –

+25

Dies ist nicht korrekt. Ein Fenster kann einen Elternteil oder einen Besitzer haben, aber nicht beides. –

+2

Raymond, ich denke, ein Teil der Verwirrung ist, dass Spy ++ und GetAncestor (GA_PARENT) ein 'nächstes Fenster eine Ebene höher im HWND-Baum' zurückgeben werden, sogar für HWNDs auf höchster Ebene, also umgangssprachlich, haben sie ein 'Elternteil', auch wenn es intern nicht so verfolgt wird. Es gibt grundsätzlich zwei Möglichkeiten, den HWND-Baum zu betrachten. die naive Ansicht "Single Tree Rooted on Desktop", die Sie mit Spy ++/GetAncestor/EnumChildWindows/GetWindow (GA_FIRST/NEXT) sehen, und dann die Ansicht "Internals-oriented", bei der jeder HWND einen einzigen Slot hat, der Eltern oder Besitzer ist auf WS_CHILD. – BrendanMcK

23

Besitz ist eine Beziehung zwischen zwei Fenstern der obersten Ebene, während Parent eine Beziehung zwischen einer obersten Ebene und einem WS_CHILD oder einem WS_CHILD und einem anderen WS_CHILD ist.

Das übergeordnete Element einer Schaltfläche ist das Formular, auf dem es sich befindet, während ein Meldungsfeld dem Formular gehört, das es zeigte.

Lesen Sie diesen Artikel von Microsoft Win32 Window Hierarchy and Styles, um ein viel klareres Verständnis von Ownership, Parenting, ZOrder, SetWindowLong, GetWindow und all den anderen scheußlichen Bits der Win32 API zum Erstellen von Fensterbeziehungen zu erhalten.

EDIT: Sieht aus wie Microsoft nahm diesen Inhalt, hier ist eine andere vernünftige summary of Ownership/Parenting.

+3

Bah, MS hat diesen Inhalt genommen. :( –

+3

http://web.archive.org/web/201003180262734/http://msdn.microsoft.com/en-us/library/ms997562.aspx –

0

Chens Blogpost ist derjenige, der zu lesen ist. Der entscheidende Punkt für mich ist, dass der WS_CHILD-Stil im untergeordneten Fenster verwendet werden muss. Sie können versuchen, ein untergeordnetes Fenster zu erstellen und das übergeordnete Handle in CreateWindow() zu übergeben. Wenn Sie jedoch nicht den WS_CHILD-Stil festlegen, haben die beiden Fenster die Eigentümerbeziehung, nicht die Eltern-Kind-Beziehung.