导航:  CWindow Class > Methods and Properties >

SetWindowPos

上一页返回章节概述下一页

描述

 

更改子窗口、弹出窗口或顶层窗口的大小、位置和z顺序.这些窗口根据屏幕上的外观排列.最上面的窗口接收最高等级,是Z阶的第一个窗口.

 

FreeBASIC 语法

FUNCTION SetWindowPos ( _

  BYVAL hwnd AS HWND, _

  BYVAL hwndInsertAfter AS HWND, _

  BYVAL x AS LONG, _

  BYVAL y AS LONG, _

  BYVAL cx AS LONG, _

  BYVAL cy AS LONG, _

  BYVAL uFlags AS UINT _

) AS WINBOOL

 

参数

 

hwnd

[in]窗口的句柄.

 

hwndInsertAfter

[in]窗口的句柄进行定位窗口在Z序.此参数必须是窗口句柄或下列值之一.

Value

Meaning

HWND_BOTTOM

1???

将窗口放置在z顺序的底部.如果hWnd参数标识了一个顶层窗口,窗口失去其最高的地位和被放置在其他窗口的底部.

HWND_NOTOPMOST

&HFFFFFFFF???

将窗口放在所有非顶层窗口(也就是所有顶层窗口的后面).如果窗口已是非最顶层窗口,则此标志不会起作用.

HWND_TOP

0???

将窗口放置在z顺序的顶部.

HWND_TOPMOST

&HFFFFFFFE???

将窗口置于所有非顶层窗口之上.窗口保持其顶部位置,即使当它被停用.

 

为更多的信息关于这个参数的使用,看下面的备注节.

 

X

[in]的窗口左侧的新位置,在客户区坐标.

 

Y

[in]窗口的上方新的位置,在客户区坐标.

 

cx

[in]窗口的新的宽度,以像素为单位.

 

cy

[in]窗口的新的高度,以像素为单位.

 

uFlags

[in]窗口的大小和位置的标志.此参数可以是下列值的组合.

Value

Meaning

SWP_ASYNCWINDOWPOS

&H4000???

如果调用线程和拥有该窗口的线程连接到不同的输入队列,则系统将请求发送到拥有该窗口的线程.这阻止调用线程阻止其执行,而其他线程处理请求.

SWP_DEFERERASE

&H2000???

防止产生的WM_SYNCPAINT消息.

SWP_DRAWFRAME

&H0020???

在窗口周围绘制一个框架(定义在窗口的类描述中).

SWP_FRAMECHANGED

&H0020???

应用新的框架样式设置使用SetWindowLong功能.WM_NCCALCSIZE发送消息给窗口,如果窗口的大小是不变的.如果不指定此标志,只有当WM_NCCALCSIZE发送窗口的大?桓谋?

SWP_HIDEWINDOW

&H0080???

隐藏窗口.

SWP_NOACTIVATE

&H0010???

不激活窗口.如果未设置此标志,窗口被激活和感动是最高的或非顶层组顶部(根据不同的hWndInsertAfter参数的设置).

SWP_NOCOPYBITS

&H0100???

丢弃客户端区域的全部内容.如果不指定此标志,客户区的有效内容保存和复制到客户区窗口的大小或重新定位后.

SWP_NOMOVE

&H0002???

保留当前位置(忽略XY参数).

SWP_NOOWNERZORDER

&H0200???

不更改所有者窗口在z顺序中的位置.

SWP_NOREDRAW

&H0008???

不重绘的变化.如果设置了这个标志,没有再发生任何.适用于客户区,非客户区(包括标题栏和滚动条),和父窗口发现由于窗口被移动的任何部分.当这个标志被设置,应用程序必须明确无效或重画部分窗口和父窗口需要重画.

SWP_NOREPOSITION

&H0200???

同SWP_NOOWNERZORDER旗.

SWP_NOSENDCHANGING

&H0400???

防止窗口接收消息的WM_WINDOWPOSCHANGING.

SWP_NOSIZE

&H0001???

保持电流的大?ê雎?span style="font-style: italic;">cx和cy参数).

SWP_NOZORDER

&H0004???

保留当前的Z顺序(忽略hWndInsertAfter参数).

SWP_SHOWWINDOW

&H0040???

显示窗口.

 

返回值

 

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

如果函数失败,返回值为零.为了获得更多的错误信息,调用GetLastError.

 

备注

 

作为Vista重新架构的一部分,所有服务都从交互桌面移出到会话0中.hwnd和窗口管理器的操作是唯一有效的内部会议和跨会话试图操纵hwnd会失败.有关更多信息,参见< a href ='http://msdn.microsoft.com/en-us/library/aa480152.aspx'class='链接'> Windows Vista开发的故事:应用程序兼容性食谱</a>.

如果你已经改变了某些窗口的数据使用SetWindowLong / SetWindowLongPtr,您必须更改生效SetWindowPos.使用以下组合:SWP_NOMOVE uFlags | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED.

一个窗口可以通过设置hwndInsertAfter参数HWND_TOPMOST保证不把SWP_NOZORDER旗是顶层窗口,或通过设置在Z顺序窗口的位置高于任何现有的顶层窗口.当一个非顶层窗口被做成最顶层时,它所拥有的窗口也被做成最顶层.它的所有者,但是,没有改变.

如果没有SWP_NOACTIVATE也SWP_NOZORDER标志指定(即,当应用程序请求一个窗口被同时激活,其位置在Z顺序改变),指定在hwndInsertAfter值仅用于下列情况.

·Neither the HWND_TOPMOST nor HWND_NOTOPMOST flag is specified in hwndInsertAfter.
·The window identified by hwnd is not the active window.

应用程序不能激活非活动窗口,也不必将其置于z顺序的顶部.应用程序可以在没有限制的情况下改变激活的窗口在z顺序中的位置,或者它可以激活一个窗口,然后将其移动到顶层或非顶层窗口的顶部.

如果一个顶层窗口被重新定位到Z顺序的底部(HWND_BOTTOM)或任何非顶层窗口后,它不再是最高的.当一个顶层窗口被做成非最顶层时,它的所有者和拥有的窗口也被做成非最顶层的窗口.

非顶层窗口可以拥有顶层窗口,但反向不能出现.由顶层窗口拥有的任何窗口(例如,对话框)本身都是一个最顶层的窗口,以确保所有拥有的窗口都保持在其所有者之上.

如果应用程序不在前台,并应在前台,它必须调用SetForegroundWindow功能.

使用SetWindowPos带窗口的顶部,拥有窗口必须有SetForegroundWindow许可的过程.

 

用法示例

 

SetWindowPos(hwnd, NULL, 0, 0, cx, cy, SWP_NOZORDER OR SWP_NOMOVE OR SWP_NOACTIVATE)

 

引用文件

 

CWindow.inc