SetWindowPos(
hWnd: HWND; {窗口句柄}
hWndInsertAfter: HWND; {窗口的 Z 顺序}
X, Y: Integer; {位置}
cx, cy: Integer; {大小}
uFlags: UINT {选项}
):

函数功能:该函数改变一个子窗口,弹出式窗口式顶层窗口的尺寸,位置和Z序。子窗口,弹出式窗口,及顶层窗口根据它们在屏幕上出现的顺序排序、顶层窗口设置的级别最高,并且被设置为Z序的第一个窗口。
函数原型:BOOL SetWindowPos(HWN hWnd,HWND hWndlnsertAfter,int X,int Y,int cx,int cy,UNIT.Flags);
参数:
hWnd:窗口句柄。
hWndlnsertAfter:在z序中的位于被置位的窗口前的窗口句柄。该参数必须为一个窗口句柄,或下列值之一:
HWND_BOTTOM:将窗口置于Z序的底部。如果参数hWnd标识了一个顶层窗口,则窗口失去顶级位置,并且被置在其他窗口的底部。
HWND_DOTTOPMOST:将窗口置于所有非顶层窗口之上(即在所有顶层窗口之后)。如果窗口已经是非顶层窗口则该标志不起作用。
HWND_TOP:将窗口置于Z序的顶部。
HWND_TOPMOST:将窗口置于所有非顶层窗口之上。即使窗口未被激活窗口也将保持顶级位置。

查看该参数的使用方法,请看说明部分。
x:以客户坐标指定窗口新位置的左边界。
Y:以客户坐标指定窗口新位置的顶边界。
cx:以像素指定窗口的新的宽度。
cy:以像素指定窗口的新的高度。

//uFlags 参数可选值:
SWP_NOSIZE = 1; {忽略 cx、cy, 保持大小}
SWP_NOMOVE = 2; {忽略 X、Y, 不改变位置}
SWP_NOZORDER = 4; {忽略 hWndInsertAfter, 保持 Z 顺序}
SWP_NOREDRAW = 8; {不重绘}
SWP_NOACTIVATE = $10; {不激活}
SWP_FRAMECHANGED = $20; {强制发送 WM_NCCALCSIZE 消息, 一般只是在改变大小时才发送此消息}
SWP_SHOWWINDOW = $40; {显示窗口}
SWP_HIDEWINDOW = $80; {隐藏窗口}
SWP_NOCOPYBITS = $100; {丢弃客户区}
SWP_NOOWNERZORDER = $200; {忽略 hWndInsertAfter, 不改变 Z 序列的所有者}
SWP_NOSENDCHANGING = $400; {不发出 WM_WINDOWPOSCHANGING 消息}
SWP_DRAWFRAME = SWP_FRAMECHANGED; {画边框}
SWP_NOREPOSITION = SWP_NOOWNERZORDER;{}
SWP_DEFERERASE = $2000; {防止产生 WM_SYNCPAINT 消息}
SWP_ASYNCWINDOWPOS = $4000; {若调用进程不拥有窗口, 系统会向拥有窗口的线程发出需求}

返回值:如果函数成功,返回值为非零;如果函数失败,返回值为零。若想获得更多错误消息,请调用GetLastError函数。
备注:如果设置了SWP_SHOWWINDOW和SWP_HIDEWINDOW标志,则窗口不能被移动和改变大小。如果使用SetWindowLoog改变了窗口的某些数据,则必须调用函数SetWindowPos来作真正的改变。使用下列的组合标志:SWP_NOMOVEISWP_NOSIZEISWP_FRAMECHANGED。
有两种方法将窗口设为最顶层窗口:一种是将参数hWndlnsertAfter设置为HWND_TOPMOST并确保没有设置SWP_NOZORDER标志;另一种是设置窗口在Z序中的位置以使其在其他存在的窗口之上。当一个窗口被置为最顶层窗口时

注释:

假如指定了SWP_SHOWWINDOW或SWP_HIDEWINDOW,窗口不能被移动或改变大小。 
子窗口的所有坐标都是客户区坐标(相对于父窗口的客户区左上角). 
一个窗口能够成为一个Topmost窗口,可以通过设置hWndInsertAfter参数为HWND_TOPMOST并且保证SWP_NOZORDER标志没有设置,或者通过设置它的窗口在Z轴方向上的位置,以便使它在现存的任何Topmost窗口之上.当一个非Topmost窗口被设置成topmost,那么它拥有的窗口也将成为,然而它的拥有者们没有变。

假如SWP_NOACTIVATE和SWP_NOZORDER标志都没有指定(指当应用程序要求窗口被激活同时改变它在Z轴方向上的位置时),则hWndInsertAfter仅用在以下几种情况: 
1.HWND_TOPMOST和HWND_NOTOPMOST标志在hWndInsertAfter中都没有指定. 
2.hWnd句柄指定的窗口不是活动窗口.

如果一个应用程序不把一个非活动窗口调整到Z轴方向顶部,则不能激活非活动窗口。应用程序能够没有限制地改变一个活动窗口在Z轴方向上的位置,它能够激活一个窗口并且把它移动到topmost或者非topmost窗口的顶部。 
假如一个topmost窗口被重定位到Z轴方向上最下面(HWND_BOTTOM),或者在任何非topmost窗口后面,那么它不在是topmost窗口.当一个Topmost窗口变成非topmost窗口时,它的拥有者和它拥有的窗口也都将成为非topmost窗口.

一个非Topmost窗口能够拥有一个Topmost窗口,但是反过来不行.任何窗口(例如:一个对话框)被一个Topmost窗口拥有,同时它使也自己成为一个Topmost窗口,要保证所有被拥有的窗口处在它们的拥有者的上面。
假如一个应用程序没有在前台,但是要成为前台程序,它应该调用SetForegroundWindow函数.

