在我的原生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
当父母不知道其孩子时,孩子如何知道其父母?
答案 0 :(得分:3)
GetWindow
的 GW_CHILD
显然不会检索后代窗口,只检索子窗口。来自MSDN:
检索到的句柄识别 Z顶部的儿童窗口 如果指定的窗口是a,则为order 父窗口;否则, 检索到的句柄为NULL。功能 只审查儿童窗户 指定的窗口。它没有检查 后代窗户
孩子和后代有什么区别?我不知道,EnumChildWindows
可能会得到你所需要的东西。
答案 1 :(得分:0)
窗口是子窗口(具有WS_CHILD样式)或是顶级窗口。
顶级窗口没有父窗口,但它们可能有一个所有者窗口。子窗口有父级,但没有所有者。
GetParent()函数返回子窗口的父级或顶级窗口的所有者。因此,它被错误命名 - 它应该被称为GetParentOrOwner()。
所以发生的事情是你从GetParent()获得顶级窗口的所有者,但由于它实际上并不是父级,因此hDlgWnd不是hMainWnd的孩子。