使聚焦的无模式对话框最顶层
Make focused modeless dialog topmost
所以我的主对话框通过这个函数调用无模式对话框(这是项目上的遗留代码):
void MyClass::ShowDialog(CDialog* dialog)
{
if (!IsWindow(dialog->m_hWnd))
{
return;
}
int nCmdshow1 = dialog->IsWindowVisible() ? SW_HIDE : SW_SHOW;
dialog->ShowWindow( nCmdshow1 );
}
问题:所有子对话框都位于我的主对话框之上。
期望的行为:以哪个为重点(它们都是无模式的),无论是主对话框还是子对话框,我都希望它成为最顶层的对话框。谢谢!
注意:我已经在主对话框的 OnInitDialog()
上尝试过这些但没有用:
1. SetWindowPos(&this->wndTop,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);
2.SetWindowPos(&this->wndTopMost,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);
编辑
此外,子对话框是这样创建的:
m_subDlg1->Create( SubDlg1::IDD, this );
只要两者之间存在所有者关系windows。 window 的所有者永远不能位于拥有的 window.
之上
Windows 在所有者、父子关系中始终表现相同。 owned/child window 总是在 parent/owner.
之上
如果你想打破这个,你必须打破owner/child关系。让所有对话框 windows 都没有所有者...而不是它们可以自由浮动。
但是:我预计你的程序不会表现得更好。甚至更糟。用户可能会搜索 windows 中其他 windows 所涵盖的内容。当您的程序启动时,他们永远不会排在前面。
See the description about parent/child/owned windows here. Also this article 可能会有帮助。
编辑: 问题是如果没有给定父级,MFC 在内部将主 window 设置为所有者。只有对 BOOL Wnd::CreateDlgIndirect(LPCDLGTEMPLATE lpDialogTemplate, CWnd* pParentWnd, HINSTANCE hInst)
的调用允许保留 pParentWnd NULL。
因此您可以正常创建 window,但在创建后使用 SetParent(NULL)。 MFC 再次断言这一点。因此,您可以使用 API 函数和对话框的句柄。
所以我的主对话框通过这个函数调用无模式对话框(这是项目上的遗留代码):
void MyClass::ShowDialog(CDialog* dialog)
{
if (!IsWindow(dialog->m_hWnd))
{
return;
}
int nCmdshow1 = dialog->IsWindowVisible() ? SW_HIDE : SW_SHOW;
dialog->ShowWindow( nCmdshow1 );
}
问题:所有子对话框都位于我的主对话框之上。
期望的行为:以哪个为重点(它们都是无模式的),无论是主对话框还是子对话框,我都希望它成为最顶层的对话框。谢谢!
注意:我已经在主对话框的 OnInitDialog()
上尝试过这些但没有用:
1. SetWindowPos(&this->wndTop,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);
2.SetWindowPos(&this->wndTopMost,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);
编辑
此外,子对话框是这样创建的:
m_subDlg1->Create( SubDlg1::IDD, this );
只要两者之间存在所有者关系windows。 window 的所有者永远不能位于拥有的 window.
之上Windows 在所有者、父子关系中始终表现相同。 owned/child window 总是在 parent/owner.
之上如果你想打破这个,你必须打破owner/child关系。让所有对话框 windows 都没有所有者...而不是它们可以自由浮动。
但是:我预计你的程序不会表现得更好。甚至更糟。用户可能会搜索 windows 中其他 windows 所涵盖的内容。当您的程序启动时,他们永远不会排在前面。
See the description about parent/child/owned windows here. Also this article 可能会有帮助。
编辑: 问题是如果没有给定父级,MFC 在内部将主 window 设置为所有者。只有对 BOOL Wnd::CreateDlgIndirect(LPCDLGTEMPLATE lpDialogTemplate, CWnd* pParentWnd, HINSTANCE hInst)
的调用允许保留 pParentWnd NULL。
因此您可以正常创建 window,但在创建后使用 SetParent(NULL)。 MFC 再次断言这一点。因此,您可以使用 API 函数和对话框的句柄。