SetWindowPos

来源:互联网 发布:淘宝网官网首页电脑版 编辑:程序博客网 时间:2024/04/30 13:19

 函数原型:

 

BOOL SetWindowPos(

  HWND hWnd,                     // handle to window  (i)

  HWND hWndInsertAfter,     // placement-order handle  (i)

  int X,                                  // horizontal position  (i)

  int Y,                                   // vertical position  (i)

  int cx,                                 // width  (i)

  int cy,                                 // height  (i)

  UINT uFlags                       // window-positioning flags  (i)

);

 

函数功能:

 

用于改变一个子窗口、弹出式窗口或顶层窗口的尺寸、位置和Z序。子窗口,弹出式窗口,及顶层窗口根据它们在屏幕上出现的顺序排序。顶端窗口的级别最高,并且是Z序的第一个窗口。

 

参数:

 

hWnd:窗口句柄。

 

hWndlnsertAfter:在z序中,位于被设置窗口上方的窗口句柄。该参数必须为一个窗口句柄,或下列值之一:

HWND_BOTTOM:将窗口置于Z序的底部。如果参数hWnd标识了一个顶端窗口,则该窗口失去顶端状态,并且被置在其他窗口的底部。

HWND_NOTOPMOST:将窗口置于所有非顶端窗口之上(也就是在所有顶端窗口之后)。如果窗口已经是非顶层窗口则该标志不起作用。

HWND_TOP:将窗口置于Z序的顶部。

HWND_TOPMOST:将窗口置于所有非顶端窗口之上。即使窗口未被激活,也将保持顶端位置。

查看该参数的使用方法,请看说明部分。

 

x:窗口左边界在客户坐标系的位置;

 

y:窗口顶边界在客户坐标系的位置;

 

cx:以像素指定窗口的宽度;

 

cy:以像素指定窗口的高度;

 

uFlags:窗口的尺寸、定位标志。该参数可以是下列值的组合:

SWP_ASYNCWINDOWPOS:如果调用线程不拥有窗口,系统会向拥有窗口的线程发出需求。这就防止调用线程在其他线程处理需求的时候发生死锁;

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:显示窗口;

 

返回值:

 

如果函数成功,返回值为非零;

如果函数失败,返回值为零;

若想获得更多错误消息,请调用GetLastError函数。

 

备注:

 

如果设置了SWP_SHOWWINDOW和SWP_HIDEWINDOW标志,则窗口不能被移动或改变大小。

 

如果使用SetWindowLong改变了窗口的某些数据,则必须调用函数SetWindowPos来作真正的改变。要在uFlags参数中使用下列标志的组合:SWP_NOMOVE I SWP_NOSIZE I SWP_NOZORDER | SWP_FRAMECHANGED。

 

有两种方法可将窗口设为顶端窗口:一种是将参数hWndlnsertAfter设置为HWND_TOPMOST并确保没有设置SWP_NOZORDER标志;另一种是设置窗口在Z序中的位置,以使其在其他已经存在的顶端窗口之上。当一个窗口被设置为顶端窗口,则属于它的所有窗口均为顶端窗口,但它的所有者的z序并不改变。

 

如果SWP_NOACTIVATE和SWP_NOZORDER标志均未指定(即应用程序要求窗口在激活的同时改变其在Z序中的位置时),则参数hWndinsertAfter的值只有在下列条件中才有效:

hWndlnsertAfter参数既不是HWND_NOTOPMOST也不是HWND_TOPMOST标志;

由hWnd参数标识的窗口不是激活窗口。

 

如果未将一个非激活窗口设定到z序的顶端,应用程序不能激活该窗口。应用程序可以无任何限制地改变被激活窗口在Z序中的位置,或激活一个窗口并将其移到顶端窗口的顶部或非顶端窗口的顶部。

 

如果一个顶端窗口被重定位到z序的底部(HWND_BOTTOM)或在任何非顶端窗口之后,该窗口就不再是顶端层窗口。当一个顶端窗口被置为非顶端窗口,则它的从属窗口和所属窗口均变为非顶端窗口。

 

一个非顶端窗口可以拥有一个顶端窗口,但反之则不可以。任何属于顶端窗口的窗口(如对话框)本身就被置为顶端窗口,以确保其所有从属窗口都在它的所属窗口之上。

 

如果应用程序不在前台,但应该位于前台,就应调用SetForegroundWindow函数来设置。

 

Windows CE:

如果是一个可见的顶层窗口,并且未指定SWP_NOACTIVATE标志,则这个函数将激活窗口。如果是当前的激活窗口,并且指定了SWP_NOACTIVATE或SWP_HIDEWINDOW标志,则激活另外一个可见的顶层窗口。

当在这个函数中的nFlags参数里指定了SWP_FRAMECHANGED标志时,WindowsCE重画窗口的整个非客户区,这可能会改变客户区的大小。这也是重新计算客户区的唯一途径,也是通过调用SetwindowLong函数改变窗口风格后通常使用的方法。

SetWindowPos总会向窗口发送WM_WINDOWPOSCHANGED消息,在这个消息中传递的标志与传递给函数的相同。这个函数不传递其他消息。

Windows CE 1.0不支持hWndlnsertAber参数中的HWND_TOPMOST和HWND_NOTOPMOST标志;

Windows CE1.0不支持fuFags参数中的SWP_DRAWFRAME和SWP_NOCOPYBITS标志。

 

速查:

 

Windows NT:3.1以上版本;

Windows:95以上版本;

Windows CE:1.0以上版本;

头文件:winuser.h;

库文件:user32.lib。

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/rebirthzgy/archive/2008/12/05/3450966.aspx

原创粉丝点击