MoveWindow() SetWindowPos()的区别与联系
敲代码时,突然发现有一个背景图片无法显示,百思不得其解,最终发现是MoveWindow() SetWindowPos()这两个函数的使用不当造成的。
这里把这两个函数的前世今生给分析一下。
先看MoveWindow()函数,用于改变窗口的位置和尺寸,对于顶层窗口,按照屏幕对齐与左上角,对于子窗口,则对齐与父窗口的左上角。
BOOL MoveWindow( HWND hWnd,int x, int y, int nWidth, int nHeight,BOOL bRepaint = TRUE);//
第一个表示窗口句柄;
参数x,y表示窗口的左上角起点;
参数nwidth,nHeight 表示窗口高度和宽度;
最后一个bRepaint表示是否立即重绘。为true时系统会立即发送WM_PAINT到窗口程序(会调用UpdateWindow()函数),为false时不会发生任何类型的重绘操作。
MoveWindow会给窗口发送WM_WINDOWPOSCHANGING,WM_WINDOWPOSCHANGED,WM_MOVE,WM_SIZE和WM_NCCALCSIZE消息。
接下来看SetWindowPos(),这个函数同样用来实现窗口移动操作,只不过功能更多一点。
BOOL SetWindowPos(HWND hWnd,const CWnd* pWndInsertAfter, int x, int y,int cx, int cy, UINT nFlags);//
第一个参数是窗口句柄;
第二个参数是窗口的Z order,就是有多个窗口时,本窗口显示的顺序,最上面或者最下面,可选参数有HWND_BOTTOM,HWND_NOTOPMOST,HWND_TOP,HWND_TOPMOST.
HWND_BOTTOM:将窗口置于Z序的底部。如果参数hWnd标识了一个顶层窗口,则窗口失去顶级位置,并且被置在其他窗口的底部。
HWND_NOTOPMOST:将窗口置于所有非顶层窗口之上(即在所有顶层窗口之后)。如果窗口已经是非顶层窗口则该标志不起作用。
HWND_TOP:将窗口置于Z序的顶部。
HWND_TOPMOST:将窗口置于所有非顶层窗口之上。即使窗口未被激活窗口也将保持顶级位置。
接下来四个参数是窗口的位置和尺寸。
最后一个参数nFlags是窗口显示方式的标志,这个参数很多,可以组合使用,详细如下:
SWP_ASNCWINDOWPOS:如果调用进程不拥有窗口,系统会向拥有窗口的线程发出需求。这就防止调用线程在其他线程处理需求的时候发生死锁。
SWP_DEFERERASE:防止产生WM_SYNCPAINT消息。
SWP_DRAWFRAME:在窗口周围画一个边框(定义在窗口类描述中)。
SWP_FRAMECHANGED:给窗口发送WM_NCCALCSIZE消息,即使窗口尺寸没有改变也会发送该消息。如果未指定这个标志,只有在改变了窗口尺寸时才发送WM_NCCALCSIZE。
SWP_HIDEWINDOW;隐藏窗口。
SWP_NOACTIVATE:不激活窗口。如果未设置标志,则窗口被激活,并被设置到其他最高级窗口或非最高级组的顶部(根据参数hWndlnsertAfter设置)。
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:维持当前Z序(忽略hWndlnsertAfter参数)。
SWP_SHOWWINDOW:显示窗口。
注意事项:
使用SetWindowPos()如果设置了SWP_SHOWWINDOWS或者SWP_HIDEWINDOW,那么窗口将不能被移动和改变大小,我使用时就是设置了SWP_SHOWWINDOW,从而导致不能重绘背景。
两者的比较:
两者都能实现移动和改变窗口大小。
MoveWindow()功能比较单一,只能移动和改变窗口大小,而SetWindowPos()可以设置更多的参数,实现Zorder及显示方式标志。
MoveWindow()发送WM_WINDOWPOSCHANGING,WM_WINDOWPOSCHANGED,WM_MOVE,WM_SIZE和WM_NCCALCSIZE等消息到窗口,SetWindowPos()只发送WM_WINDOWPOSCHANGED消息到窗口。所以说如果需要发送更多消息时还是使用MoveWindow()的好。
MoveWindow() SetWindowPos()的区别与联系的更多相关文章
- MoveWindow() SetWindowPos()的区别于联系
敲代码时,突然发现有一个背景图片无法显示,百思不得其解,最终发现是MoveWindow() SetWindowPos()这两个函数的使用不当造成的. 这里把这两个函数的前世今生给分析一下. 先看Mov ...
- WM_PAINT产生原因有2种(用户操作和API)——WM_PAINT和WM_ERASEBKGND产生时的先后顺序不一定(四段讨论)
1. 当WM_PAINT不是由InvalidateRect产生时,即由最大化,最小化等产生时,或者移动产生(移动有时只会产生WM_ERASEBKGND消息)系统先发送WM_ERASEBKGND消息,再 ...
- VC/MFC 编程技巧大总结
1 toolbar默认位图左上角那个点的颜色是透明色,不喜欢的话可以自己改. 2 VC++中 WM_QUERYENDSESSION WM_ENDSESSION 为系统关机消息. 3 Java学习书推荐 ...
- Windows API-----top level window
原文地址: http://blog.163.com/cumt_xl/blog/static/19071504420136911838683/ Q: What is a top-level window ...
- MoveWindow and SetWindowPos
转自:http://blog.sina.com.cn/s/blog_82c346de0100u7kq.html MoveWindow and SetWindowPos (2011-09-14 15:5 ...
- MoveWindow和SetWindowPos
SetWindowPos即使里面使用的是一样的矩形参数,有时候SetWindowPos还是会改变窗口的大小,真是坑爹!!! MoveWindow就不会改变 mark一下
- 除了创建时指定窗口位置之外,还有3种移动窗口位置的办法(移动的同时往往可以改变窗口大小)(SetWindowPos最有用,它有许多标志位)
首先,在创立窗口对象的时候,CreateWindowEx就可以指定窗口的位置.除此之外,还有三种方法可以改变窗口的位置: procedure TWinControl.CreateWindowHandl ...
- SetWindowPos和SetForegroundWindow
There are many closely-related concepts involved, and related terms are often misused, even in the o ...
- SetWindowPos 和Z序
参考文档:http://www.cnblogs.com/findumars/p/3948315.html SetWindowPos(hWnd: HWND; {窗口句柄}hWndInsertAfter: ...
随机推荐
- URL最大长度问题
在http协议中,其实并没有对url长度作出限制,往往url的最大长度和用户浏览器和Web服务器有关,不一样的浏览器,能接受的最大长度往往是不一样的,当然,不一样的Web服务器能够处理的最大长度的UR ...
- 软件License设计
如何保护软件版权,最常用的办法就是设计一套license验证框架. 1.我们的常规需求如下: .可以限制软件只能在一台机器上使用: 目前很多软件都是一机一码的销售,软件换一台机器则不能使用,想要几台机 ...
- Linux、命令ps 各字段意思
参数: -A :所有的进程均显示出来,与 -e 具有同样的效用: -a : 显示现行终端机下的所有进程,包括其他用户的进程: -u :以用户为主的进程状态 : x :通常与 a 这个参数一起使用,可列 ...
- Android商城开发系列(十四)—— 设置监听RecyclerView的位置
在前面的博客中有讲到过点击一个图片按钮控制RecyclerView的滚动到顶部位置的效果,但是那个图片按钮一直处在一个显示的状态,今天我们来改造一下那个地方,我们要实现的效果是:一开始打开的时候看不到 ...
- cesium 加载shp格式的白模建筑
ceisum加载shp格式的建筑.有两种思路,目前推荐第二种. 方法一:将shp格式转换为geojson格式,然后采用cesium提供的接口加载到ceisum中. 严重缺陷:在面对大场景问题,即数据量 ...
- 提升Web性能的8个技巧总结
提升Web性能的8个技巧总结 在互联网盛行的今天,越来越多的在线用户希望得到安全可靠并且快速的访问体验.针对Web网页过于膨胀以及第三脚本蚕食流量等问题,Radware向网站运营人员提出以下改进建议, ...
- 【转】svn图标不显示的解决方案
最近发现svn图标莫名其妙的不显示,其他操作都正常.在网上搜了一些方法. 解决方法一(失败): 升级最新版本,我的本来就是最新版本 解决方法二(失败): 右键->TortoiseSVN-> ...
- linux 硬链接与软链接的区别
硬链接的特点:不添加新文件 不能跨区建立 不能对目录建立 删除源文件硬链接正常访问 ln 源文件 目标链接文件 软连接的特点:会添加新文件 可以跨区建立 可以对目录建立 删除源文件软连接不 ...
- object-detection-crowdai数据处理
import os file=os.listdir('/home/xingyuzhou/object-detection-crowdai') file.sort(key= lambda x:int(x ...
- DLM分布式锁的实现机制
1.AST简介 DLM进程(LMON.LMD)之间的跨实例通信是使用高速互联上的IPC层实现的.为了传递锁资源的状态,DLM使用了异步陷阱(AST),它在操作系统处理程序例程中实现为中断.纯粹主义者可 ...