用VB制作TopMost類型窗口
發表于:2007-07-14來源:作者:點擊數:
標簽:
TopMost這個詞也許你很陌生,但具有TopMost窗口的軟件你應該早就接觸過,如Office97、 網絡 吸血鬼、IE等。所謂TopMost窗口是指哪些始終出現在桌面的最前方且不會被其它窗口覆蓋的窗口,如網絡吸血鬼中的下載圖標。 一般憎況下,在運行 VB 程序時,窗口總有
TopMost這個詞也許你很陌生,但具有TopMost窗口的軟件你應該早就接觸過,如Office97、
網絡吸血鬼、IE等。所謂TopMost窗口是指哪些始終出現在桌面的最前方且不會被其它窗口覆蓋的窗口,如網絡吸血鬼中的
下載圖標。
一般憎況下,在運行
VB程序時,窗口總有可能會被其它程序的窗口所覆蓋。如何在自己的應用程序中實現TopMost類型的窗口呢?我們可以通過調用
Windows API函數SetWindowPos來實現。
一、SetWindowPos函數介紹
SetWindowPos函數功能是將一個窗口在三維空間中移動,利用它,你可以改變一個窗口的位置,甚至可以在Z軸上改變(Z軸決定了一個窗口和其它窗口的前后關系),你還可以改變窗口的尺寸。為了實現TopMost類型的窗口,我們只需調用該函數,將窗口放在所有窗口的前面并永遠保持在最前面即可。要想在VB中使用SetWindowPos函數,必須在程序的代碼模塊中進行如下的函數聲明:
Declare Function SetwindowPos Lib "user32.dll" (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
SetWindowPos函數各個參數的含義見表1。
表1 SetWindowPos函數的參數解釋
參數名 參數含義
hwnd 要移動的窗口的句柄(可以用窗體的hwnd屬性)
hWndInsertAfter 關于如何在Z軸上放置窗口的標記(具體見表2)
x 相當于窗口的Left屬性
y 相當于窗口的Top屬性
cx 相當于窗口的Right屬性
cy 相當于窗口的Bottom屬性
wFlags 關于如何移動窗口的標記(具體見表3)
表2 HWndInsertAfter參數的可能取值及含義
hWndInsertAfter的可能取值 功能
某一窗口的句柄 將窗口放在該句柄指定的窗口后面
HWND_BOTTOM(1) 把窗口放在Z軸的最后,即所有窗口的后面
HWND_TOP(0) 將窗口放在Z軸的前面,即所有窗口的前面
HWND_TOPMOST(-1) 使窗口成為“TopMost”類型的窗口,這種類型
的窗口總是在其它窗口的前面,真到它被關閉
HWND_NOTOPMOST(-2) 將窗口放在所有“TopMost”類型
窗口的后面、其它類型窗口的前面
表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
隱藏窗口)
前面已提到,利用SetWindowPos函數可以決定窗口在Z軸中的位置,具體如何放置,需根據表2給hWndInsertAfter參數賦予合適的值。
另外,wFlags參數為SetWindowPos函數移動窗口提供了附加的特性,我們可以通過or運算將表3中若干個wFlags結合在一起使用,如SWP_NOMOVE Or SWP_NOSIZE既不移動窗口又不改變窗口的尺寸。但是要注意不要將功能沖突的值結合使用,如SWP_HIDEWINDOW Or SWP_SHOWWINDOW。
二、程序舉例
下面,我們以一個簡單的例子說明SetWindowPos函數的用法及如何實現TopMost類型窗口。新建工程,在普通窗體Form1上放置兩個命令按鈕cmdNormal和cmdTopMost,命令按鈕的Caption屬性分別為“變成普通窗口”和“變成TopMost窗口”。cmdNormal的Enabled屬性為False。為工程添加代碼模塊Moudall,在其中放置如下聲明代碼:
Declare Function SetWindowPos Lib "user32" (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
Public Const SWP_NOMOVE= &H2 '不移動窗體
Public Const SWP_NOSIZE=&H1 '不改變窗體尺寸
Public Const Flag=SWP_NOMOVE Or SWP_NOSIZE
Public Const HWND_TOPMOST=-1 '窗體總在最前面
Public Const HWND_NOTOPMOST=-2 '窗體不在最前面
為窗體添加代碼如下:
Private Sub cmdNormal_Click()
cmdTopMost.Enabled=True
cmdNormal. Enabled= False
Form1.Captio = "現在是普通窗口"
SetWindowPos Form1.hwnd,HWND_NOTOPMOST,0,0,0,0,Flag
End Sub
Private Sub cmdTopMost_Click()
cmdTopMost.Enabled = False
cmdNormal.Enabled = True
Form1.Caption = "現在是TopMost窗口"
SetWindowPos Form1.hwnd,HWND_TOPMOST,0,0,0,0,Flag
End Sub
按下F5,運行程序,單擊“變成TopMost窗體”命令按鈕,此時窗口即成為TopMost類型。隨意打開桌面上的其它窗口,Form1總是處在其它窗口的前面;如果單擊“變成普通窗體”按鈕。則一切又恢復正常,一旦打開了其它窗口,則其它窗口會將Form1窗口覆蓋。
原文轉自:http://www.anti-gravitydesign.com