我們先來看看SetWindowPos函數(shù)的定義和參數(shù):
使用API函數(shù)之前必須先在程序中聲明如下:
Private 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
其中各參數(shù)的意義如下:
參數(shù) 意義
hwnd Long 欲定位的窗口
hWndInsertAfter Long 窗口句柄。在窗口列表中,窗口hwnd會置于這個窗口句柄的后面
x,y Long 窗口新的x,y坐標(biāo)
cx,cy Long 指定新的窗口寬度和高度
wFlags Long 包含了旗標(biāo)的一個整數(shù),是下列之一
返回值 Long 非零表示成功,零表示失敗
下面是部分wFlags參數(shù)和它們的意義:
參數(shù) 意義和使用方法
SWP_DRAWFRAME 圍繞窗口畫一個框
SWP_HIDEWINDOW 隱藏窗口
SWP_NOACTIVATE 不激活窗口
SWP_NOMOVE 保持當(dāng)前位置 (x和y設(shè)定將被忽略) &H2
SWP_NOREDRAW 窗口不自動重畫
SWP_NOSIZE 保持當(dāng)前大小 (cx和cy會被忽略) &H1
SWP_NOZORDER 保持窗口在列表的當(dāng)前位置 (hWndInsertAfter將被忽略)
SWP_SHOWWINDOW 顯示窗口 &H40
SWP_FRAMECHANGED 強(qiáng)迫一條WM_NCCALCSIZE消息進(jìn)入窗口,即使窗口的大小沒有改變
函數(shù)的使用很簡單,我們只須在Form_Load中加入如下語句即可:
retValue = SetWindowPos(Me.hwnd, HWND_TOPMOST, Me.CurrentX, Me.CurrentY, 300, 300, SWP_SHOWWINDOW)
這樣窗體就能保持在所有窗體的前面了。
為了學(xué)習(xí)方便,下面提供了源碼:
注釋:-------------------------------------------
注釋: 讓一個窗體總是處于最前的例子
注釋:-------------------------------------------
注釋:程序說明:
注釋:本例應(yīng)用SetWindowPos函數(shù),設(shè)置窗體的顯示屬性
注釋:來實(shí)現(xiàn)讓一個窗體總是處于其他窗體的前面而不會
注釋:被其他窗體所遮住。
注釋:-------------------------------------------
Option Explicit
注釋:【VB聲明】
注釋: Private 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
注釋:【說明】
注釋: 這個函數(shù)能為窗口指定一個新位置和狀態(tài)。它也可改變窗口在內(nèi)部窗口列表中的位置。該函數(shù)與DeferWindowPos函數(shù)相似,只是它的作用是立即表現(xiàn)出來的(在vb里使用:針對vb窗體,如它們在win32下屏蔽或最小化,則需重設(shè)最頂部狀態(tài)。如有必要,請用一個子類處理模塊來重設(shè)最頂部狀態(tài)
注釋:【返回值】
注釋: Long,非零表示成功,零表示失敗。會設(shè)置GetLastError
注釋:【備注】
注釋: 窗口成為最頂級窗口后,它下屬的所有窗口也會進(jìn)入最頂級。一旦將其設(shè)為非最頂級,則它的所有下屬和物主窗口也會轉(zhuǎn)為非最頂級。Z序列用垂直于屏幕的一根假想Z軸量化這種從頂部到底部排列的窗口順序
注釋:【參數(shù)表】
注釋: hwnd ----------- Long,欲定位的窗口
注釋: hWndInsertAfter - Long,窗口句柄。在窗口列表中,窗口hwnd會置于這個窗口句柄的后面。也可能選用下述值之一:
注釋: HWND_BOTTOM 將窗口置于窗口列表底部
注釋: HWND_TOP 將窗口置于Z序列的頂部;Z序列代表在分級結(jié)構(gòu)中,窗口針對一個給定級別的窗口顯示的順序
注釋: HWND_TOPMOST 將窗口置于列表頂部,并位于任何最頂部窗口的前面 -1
注釋: HWND_NOTOPMOST 將窗口置于列表頂部,并位于任何最頂部窗口的后面 -2
注釋: x -------------- Long,窗口新的x坐標(biāo)。如hwnd是一個子窗口,則x用父窗口的客戶區(qū)坐標(biāo)表示
注釋: y -------------- Long,窗口新的y坐標(biāo)。如hwnd是一個子窗口,則y用父窗口的客戶區(qū)坐標(biāo)表示
注釋: cx ------------- Long,指定新的窗口寬度
注釋: cy ------------- Long,指定新的窗口高度
注釋: wFlags --------- Long,包含了旗標(biāo)的一個整數(shù),是下列之一:
注釋: SWP_DRAWFRAME 圍繞窗口畫一個框
注釋: SWP_HIDEWINDOW 隱藏窗口
注釋: SWP_NOACTIVATE 不激活窗口 &H10
注釋: SWP_NOMOVE 保持當(dāng)前位置 (x和y設(shè)定將被忽略) &H2
注釋: SWP_NOREDRAW 窗口不自動重畫
注釋: SWP_NOSIZE 保持當(dāng)前大小 (cx和cy會被忽略) &H1
注釋: SWP_NOZORDER 保持窗口在列表的當(dāng)前位置 (hWndInsertAfter將被忽略)
注釋: SWP_SHOWWINDOW 顯示窗口 &H40
注釋: SWP_FRAMECHANGED 強(qiáng)迫一條WM_NCCALCSIZE消息進(jìn)入窗口,即使窗口的大小沒有改變
Private 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
Const HWND_TOPMOST = -1
Const SWP_SHOWWINDOW = &H40
Private Sub Form_load()
Dim retValue As Long
注釋:將窗體設(shè)置為處于所有窗口的頂層,注意在 VB 中運(yùn)行時(shí),
’可能不行,但編譯成EXE后就可以了
retValue = SetWindowPos(Me.hwnd, HWND_TOPMOST, Me.CurrentX,
Me.CurrentY, 300, 300, SWP_SHOWWINDOW)
End Sub