【问题标题】:What would cause a parent window to not know that it had a child dialog?什么会导致父窗口不知道它有一个子对话框?
【发布时间】:2010-10-27 19:47:40
【问题描述】:

在我的原生 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

父母不认识自己的孩子,孩子怎么知道自己的父母?

【问题讨论】:

    标签: c++ windows windows-mobile


    【解决方案1】:

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

    检索到的句柄标识 Z 顶部的子窗口 顺序,如果指定的窗口是 父窗口;否则, 检索到的句柄为 NULL。功能 仅检查 指定的窗口。它不检查 后代窗口

    孩子和后代有什么区别?我不知道,但EnumChildWindows 可能会满足您的需求。

    【讨论】:

    • 抱歉,WS_CHILD 打错了。我已经修复它并试图澄清这个问题。我做得怎么样?
    【解决方案2】:

    一个窗口要么是一个子窗口(具有 WS_CHILD 样式),要么是一个顶级窗口。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-06
      • 2011-07-11
      • 1970-01-01
      相关资源
      最近更新 更多