注意:本方法适用于VS2015或之后版本,不适用于VC++ 6.0版本,其它版本未验证。
办法
重载OnInitDialog()函数,在该函数中调用:
SetWindowPos(&wndTopMost, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
MSDN中对SetWindowPos()函数的说明
CWnd::SetWindowPos
更改子窗口、弹出窗口和顶级窗口的大小、位置和 Z 顺序。
BOOL SetWindowPos(
const CWnd* pWndInsertAfter,
int x,
int y,
int cx,
int cy,
UINT nFlags);
参数
pWndInsertAfter
标识将在 Z 顺序中位于此对象之前(高于CWnd此对象)的对象。CWnd 此参数可以是指向的指针CWnd ,也可以是指向以下值之一的指针:
- wndBottom将窗口置于 Z 顺序的底部。 如果这CWnd是最顶层的窗口,则窗口将失去其最靠前的状态; 系统会将窗口置于所有其他窗口的底部。
- wndTop将窗口置于 Z 顺序的顶部。
- wndTopMost将窗口置于所有不最靠前的窗口之上。 即使停用窗口,该窗口仍保持其最顶部的位置。
- wndNoTopMost将窗口重新定位到所有非最靠后窗口的顶部(即,在所有最顶层的窗口后面)。 如果窗口已经是不最顶端的窗口,则此标志不起作用。
有关如何使用此参数的规则,请参阅本主题的 “备注” 部分。
x
指定窗口左侧的新位置。
y
指定窗口顶部的新位置。
cx
指定窗口的新宽度。
cy
指定窗口的新高度。
nFlags
指定大小调整和定位选项。 此参数可以是以下标志的组合:
- SWP_DRAWFRAME 在窗口周围绘制一帧(在创建窗口时定义)。
- SWP_FRAMECHANGED 会将 WM_NCCALCSIZE 消息发送到窗口,即使窗口的大小没有被更改也是如此。 如果未指定此标志,则仅当更改窗口的大小时,才会发送 WM_NCCALCSIZE。
- SWP_HIDEWINDOW 隐藏窗口。
- SWP_NOACTIVATE 不会激活窗口。 如果未设置此标志,则将激活窗口并将其移动到最顶层或非最顶层的组(具体取决于pWndInsertAfter参数的设置)。
- SWP_NOCOPYBITS 丢弃工作区的全部内容。 如果未指定此标志,则在调整窗口大小或重新定位窗口后,将保存工作区的有效内容,并将其复制回工作区。
- SWP_NOMOVE 保留当前位置(忽略x和y参数)。
- SWP_NOOWNERZORDER 不会更改所有者窗口在 Z 顺序中的位置。
- SWP_NOREDRAW 不重绘更改。 如果设置了此标志,则不会进行任何类型的重画。 这适用于工作区、非工作区(包括标题和滚动条)以及被移动窗口导致的父窗口的任何部分。 设置此标志后,应用程序必须显式失效或重绘必须重绘的窗口和父窗口的任何部分。
- SWP_NOREPOSITION 与 SWP_NOOWNERZORDER 相同。
- SWP_NOSENDCHANGING 阻止窗口收到 WM_WINDOWPOSCHANGING 消息。
- SWP_NOSIZE 保留当前大小(忽略cx和cy参数)。
- SWP_NOZORDER 保留当前排序(忽略pWndInsertAfter)。
- SWP_SHOWWINDOW 显示窗口。
返回值
如果函数成功,则为非零值;否则为0。
备注
Windows 根据其 Z 顺序在屏幕上进行排序;位于 Z 顺序顶部的窗口将显示在顺序中所有其他窗口的顶部。
子窗口的所有坐标都是工作区坐标(相对于父窗口的工作区的左上角)。
可以通过将pWndInsertAfter参数设置为 & wndTopMost ,并确保不设置 SWP_NOZORDER 标志,或者通过设置窗口的 Z 顺序使其高于任何现有的最顶层窗口,来将窗口移到 Z 顺序的顶部。 当非最顶部的窗口最顶层时,还会使其拥有的窗口最顶层。 不会更改其所有者。
如果最顶部的窗口重新定位到 Z 顺序的底部( & wndBottom)或在任何非最顶端窗口之后,则该窗口将不再最顶层。 当最顶部的窗口不是最顶端时,其所有所有者及其拥有的窗口也会成为非最顶层的窗口。
如果未指定 SWP_NOACTIVATE 和 SWP_NOZORDER (即,当应用程序请求同时激活窗口并按指定 Z 顺序排列)时,在pWndInsertAfter中指定的值仅用于以下情况下
PWndInsertAfter参数中未指定 & WndTopMost和 & wndNoTopMost 。
此窗口不是活动窗口。
应用程序无法激活非活动窗口,也不会将其带到 Z 顺序的顶部。 应用程序可以不受限制地更改已激活窗口的 Z 顺序。
不最顶部的窗口可能拥有最顶层的窗口,但反之则不然。 由最顶层窗口拥有的任何窗口(例如,对话框)本身都是一种最顶部的窗口,以确保所有拥有的窗口保持在其所有者之上。
对于 Windows 版本3.1 及更高版本,可以通过设置 WS_EX_TOPMOST 样式,将窗口移到 Z 顺序的顶层并锁定。 即使在停用后,这种最顶部的窗口仍保持最顶端的位置。 例如,选择 WinHelp Always On Top 命令会使 “帮助” 窗口最顶层,然后在返回到应用程序时保持可见。
若要创建最顶层窗口, SetWindowPos请使用等于 & wndTopMost的pWndInsertAfter参数调用,或在创建窗口时设置 WS_EX_TOPMOST 样式。
如果 Z 顺序包含具有 WS_EX_TOPMOST 样式的任何窗口,则使用 & wndTopMost值移动的窗口将置于所有非最顶端窗口的顶部,但在所有最顶层窗口的下面。 当应用程序激活不具有 WS_EX_TOPMOST 位的非活动窗口时,窗口将移动到所有非最顶层窗口之上,但在任何最顶层窗口的下面。
如果SetWindowPos在pWndInsertAfter参数 & wndBottom时调用,并且CWnd是最顶层的窗口,则窗口将失去其最靠前的状态(“WS_EX_TOPMOST” 将被清除),系统会将该窗口放在Z 顺序。
示例
void CMyApp::OnHideApplication()
{
//m_pMainWnd is the main application window, a member of CMyApp
ASSERT_VALID(m_pMainWnd);
// hide the application's windows before closing all the documents
m_pMainWnd->ShowWindow(SW_HIDE);
m_pMainWnd->ShowOwnedPopups(FALSE);
// put the window at the bottom of z-order, so it isn't activated
m_pMainWnd->SetWindowPos(&CWnd::wndBottom, 0, 0, 0, 0,
SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
}
本方法适用于VS2015或之后的版本,不适用于VC++ 6.0。通过重载OnInitDialog()函数,调用SetWindowPos()函数,利用CWnd::SetWindowPos改变窗口的Z顺序,实现窗口置顶。参数pWndInsertAfter、x、y、cx、cy、nFlags等决定了窗口的位置、大小和Z顺序。当窗口设为最顶层时,即使被停用也会保持最靠前的位置。
3024

被折叠的 条评论
为什么被折叠?