个人总结有以下几点要注意:

来源:http://www.cppblog.com/zaccheo/archive/2012/08/24/188156.aspx

1. 当 SetWindowPos  的 nFlags 参数设置的有 SWP_SHOWWINDOW 或 SWP_HIDEWINDOW 时 设置窗口ZOrder的hWndInsertAfter参数和设置大小位置的x,y,cx,cy无效。这个在msdn中有特别的说明

2.当设置窗口置顶时实际上SetWindowPos 是通过给窗口增加 WS_EX_TOPMOST 扩展样式来实现的。而 WS_EX_TOPMOST 的扩展样式是只能设置到顶层窗口的(top level window)。这意味者对子窗口(具有 ws_child风格)的窗口调用下面的代码是无效的,但悲剧的是这个调用的返回值仍然是 true。

VC++:SetWindowPos相关推荐

  1. C语言实现半波全宽算法,VC++:无限细半波振子的辐射阻抗(感应电动势法)

    已结贴√ 问题点数:20 回复次数:2 VC++:无限细半波振子的辐射阻抗(感应电动势法) //无限细半波振子间的互阻抗(经典结果) #include #include #include #defin ...

  2. 将窗口置顶的方法:SetWindowPos、AttachThreadInput、SwitchToThisWindow

    将窗口置顶的方法:SetWindowPos.AttachThreadInput.SwitchToThisWindow [转]http://hi.baidu.com/neil_danky/item/f9 ...

  3. VC++:菜单的使用总结

    菜单是windows应用程序经常使用的资源之一.从今天开始,把有关菜单的创建及使用等各方面的基本用法总结到一起,算是做个笔记吧!准备一天写一点,陆陆续续完成! 一.菜单的创建: (一)VC++菜单通过 ...

  4. VC:其他控件(CProgressCtrl、CScrollBar、CDateTimeCtrl、CMonthCalCtrl)

    1.进度条 m_progressCtrl.SetRange(0,100); for(int i=0;i<100;i++) { m_progressCtrl.SetPos(i); Sleep(10 ...

  5. 硅谷顶级VC:“S曲线”看四大风口,创企成功机会巨大

    来源:全球技术地图 新技术走入产业应用阶段,在完成了前期基础的试水后,大企业往往以雄厚的资本实力.强大的人才团队和广阔的市场资源,迅速占领新技术高地.那么顺应新技术而诞生的创业企业,还是否有打造成功企 ...

  6. VC:隐藏CTabCtrl标签按钮

    目标:实现隐藏CTabCtrl 标签按钮,而通过一个下拉框或者菜单来实现CTabCtrl标签页面切换.使之看起来像个单个对话框页面,而事实上是CTabCtrl. 有人可能觉得这是不是有点BT,其实,我 ...

  7. VC :在对话框中绘图

    主要代码如下: 显示代码如下: CDC * pDialogDC = GetDC(); Invalidate(); UpdateWindow(); CPen pen(PS_SOLID,2,RGB(255 ...

  8. VC++:编写画硬币程序

    画硬币 建立菜单栏:增加硬币和减少硬币 (1).创建DrawCoin应用程序 (2).ResourceView->Menu->IDR_MAINFRAME(双击)->菜单栏右边虚线框( ...

  9. 好文推荐:强悍VC:谍影迷踪

    据我的了解,老牌投资机构拥有的不止是人脉,更重要的是情报体系,数据公司.媒介关系.舆情监控.内部人情报,构成复杂而高效.相互校验的情报体系,这个情报体系所提供信息会支持投资机构做从项目筛选与调查到投资 ...

最新文章

  1. Linux忘记密码常用的几种解决方法
  2. Burt’s Bees 小蜜蜂纯天然杏仁牛奶蜂蜡护手霜,56g*2罐,$13.92
  3. mysql 存储过程 主键_存储过程生成主键
  4. MySQL - 索引下推 Index Condition Pushdown 初探
  5. 全国计算机等级考试题库二级C操作题100套(第55套)
  6. mysql什么是长事务
  7. (计算机组成原理)第七章输入和输出系统-第一节:I/O系统基本概念和I/O控制方式简介
  8. Responsive Web Design 简单介绍与优缺点、实作入门, 响应式设计
  9. html自动生成工具_「写论文神器」一个好用的论文自动生成工具,内含30w 文献数据...
  10. 嘿,我造了个代码高亮的插件
  11. CRM给B2B企业带来的影响
  12. (一)计网五层模型概述
  13. Python渗透测试之Scapy模块情报收集
  14. 基于OpenCV的人脸识别签到系统
  15. 20190904携程机试
  16. 报告预测,到2050年将有超过10亿人流离失所
  17. u深度重装系统详细教程_u深度u盘启动盘安装win7详细步骤
  18. 【美团技术团队】2014年-2022年后端文章精选篇
  19. Capture One 22 最新推出全景拼接功能
  20. 升级macos beta_Big Sur Beta:开发人员意见以及为何对macOS的未来感到担忧

热门文章

  1. uniapp通过url带参数传值
  2. RTKLIB学习总结(七)GNSS观测量、Rinex文件读取
  3. 心通达OA 实现APP扫码登录过程
  4. marquee 和JS 滚动效果
  5. 大型互联网公司Nginx通关秘籍
  6. 明天就是5.20,这几个c语言表白代码发给你喜欢的女生,要是还没有女朋友直接来找我!!!
  7. sql配置管理器服务是空的_教你搭建一个属于自己的游戏服务器--龙武
  8. 如何使用Matlab画图
  9. MySQL连接查询-笛卡尔乘积
  10. QQmusic imitations record 第二天