web-dev-qa-db-fra.com

Propriétaire de fenêtre Win32 vs parent de fenêtre?

Dans la programmation Win32, quelle est la différence entre le parent d'une fenêtre et le propriétaire d'une fenêtre? Je pensais l'avoir compris, puis je suis tombé sur ce code:

SetWindowLong(handle, GWL_HWNDPARENT, foo);

Cela définit en fait le propriétaire de la fenêtre, pas le parent - malgré l'utilisation de GWL_HWNDPARENT. Les termes parent/propriétaire sont-ils interchangeables ou existe-t-il réellement une différence?

50
Jon Tackabury

Le propriétaire est la fenêtre * responsable d'un contrôle ou d'une boîte de dialogue (par exemple, responsable de la création/destruction de la fenêtre).

Le parent est la fenêtre supérieure suivante * d'un contrôle ou d'une boîte de dialogue dans la chaîne de fenêtres, mais il n'en est pas réellement responsable (ne se soucie pas nécessairement de son cycle de vie, etc.). Le parent d'une fenêtre peut également être son propriétaire.

* Window vs window: Window est une fenêtre réelle affichée à l'écran; fenêtre est tout objet avec un HWND (comprend des boutons, des panneaux, etc.).

19
TheSmurf

La propriété est une relation entre deux fenêtres de niveau supérieur tandis que Parent est une relation entre un niveau supérieur et un WS_CHILD, ou un WS_CHILD et un autre WS_CHILD.

Le parent d'un bouton est le formulaire sur lequel il se trouve, tandis qu'une boîte de message appartient au formulaire qui l'a montré.

Lisez cet article de Microsoft Win32 Window Hierarchy and Styles pour obtenir une compréhension beaucoup plus claire de la propriété, de la parentalité, de ZOrder, de SetWindowLong, de GetWindow et de tous les autres éléments désagréables de l'API Win32 pour créer des relations de fenêtre.

EDIT: On dirait que Microsoft a supprimé ce contenu, voici un autre raisonnable résumé de la propriété/parentalité .

27
Maurice Flanagan

Le billet de blog de Chen est celui à lire. Le point clé pour moi est que le style WS_CHILD doit être utilisé sur la fenêtre enfant. Vous pouvez essayer de créer une fenêtre enfant et passer le handle parent à CreateWindow (), mais si vous n'avez pas le style WS_CHILD défini, les deux fenêtres auront la relation propriétaire, pas la relation parent/enfant.

1
osullivj