VS2015 VC++将窗体保持置顶的办法

本方法适用于VS2015或之后的版本,不适用于VC++ 6.0。通过重载OnInitDialog()函数,调用SetWindowPos()函数,利用CWnd::SetWindowPos改变窗口的Z顺序,实现窗口置顶。参数pWndInsertAfter、x、y、cx、cy、nFlags等决定了窗口的位置、大小和Z顺序。当窗口设为最顶层时,即使被停用也会保持最靠前的位置。
部署运行你感兴趣的模型镜像

注意:本方法适用于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);
}

您可能感兴趣的与本文相关的镜像

GPT-SoVITS

GPT-SoVITS

AI应用

GPT-SoVITS 是一个开源的文本到语音(TTS)和语音转换模型,它结合了 GPT 的生成能力和 SoVITS 的语音转换技术。该项目以其强大的声音克隆能力而闻名,仅需少量语音样本(如5秒)即可实现高质量的即时语音合成,也可通过更长的音频(如1分钟)进行微调以获得更逼真的效果

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值