如何在应用程序中始终使无模式的对话

我的应用程序中有一个无模式的popup对话框。 我只想在它所属的应用程序中将其设置为最高,而不总是在桌面上最高。

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

我也尝试了wndNoTopMost和SWP_NOZORDER参数,但是这只在显示时才把对话框放在前面。 如果我将另一个对话框/窗口移动到对话框位置,对话框将被隐藏在新的对话框/窗口下。

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

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

是的HWND_TOPMOST是一个非常糟糕的用户体验,所以我会推荐你​​不要轻易的出路,试图翻转这个开关。

让对话出现在其他窗口顶部的关键是设置其所有者 。 (请注意, 在Win32中,所有者不同于父窗口 ,虽然这些术语经常令人困惑。)所有对话框都有一个所有者,对话框始终保留在所有者之上。

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