什么会导致父窗口不知道它有一个子对话框?

时间:2009-05-21 01:50:31

标签: c++ windows windows-mobile

在我的原生Windows移动应用程序中,我有一个窗口可以创建一个对话框。让我说我的窗口句柄是hMainWnd

我使用DialogBoxParam()创建对话框并传入hMainWnd作为对话框的父级:

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

假设对话框的句柄是hDlgWnd。在对话框中,GetParent()按预期返回hMainWnd

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

这是奇怪的事情,调用GetWindow()来查找hMainWnd的孩子返回NULL,表示它没有孩子。我希望函数返回hDlgWnd

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

当父母不知道其孩子时,孩子如何知道其父母?

2 个答案:

答案 0 :(得分:3)

带有GetWindow

GW_CHILD显然不会检索后代窗口,只检索子窗口。来自MSDN

  

检索到的句柄识别   Z顶部的儿童窗口   如果指定的窗口是a,则为order   父窗口;否则,   检索到的句柄为NULL。功能   只审查儿童窗户   指定的窗口。它没有检查   后代窗户

孩子和后代有什么区别?我不知道,EnumChildWindows可能会得到你所需要的东西。

答案 1 :(得分:0)

窗口是子窗口(具有WS_CHILD样式)或是顶级窗口。

顶级窗口没有父窗口,但它们可能有一个所有者窗口。子窗口有父级,但没有所有者。

GetParent()函数返回子窗口的父级或顶级窗口的所有者。因此,它被错误命名 - 它应该被称为GetParentOrOwner()。

所以发生的事情是你从GetParent()获得顶级窗口的所有者,但由于它实际上并不是父级,因此hDlgWnd不是hMainWnd的孩子。