SetWindowPos() 函数功能:该函数改变一个子窗口,弹出式窗口式顶层窗口的尺寸,位置和Z序。子窗口,弹出式窗口,及顶层窗口根据它们在屏幕上出现的顺序排序、顶层窗口设置的级别最高,并且被设置为Z序的第一个窗口。 查看该参数的使用方法,请看说明部分。
。
备注:如果设置了SWP_SHOWWINDOW和SWP_HIDEWINDOW标志,则窗口不能被移动和改变大小。如果使用SetWindowLoog改变了窗口的某些数据,则必须调用函数SetWindowPos来作真正的改变。使用下列的组合标志:SWP_NOMOVEISWP_NOSIZEISWP_FRAMECHANGED。 有两种方法将窗口设为最顶层窗口:一种是将参数hWndlnsertAfter设置为HWND_TOPMOST并确保没有设置SWP_NOZORDER标志;另一种是设置窗口在Z序中的位置以使其在其他存在的窗口之上。当一个窗口被置为最顶层窗口时 DWORD_PRT SetWindowPos(HWND hWnd,HWND hInsertAfter,int x,int y,int cx,int cy,UINT nFlag)
SetWindowPos函数功能是将一个窗口在三维空间中移动,利用它,你可以改变一个窗口的位置,甚至可以在Z轴上改变(Z轴决定了一个窗口和其它窗口的前后关系),你还可以改变窗口的尺寸。为了实现TopMost类型的窗口,我们只需调用该函数,将窗口放在所有窗口的前面并永远保持在最前面即可
表1 SetWindowPos函数的参数解释 参数名 参数含义 表2 HWndInsertAfter参数的可能取值及含义 hWndInsertAfter的可能取值 功能 表3 wFlags参数的可能值及含义 wFlags参数的可能值 功能
SWP_DRAWFRAME(&H20) 移动窗口后重画窗口及其上的所有内容 SWP_HIDEWINDOW(&H80) 隐藏窗口,窗口隐藏后既不出现在屏幕上也不出现在任 务栏上,但它仍然处于激活状态 SWP_NOACTIVATE(&H10) 窗口移动后不激活窗口,当然,如果窗口在移动前就是 激活的则例外 SWP_NOCOPYBITS(&H100) 当窗口移动后,不重画它上面的任何内容 SWP_NOMOVE(&H2) 不移动窗口(即忽略X和Y参数) SWP_NOSIZE(&H1) 不改变窗口尺寸(即忽略Cx和Cy参数) SWP_NOREDRAW(&H8) Do not remove the image of the window in its former position from the screen. In other words,leave behind a ghost image of the window in its old position SWP_NOZORDER(&H4) 不改变窗口听Z轴位置(即忽略hWndInsertAfter参数) SWP_SHOWWINDOW(&H40) 显示窗口(之前必须使用过SWP_HIDEWINDOW 隐藏窗口) 注释:
假如指定了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函数. 参看: MoveWindow, SetActiveWindow, SetForegroundWindow 使用条件: Windows NT:可以。 Windows 95:可以。 Win32s: 可以。 头文件: 在Winuser.h中定义。 静态库: User32.lib. 示例代码: 移动到屏幕的左上角: SetWindowPos(m_hWnd,NULL,0,0,0,0,SWP_NOSIZE); 使其成为Topmost窗口并移动到屏幕的左上角: SetWindowPos(m_hWnd,HWND_TOPMOST,0,0,0,0,SWP_NOSIZE); 显示窗口: SetWindowPos(m_hWnd,NULL,0,0,0,0,SWP_SHOWWINDOW|SWP_NOSIZE|SWP_NOMOVE); 隐藏窗口: SetWindowPos(m_hWnd,NULL,0,0,0,0,SWP_HIDEWINDOW|SWP_NOSIZE|SWP_NOMOVE); 改变窗口大小: CRect newRect; ::GetWindowRect(m_hWnd,&newRect); ::SetWindowPos(m_hWnd,NULL,0,0,newRect.Width()/2,newRect.Height()/2,SWP_NOMOVE); |
|