新闻资讯
看你所看,想你所想

SetWindowPos

SetWindowPos

SetWindowPos

SetWindowPos函式改变一个子视窗,弹出式视窗或顶层视窗的尺寸,位置和Z序。子视窗,弹出式视窗,及顶层视窗根据它们在萤幕上出现的顺序排序、顶层视窗设定的级别最高,并且被设定为Z序的第一个视窗。

基本介绍

  • 中文名:SetWindowPos
  • 原型:BOOL SetWindowPos
  • 功能:改变一个子视窗,弹出式视窗
  • 参数:hWnd视窗句柄

函式原型

WINUSERAPIBOOLWINAPISetWindowPos(HWNDhWnd,HWNDhWndInsertAfter,intX,intY,intcx,_In_intcy,UINTuFlags);

函式参数

hwnd
在z序中的位于被置位的视窗前的视窗句柄。该参数必须为一个视窗句柄
hWndlnsertAfter
用于标识在z-顺序的此 CWnd 对象之前的 CWnd 对象。如果uFlags参数中设定了SWP_NOZORDER标记则本参数将被忽略。可为下列值之一:
  • HWND_BOTTOM:值为1,将视窗置于Z序的底部。如果参数hWnd标识了一个顶层视窗,则视窗失去顶级位置,并且被置在其他视窗的底部。
  • HWND_NOTOPMOST:值为-2,将视窗置于所有非顶层视窗之上(即在所有顶层视窗之后)。如果视窗已经是非顶层视窗则该标誌不起作用。
  • HWND_TOP:值为0,将视窗置于Z序的顶部。
  • HWND_TOPMOST:值为-1,将视窗置于所有非顶层视窗之上。即使视窗未被激活视窗也将保持顶级位置。
查看该参数的使用方法,请看说明部分。
x
以客户坐标指定视窗新位置的左边界。
Y
以客户坐标指定视窗新位置的顶边界。
cx
以像素指定视窗的新的宽度。
cy
以像素指定视窗的新的高度。
uFlags
视窗尺寸和定位的标誌。该参数可以是下列值的组合:
  1. SWP_ASYNCWINDOWPOS:如果调用进程不拥有视窗,系统会向拥有视窗的执行绪发出需求。这就防止调用执行绪在其他执行绪处理需求的时候发生死锁。
  2. SWP_DEFERERASE:防止产生WM_SYNCPAINT讯息。
  3. SWP_DRAWFRAME:在视窗周围画一个框线(定义在视窗类描述中)。
  4. SWP_FRAMECHANGED:给视窗传送WM_NCCALCSIZE讯息,即使视窗尺寸没有改变也会传送该讯息。如果未指定这个标誌,只有在改变了视窗尺寸时才传送WM_NCCALCSIZE。
  5. SWP_HIDEWINDOW;隐藏视窗。
  6. SWP_NOACTIVATE:不激活视窗。如果未设定标誌,则视窗被激活,并被设定到其他最高级视窗或非最高级组的顶部(根据参数hWndlnsertAfter设定)。
  7. SWP_NOCOPYBITS:清除客户区的所有内容。如果未设定该标誌,客户区的有效内容被保存并且在视窗尺寸更新和重定位后拷贝回客户区。
  8. SWP_NOMOVE:维持当前位置(忽略X和Y参数)。
  9. SWP_NOOWNERZORDER:不改变z序中的所有者视窗的位置。
  10. SWP_NOREDRAW:不重画改变的内容。如果设定了这个标誌,则不发生任何重画动作。适用于客户区和非客户区(包括标题栏和滚动条)和任何由于窗回移动而露出的父视窗的所有部分。如果设定了这个标誌,应用程式必须明确地使视窗无效并区重画视窗的任何部分和父视窗需要重画的部分。
  11. SWP_NOREPOSITION:与SWP_NOOWNERZORDER标誌相同。
  12. SWP_NOSENDCHANGING:防止视窗接收WM_WINDOWPOSCHANGING讯息。
  13. SWP_NOSIZE:维持当前尺寸(忽略cx和Cy参数)。
  14. SWP_NOZORDER:维持当前Z序(忽略hWndlnsertAfter参数)。
  15. SWP_SHOWWINDOW:显示视窗。

返回值

如果函式成功,返回值为非零;如果函式失败,返回值为零。若想获得更多错误讯息,请调用GetLastError函式。

其它相关

备注:如果设定了SWP_SHOWWINDOW和SWP_HIDEWINDOW标誌,则视窗不能被移动和改变大小。如果使用SetWindowLong改变了视窗的某些数据,则必须调用函式SetWindowPos来作真正的改变。使用下列的组合标誌:SWP_NOMOVEISWP_NOSIZEISWP_FRAMECHANGED。
有两种方法将视窗设为最顶层视窗:一种是将参数hWndlnsertAfter设定为HWND_TOPMOST并确保没有设定SWP_NOZORDER标誌;另一种是设定视窗在Z序中的位置以使其在其他存在的视窗之上。当一个视窗被置为最顶层视窗时,属于它的所有视窗均为最顶层视窗,而它的所有者的z序并不改变。
如果HWND_TOPMOST和HWND_NOTOPMOST标誌均未指定,即应用程式要求视窗在激活的同时改变其在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库档案:eser32lib。

VB例子

加入本函式的声明Private Declare Function SetWindowPos Lib "user32" Alias "SetWindowPos" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
新建个控制项 Check1
'完整代码如下:
Private Sub Check1_Click()
Dim Q
If Check1.Value = 1 Then
Q = SetWindowPos(Me.hWnd, -1, 0, 0, 0, 0, 3)
Else
Q = SetWindowPos(Me.hWnd, -2, 0, 0, 0, 0, 3)
End If
End Sub
Private Sub Form_Load()
Check1.Caption = "点击视窗置前"
End Sub

