56 votes

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 avoir trouvé la réponse, puis je suis tombé sur ce code :

SetWindowLong(handle, GWL_HWNDPARENT, foo);

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

0 votes

Expliqué en détail sur msdn

0 votes

0 votes

Mise à jour de l'URL de l'article de Raymond Chen : devblogs.microsoft.com/oldnewthing/20100315-00/?p=14613

30voto

Maurice Flanagan Points 2950

La propriété est une relation entre deux fenêtres de niveau supérieur tandis que le 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 affichée.

Lire cet article de Microsoft Hiérarchie et styles de fenêtres Win32 pour avoir une compréhension beaucoup plus claire de Ownership, Parenting, ZOrder, SetWindowLong, GetWindow et de tous les autres bits méchants de l'api Win32 pour créer des relations de fenêtre.

EDIT : On dirait que Microsoft a retiré ce contenu, voici un autre raisonnable résumé de la propriété / du rôle parental .

4 votes

Bah, MS a supprimé ce contenu. :(

5 votes

20voto

TheSmurf Points 10872

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

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

*Fenêtre contre fenêtre : La fenêtre est une fenêtre réelle affichée à l'écran ; la fenêtre est tout objet avec un HWND (y compris les boutons, les panneaux, etc.).

4 votes

Merci également pour le conseil sur les fenêtres - parfois ces choses sont un peu confuses lorsqu'on essaie de discuter avec d'autres personnes.

38 votes

Ce n'est pas correct. Une fenêtre peut avoir un parent ou un propriétaire mais pas les deux.

4 votes

Raymond, je pense qu'une partie de la confusion vient du fait que Spy++ et GetAncestor(GA_PARENT) retourneront une 'fenêtre suivante un niveau plus haut dans l'arbre HWND' même pour les HWNDs possédés au niveau supérieur, donc familièrement parlant, ils ont un 'parent', même si ce n'est pas suivi de cette façon en interne. Il y a essentiellement deux façons de voir l'arbre des HWND ; la vue naïve "arbre unique enraciné dans le bureau" que vous voyez avec Spy++ / GetAncestor / EnumChildWindows / GetWindow(GA_FIRST/NEXT), et puis la vue "orientée interne", où chaque HWND a un seul slot qui est soit parent soit propriétaire en fonction de WS_CHILD.

12voto

Uli Gerhardt Points 9321

4voto

Danra Points 2586

Expliqué en détail sur msdn

1voto

osullivj Points 11

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X