2009-05-21 5 views
0

Dans mon application mobile Windows native, j'ai une fenêtre qui crée un dialogue. Disons que ma poignée de fenêtre est hMainWnd.Qu'est-ce qui provoquerait une fenêtre parent à ne pas savoir qu'elle avait une boîte de dialogue enfant?

je crée le dialogue en utilisant DialogBoxParam() et passant hMainWnd en tant que parent de la boîte de dialogue:

DialogBoxParam(_,_,hMainWnd,_,_); 

Disons que la poignée de la boîte de dialogue est hDlgWnd. À partir de la boîte de dialogue, GetParent() retourne hMainWnd comme prévu:

//We're inside the dialog created above 
HWND hParent = GetParent(hDlgWnd); //hParent == hMainWnd 

est ici la chose étrange, appelant GetWindow() pour trouver les enfants de hMainWnd retours NULL, ce qui signifie qu'il n'a pas d'enfant. Je me attends à ce que la fonction renvoie hDlgWnd

//We're inside the main window  
HWND hChild = GetWindow(hMainWnd, GW_CHILD); //hChild == NULL 

Comment un enfant peut connaître son parent lorsque le parent ne connaît pas son enfant?

Répondre

3

GetWindow avec GW_CHILD apparemment ne récupère pas les fenêtres descendantes, seulement les fenêtres enfants. De MSDN:

La poignée extraite identifie la fenêtre enfant au sommet de l'ordre Z , si la fenêtre spécifiée est une fenêtre parent ; sinon, le handle récupéré est NULL. La fonction examine uniquement les fenêtres enfants de la fenêtre spécifiée . Il n'examine pas fenêtres descendantes

Quelle est la différence entre un enfant et un descendant? Je ne sais pas mais EnumChildWindows pourrait vous obtenir ce dont vous avez besoin.

+0

Désolé, WS_CHILD était une faute de frappe. Je l'ai réparé et j'ai tenté de clarifier la question. Comment je fais? –

+0

+1 de moi. EnumChildWindows() est ce que vous voulez. –

0

Une fenêtre est soit une fenêtre enfant (de style WS_CHILD), soit une fenêtre de niveau supérieur.

Les fenêtres de niveau supérieur n'ont pas de fenêtre parent, mais elles peuvent avoir une fenêtre propriétaire. Les fenêtres enfants ont un parent, mais pas de propriétaire.

La fonction GetParent() renvoie le parent d'une fenêtre enfant ou le propriétaire d'une fenêtre de niveau supérieur. Par conséquent, il est mal nommé - il devrait être appelé GetParentOrOwner(). Donc, ce qui se passe est que vous obtenez le propriétaire de votre fenêtre de haut niveau de GetParent(), mais comme ce n'est pas réellement le parent, hDlgWnd n'est pas l'enfant de hMainWnd.

Questions connexes