VC原型

BOOL SetWindowPos(const CWnd* pWndInsertAfter, int x, int y, int cx, int cy,UINT nFlags);

VC功能

调用这个成员函式以改变子视窗、弹出视窗和顶层视窗的大小、位置和Z轴次序。视窗在萤幕上按照它们的Z轴次序排序。在Z轴次序上处于顶端的视窗将程式在所有其它视窗的顶部。子视窗的所有坐标都是客户坐标(相对于父视窗客户区的左上角)。视窗可以被移动到Z轴次序的顶部,既可以通过将pWndInsertAfter参数设为&wndTopMost,并确保没有设定SWP_NOZORDER标誌,也可以通过设定视窗的Z轴次序使它位于所有现存的顶层视窗上方。当一个非顶层视窗被设为顶层视窗时,它拥有的视窗也被设为顶层的。它的拥有者不发生变化。如果顶层视窗被重新定位到Z轴次序的底部(&wndBottom)或任何非顶层视窗之后,则它将不再是顶层视窗。当顶层视窗被变为非顶层视窗时,它所有的拥有者和它拥有的所有视窗都被变为非顶层视窗。

参数

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 显示视窗。

VC例子

BOOL CDesktopADDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// 设定此对话框的图示。当应用程式主视窗不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设定大图示
SetIcon(m_hIcon, FALSE); // 设定小图示
// TODO: 在此添加额外的初始化代码
int cx = GetSystemMetrics(SM_CXSCREEN);
int cy = GetSystemMetrics(SM_CYSCREEN);
int dx = 600;
int dy = 400;
SetWindowPos(&wndBottom,cx-dx,cy-dy,dx,dy,SWP_NOACTIVATE); //设定广告视窗浮动于右下角
return TRUE; // 除非将焦点设定到控制项,否则返回 TRUE
}

c#说明

[DllImport("user32.dll", EntryPoint = "SetWindowPos")]
static extern bool SetWindowPos(
IntPtr hWnd,
IntPtr hWndInsertAfter,
int X,
int Y,
int cx,
int cy,
uint uFlags
);
static readonly IntPtr HWND_TOPMOST = new IntPtr(-1);
static readonly IntPtr HWND_NOTOPMOST = new IntPtr(-2);
static readonly IntPtr HWND_TOP = new IntPtr(0);
const UInt32 SWP_NOSIZE = 0x0001;
const UInt32 SWP_NOMOVE = 0x0002;
const UInt32 SWP_NOZORDER = 0x0004;
const UInt32 SWP_NOREDRAW = 0x0008;
const UInt32 SWP_NOACTIVATE = 0x0010;
const UInt32 SWP_FRAMECHANGED = 0x0020;
const UInt32 SWP_SHOWWINDOW = 0x0040;
const UInt32 SWP_HIDEWINDOW = 0x0080;
const UInt32 SWP_NOCOPYBITS = 0x0100;
const UInt32 SWP_NOOWNERZORDER = 0x0200;
const UInt32 SWP_NOSENDCHANGING = 0x0400;
const UInt32 TOPMOST_FLAGS = SWP_NOMOVE | SWP_NOSIZE;

其他相关

易语言DLL命令使用格式
.DLL命令 API_SetWindowPos, 整数型, "user32", "SetWindowPos", 这个函式能为视窗指定一个新位置和状态。它也可改变视窗在内部视窗列表中的位置。该函式与DeferWindowPos函式相似,只是它的作用是立即表现出来的(在vb里使用:针对vb窗体,如它们在win32下禁止或最小化,则需重设最顶部状态。如有必要,请用一个子类处理模组来重设最顶部状态 非零表示成功,零表示失败。会设定GetLastError
.参数 hwnd, 整数型, , 欲定位的视窗
.参数 hWndInsertAfter, 整数型, , 视窗句柄。在视窗列表中,视窗hwnd会置于这个视窗句柄的后面。也可能选用下述值之一:;HWND_BOTTOM:将视窗置于视窗列表底部;HWND_TOP:将视窗置于Z序列的顶部;Z序列代表在分级结构中,视窗针对一个给定级别的视窗显示的顺序;HWND_TOPMOST:将视窗置于列表顶部,并位于任何最顶部视窗的前面;HWND_NOTOPMOST:将视窗置于列表顶部,并位于任何最顶部视窗的后面
.参数 x, 整数型, , 视窗新的x坐标。如hwnd是一个子视窗,则x用父视窗的客户区坐标表示
.参数 y, 整数型, , 视窗新的y坐标。如hwnd是一个子视窗,则y用父视窗的客户区坐标表示
.参数 cx, 整数型, , 指定新的视窗宽度
.参数 cy, 整数型, , 指定新的视窗高度
.参数 wFlags, 整数型, , 包含了旗标的一个整数;SWP_DRAWFRAME:围绕视窗画一个框;SWP_HIDEWINDOW:隐藏视窗;SWP_NOACTIVATE:不激活视窗;SWP_NOMOVE:保持当前位置(x和y设定将被忽略);SWP_NOREDRAW:视窗不自动重画;SWP_NOSIZE:保持当前大小(cx和cy会被忽略);SWP_NOZORDER:保持视窗在列表的当前位置(hWndInsertAfter将被忽略);SWP_SHOWWINDOW:显示视窗;SWP_FRAMECHANGED:强迫一条WM_NCCALCSIZE讯息进入视窗,即使视窗的大小没有改变;

转载请注明出处海之美文 » SetWindowPos

相关推荐

    声明:此文信息来源于网络,登载此文只为提供信息参考,并不用于任何商业目的。如有侵权,请及时联系我们:ailianmeng11@163.com