使聚焦的无模式对话框最顶层

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 函数和对话框的句柄。