gpt4 book ai didi

c++ - 模态对话框中错误的父 HWND

转载 作者:行者123 更新时间:2023-11-28 01:51:46 31 4
gpt4 key购买 nike

为什么我在此处将桌面作为我的模态对话框的父 HWND?

class CSaveProfileAsDlg:
public CSimpleDialog<IDD_DLG_RESOURCE>
{
....
LRESULT OnInitDialog(UINT, WPARAM, LPARAM, BOOL&)
{
...
HWND parent = GetParent(); // or GetAncestor(m_hWnd, GA_PARENT);
assert(parent != GetDesktopWindow()); // not ok
...
}
....
}


//somewhere in code
//m_hWnd is some valid HWND
assert(m_hWnd != GetDesktopWindow()); //ok
CSaveProfileAsDlg dlg;
dlg.DoModal(m_hWnd /*as a parent wnd*/);

我可以通过在 CSaveProfileAsDlg 构造器中传递正确的 HWND 来“解决”它,但我想要正确的解决方案。

谢谢!

最佳答案

文档非常困惑,但我想我找到了问题所在。 DoModal 内部调用::DialogBox(),其中一个参数采用名为hWndParentHWND。来自documentation :

hWndParent [in, optional]
Type: HWND
A handle to the window that owns the dialog box.

这里的关键词是“拥有”这个词。关于owned windows的部分证实这一点:

Dialog boxes and message boxes are owned windows by default. An application specifies the owner window when calling a function that creates a dialog box or message box.

所以我们实际上谈论的是所有者窗口而不是它的父窗口。这是有道理的,因为对话框是一个自由 float 的窗口,而不是像“ parent 身份”所暗示的那样是窗口层次结构的一部分。

您可以使用以下方法获取所属窗口:

HWND parent = ::GetWindow(m_hWnd, GW_OWNER);

关于c++ - 模态对话框中错误的父 HWND,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42781700/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com