1

所以我有我的主对话框,通过这个函数调用无模式对话框(这是项目中的遗留代码):

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 );

4

1 回答 1

0

只要两个窗口之间存在所有者关系。窗口的所有者永远不能在拥有的窗口之上。

所有者、父、子关系中的 Windows 始终表现相同。拥有/子窗口始终位于父/所有者之上。

如果你想打破这个,你必须打破所有者/孩子的关系。让所有对话窗口都没有所有者......比它们可以自由浮动。

但是:我希望你的程序不会表现得更好。更糟。用户可能会搜索位于其他窗口下方的窗口。当您的程序启动时,他们永远不会领先。

在此处查看有关父/子/拥有窗口的描述。这篇文章也可能会有所帮助。

编辑:问题是如果没有给出父窗口,MFC 在内部将主窗口设置为所有者。只有调用BOOL Wnd::CreateDlgIndirect(LPCDLGTEMPLATE lpDialogTemplate, CWnd* pParentWnd, HINSTANCE hInst)允许将 pParentWnd 保留为 NULL。

因此,您可以照常创建窗口,但在创建后使用 SetParent(NULL)。MFC 再次断言这一点。因此,您可以使用 API 函数和对话框句柄。

于 2017-09-26T06:53:07.960 回答