Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在应用程序中使无模式对话框始终位于顶部_C++_Windows_Visual C++_Mfc - Fatal编程技术网

C++ 如何在应用程序中使无模式对话框始终位于顶部

C++ 如何在应用程序中使无模式对话框始终位于顶部,c++,windows,visual-c++,mfc,C++,Windows,Visual C++,Mfc,我的应用程序中有一个非模态弹出对话框。我想让它只在它所属的应用程序中处于最顶端,而不总是在桌面上处于最顶端 我尝试将第一个参数设置为wndTopMost,但这样对话框将保持在桌面的顶部,这是非常糟糕的用户体验 我也尝试过使用SWP_NOZORDER参数wndNoTopMost,但这只是在显示对话框时将其放在前面。如果我将另一个对话框/窗口移动到对话框位置,该对话框将隐藏在新对话框/窗口下 我目前正在使用OnInitDialog()中的SetWindowPos 是的,HWND\u TOPMOST是

我的应用程序中有一个非模态弹出对话框。我想让它只在它所属的应用程序中处于最顶端,而不总是在桌面上处于最顶端

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

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

我目前正在使用OnInitDialog()中的SetWindowPos


是的,
HWND\u TOPMOST
是一种非常糟糕的用户体验,因此我建议您不要采取简单的方法并尝试翻转此开关

使对话框显示在其他窗口顶部的关键是设置其所有者。(注意,尽管术语常常令人困惑。)所有对话框都有一个所有者,并且对话框始终位于其所有者之上


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

这并没有解决问题:如果应用程序有两个(或更多)非模态对话框(属于同一窗口),则与用户交互的最后一个对话框将位于同级对话框前面。但是,仔细考虑一下,一个解决方案会导致这样一种情况,用户可以将他们正在交互的对话框隐藏在另一个对话框后面。这听起来像是一个值得怀疑的设计决定。谢谢你的回答。所以基本上我想让这个弹出对话框成为应用程序中最重要的通知。在创建此无模式对话框时,我尝试将应用程序的大型机设置为所有者窗口。然而,我的应用程序是一个MDI,当另一个窗口被激活时,它仍然可以覆盖我的通知弹出对话框。如果对话框位于另一个线程中,则设置窗口所有者会产生后果,它会隐式附加这些窗口所属线程的输入队列。
   SetWindowPos(&wndNoTopMost
    , myRect.left
    , myRect.top
    , myRect.Width()
    , myRect.Height()
    , SWP_NOACTIVATE | SWP_NOCOPYBITS | SWP_NOZORDER
    );