TopMost這個詞也許你很陌生,但具有TopMost窗口的軟件你應(yīng)該早就接觸過,如Office97、網(wǎng)絡(luò)吸血鬼、IE等。所謂TopMost窗口是指哪些始終出現(xiàn)在桌面的最前方且不會被其它窗口覆蓋的窗口,如網(wǎng)絡(luò)吸血鬼中的下載圖標(biāo)。 一般憎況下,在運(yùn)行VB程序時,窗口總有可能會被其它程序的窗口所覆蓋。如何在自己的應(yīng)用程序中實(shí)現(xiàn)TopMost類型的窗口呢?我們可以通過調(diào)用Windows API函數(shù)SetWindowPos來實(shí)現(xiàn)。 一、SetWindowPos函數(shù)介紹 SetWindowPos函數(shù)功能是將一個窗口在三維空間中移動,利用它,你可以改變一個窗口的位置,甚至可以在Z軸上改變(Z軸決定了一個窗口和其它窗口的前后關(guān)系),你還可以改變窗口的尺寸。為了實(shí)現(xiàn)TopMost類型的窗口,我們只需調(diào)用該函數(shù),將窗口放在所有窗口的前面并永遠(yuǎn)保持在最前面即可。要想在VB中使用SetWindowPos函數(shù),必須在程序的代碼模塊中進(jìn)行如下的函數(shù)聲明: 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函數(shù)各個參數(shù)的含義見表1。 表1 SetWindowPos函數(shù)的參數(shù)解釋
參數(shù)名 參數(shù)含義 hwnd 要移動的窗口的句柄(可以用窗體的hwnd屬性) hWndInsertAfter 關(guān)于如何在Z軸上放置窗口的標(biāo)記(具體見表2) x 相當(dāng)于窗口的Left屬性 y 相當(dāng)于窗口的Top屬性 cx 相當(dāng)于窗口的Right屬性 cy 相當(dāng)于窗口的Bottom屬性 wFlags 關(guān)于如何移動窗口的標(biāo)記(具體見表3)
表2 HWndInsertAfter參數(shù)的可能取值及含義
hWndInsertAfter的可能取值 功能 某一窗口的句柄 將窗口放在該句柄指定的窗口后面 HWND_BOTTOM(1) 把窗口放在Z軸的最后,即所有窗口的后面 HWND_TOP(0) 將窗口放在Z軸的前面,即所有窗口的前面 HWND_TOPMOST(-1) 使窗口成為“TopMost”類型的窗口,這種類型 的窗口總是在其它窗口的前面,真到它被關(guān)閉 HWND_NOTOPMOST(-2) 將窗口放在所有“TopMost”類型 窗口的后面、其它類型窗口的前面
表3 wFlags參數(shù)的可能值及含義
wFlags參數(shù)的可能值 功能 SWP_DRAWFRAME(&H20) 移動窗口后重畫窗口及其上的所有內(nèi)容 SWP_HIDEWINDOW(&H80) 隱藏窗口,窗口隱藏后既不出現(xiàn)在屏幕上也不出現(xiàn)在任 務(wù)欄上,但它仍然處于激活狀態(tài) SWP_NOACTIVATE(&H10) 窗口移動后不激活窗口,當(dāng)然,如果窗口在移動前就是 激活的則例外 SWP_NOCOPYBITS(&H100) 當(dāng)窗口移動后,不重畫它上面的任何內(nèi)容 SWP_NOMOVE(&H2) 不移動窗口(即忽略X和Y參數(shù)) SWP_NOSIZE(&H1) 不改變窗口尺寸(即忽略Cx和Cy參數(shù)) 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參數(shù)) SWP_SHOWWINDOW(&H40) 顯示窗口(之前必須使用過SWP_HIDEWINDOW 隱藏窗口)
前面已提到,利用SetWindowPos函數(shù)可以決定窗口在Z軸中的位置,具體如何放置,需根據(jù)表2給hWndInsertAfter參數(shù)賦予合適的值。 另外,wFlags參數(shù)為SetWindowPos函數(shù)移動窗口提供了附加的特性,我們可以通過or運(yùn)算將表3中若干個wFlags結(jié)合在一起使用,如SWP_NOMOVE Or SWP_NOSIZE既不移動窗口又不改變窗口的尺寸。但是要注意不要將功能沖突的值結(jié)合使用,如SWP_HIDEWINDOW Or SWP_SHOWWINDOW。 二、程序舉例 下面,我們以一個簡單的例子說明SetWindowPos函數(shù)的用法及如何實(shí)現(xiàn)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 = "現(xiàn)在是普通窗口" SetWindowPos Form1.hwnd,HWND_NOTOPMOST,0,0,0,0,Flag End Sub Private Sub cmdTopMost_Click() cmdTopMost.Enabled = False cmdNormal.Enabled = True Form1.Caption = "現(xiàn)在是TopMost窗口" SetWindowPos Form1.hwnd,HWND_TOPMOST,0,0,0,0,Flag End Sub 按下F5,運(yùn)行程序,單擊“變成TopMost窗體”命令按鈕,此時窗口即成為TopMost類型。隨意打開桌面上的其它窗口,F(xiàn)orm1總是處在其它窗口的前面;如果單擊“變成普通窗體”按鈕。則一切又恢復(fù)正常,一旦打開了其它窗口,則其它窗口會將Form1窗口覆蓋。
|