【问题标题】:How to make a modeless dialog always on top within the app如何在应用程序中使无模式对话框始终位于顶部
【发布时间】:2014-10-04 18:11:33
【问题描述】:

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

我尝试将第一个参数设置为wndTopMost,但是这样对话框会一直停留在桌面上,用户体验很差。

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

我目前在 OnInitDialog() 中使用 SetWindowPos;

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

【问题讨论】:

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


    【解决方案1】:

    是的HWND_TOPMOST 是一个非常糟糕的用户体验,所以我会赞扬你没有采取简单的方法并试图打开这个开关。

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

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

    【讨论】:

    • 这并没有解决这个问题:如果应用程序有两个(或更多)无模式对话框(属于同一个窗口),则用户与之交互的最后一个对话框将位于同级对话框的前面。但是,考虑到这一点,解决方案会导致一种情况,即用户可以将正在与之交互的对话框隐藏在另一个对话框后面。这听起来本身就是一个有问题的设计决定。
    • 感谢您的回答。所以基本上我想让这个弹出对话框成为应用程序中最顶层的通知。创建此无模式对话框时,我尝试将应用程序的 MainFrame 设置为所有者窗口。但是我的应用是 MDI,当另一个窗口被激活时,它仍然可以覆盖我的通知弹出对话框。
    • 如果对话框在另一个线程中,设置窗口所有者会产生后果,它会隐式附加这些窗口所属线程的输入队列。
    猜你喜欢
    • 2013-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-26
    • 1970-01-01
    • 2014-07-31
    相关资源
    最近更新 更多