代码之家  ›  专栏  ›  技术社区  ›  Alan Gorsuch

使聚焦无模式对话框位于最顶端

  •  1
  • Alan Gorsuch  · 技术社区  · 9 年前

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

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

    1 回复  |  直到 9 年前
        1
  •  0
  •   xMRi    9 年前

    只要两个窗口之间存在所有者关系。窗口的所有者永远不能位于所属窗口的顶部。

    所有者、父对象、子对象关系中的窗口的行为始终相同。所有者/子窗口始终位于父/所有者的顶部。

    如果你想打破这一点,你必须打破所有者/子关系。让所有对话框窗口都没有所有者。。。它们可以自由漂浮。

    但是:我希望you程序不会表现得更好。更糟糕的是。用户可以搜索位于其他窗口下方较深的窗口。当你的程序变得活跃时,他们永远不会领先。

    See the description about parent/child/owned windows here . 还有这个 article 可能会有帮助。

    编辑: BOOL Wnd::CreateDlgIndirect(LPCDLGTEMPLATE lpDialogTemplate, CWnd* pParentWnd, HINSTANCE hInst) 允许将pParentWnd保留为NULL。

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

    推荐文章