用VB制作TopMost类型窗口
2006-02-27 21:14:57 来源:WEB开发网一般憎况下,在运行VB程序时,窗口总有可能会被其它程序的窗口所覆盖。如何在自己的应用程序中实现TopMost类型的窗口呢?我们可以通过调用WindowsAPI函数SetWindowPos来实现。
一、SetWindowPos函数介绍
SetWindowPos函数功能是将一个窗口在三维空间中移动,利用它,你可以改变一个窗口的位置,甚至可以在Z轴上改变(Z轴决定了一个窗口和其它窗口的前后关系),你还可以改变窗口的尺寸。为了实现TopMost类型的窗口,我们只需调用该函数,将窗口放在所有窗口的前面并永远保持在最前面即可。要想在VB中使用SetWindowPos函数,必须在程序的代码模块中进行如下的函数声明:
DeclareFunctionSetwindowPosLib"user32.dll"(ByValhwndAsLong,ByValhWndInsertAfterAsLong,ByValxAsLong,ByValyAsLong,ByValcxAsLong,ByValcyAsLong,ByValwFlagsasLong)AsLong
SetWindowPos函数各个参数的含义见表1。
的窗口总是在其它窗口的前面,真到它被关闭->-align="middle"width="214">HWND_NOTOPMOST(-2)->-align="middle"width="302">将窗口放在所有“TopMost”类型
窗口的后面、其它类型窗口的前面->
务栏上,但它仍然处于激活状态->-align="middle"width="218">SWP_NOACTIVATE(&H10)->-align="middle"width="298">窗口移动后不激活窗口,当然,如果窗口在移动前就是
激活的则例外->-align="middle"width="218">SWP_NOCOPYBITS(&H100)->-align="middle"width="298">当窗口移动后,不重画它上面的任何内容->-align="middle"width="218">SWP_NOMOVE(&H2)->-align="middle"width="298">不移动窗口(即忽略X和Y参数)->-align="middle"width="218">SWP_NOSIZE(&H1)->-align="middle"width="298">不改变窗口尺寸(即忽略Cx和Cy参数)->-align="middle"width="218">SWP_NOREDRAW(&H8)->-align="middle"width="298">Donotremovetheimageofthewindowinitsformerposition
fromthescreen.InotherWords,leavebehindaGhostimage
ofthewindowinitsoldposition->-align="middle"width="218">SWP_NOZORDER(&H4)->-align="middle"width="298">不改变窗口听Z轴位置(即忽略hWndInsertAfter参数)->-align="middle"width="218">SWP_SHOWWINDOW(&H40)->-align="middle"width="298">显示窗口(之前必须使用过SWP_HIDEWINDOW
隐藏窗口)->
前面已提到,利用SetWindowPos函数可以决定窗口在Z轴中的位置,具体如何放置,需根据表2给hWndInsertAfter参数赋予合适的值。
另外,wFlags参数为SetWindowPos函数移动窗口提供了附加的特性,我们可以通过or运算将表3中若干个wFlags结合在一起使用,如SWP_NOMOVEOrSWP_NOSIZE既不移动窗口又不改变窗口的尺寸。但是要注意不要将功能冲突的值结合使用,如SWP_HIDEWINDOWOrSWP_SHOWWINDOW。
二、程序举例
下面,我们以一个简单的例子说明SetWindowPos函数的用法及如何实现TopMost类型窗口。新建工程,在普通窗体Form1上放置两个命令按钮cmdNormal和cmdTopMost,命令按钮的Caption属性分别为“变成普通窗口”和“变成TopMost窗口”。cmdNormal的Enabled属性为False。为工程添加代码模块Moudall,在其中放置如下声明代码:
DeclareFunctionSetWindowPosLib"user32"(ByValhwndAsLong,ByValhWndInsertAfterAsLong,ByValxAsLong,ByValyAsLong,ByValcxAsLong,ByValcyAsLong,ByValwFlagsAsLong)AsLong
PublicConstSWP_NOMOVE=&H2'不移动窗体
PublicConstSWP_NOSIZE=&H1'不改变窗体尺寸
PublicConstFlag=SWP_NOMOVEOrSWP_NOSIZE
PublicConstHWND_TOPMOST=-1'窗体总在最前面
PublicConstHWND_NOTOPMOST=-2'窗体不在最前面
为窗体添加代码如下:
PRivateSubcmdNormal_Click()
cmdTopMost.Enabled=True
cmdNormal.Enabled=False
Form1.Captio="现在是普通窗口"
SetWindowPosForm1.hwnd,HWND_NOTOPMOST,0,0,0,0,Flag
EndSub
PrivateSubcmdTopMost_Click()
cmdTopMost.Enabled=False
cmdNormal.Enabled=True
Form1.Caption="现在是TopMost窗口"
SetWindowPosForm1.hwnd,HWND_TOPMOST,0,0,0,0,Flag
EndSub
按下F5,运行程序,单击“变成TopMost窗体”命令按钮,此时窗口即成为TopMost类型。随意打开桌面上的其它窗口,Form1总是处在其它窗口的前面;如果单击“变成普通窗体”按钮。则一切又恢复正常,一旦打开了其它窗口,则其它窗口会将Form1窗口覆盖。
本程序用VisualBasic5.0编写,在Pwin95、Pwin97环境下运行正常。->
赞助商链接