如何在应用程序中始终处于无模式对话框的顶部

时间:2014-08-11 19:58:04

标签: c++ windows visual-c++ mfc

我的应用中有一个无模式弹出对话框。我想只在它所属的应用程序中使它成为最顶层,而不是总是在桌面上最顶层。

我试图将第一个参数设置为wndTopMost,但这样对话框将保留在桌面上,这是非常糟糕的用户体验。

我还尝试过使用SWP_NOZORDER参数的wndNoTopMost,但这只会在显示时将对话框放在前面。如果我将另一个对话框/窗口移动到对话框位置,则该对话框将隐藏在新对话框/窗口下。

我目前在OnInitDialog();

中使用SetWindowPos
   SetWindowPos(&wndNoTopMost
    , myRect.left
    , myRect.top
    , myRect.Width()
    , myRect.Height()
    , SWP_NOACTIVATE | SWP_NOCOPYBITS | SWP_NOZORDER
    );

1 个答案:

答案 0 :(得分:1)

HWND_TOPMOST非常糟糕的用户体验,所以我会赞扬你没有采取简单的方法并尝试翻转此开关。

让对话框显示在其他窗口之上的关键是设置所有者。 (请注意in Win32, an owner is distinct from a parent window,尽管这些术语经常令人困惑。)所有对话框都有一个所有者,对话框始终位于其所有者之上。

因此,当您创建无模式对话框(例如,使用CreateDialog功能)时,请确保将应用程序主窗口的句柄指定为其所有者。令人困惑的是,该参数名为hwndParent,但它实际上指定了所有者窗口。