1. 程式人生 > >如何讓窗體總在桌面最前面顯示

如何讓窗體總在桌面最前面顯示

怎麼讓窗體總在前
2007-06-21 作者: 來源:網路

呼叫API函式SETWINDOWPOS可達到這一目的。該函式的語法是:

    SetWindowPos hWnd, hwndInsetAfter, x, y, cx, xy, wFlags

    其中:
        hWnd ---- 窗體的控制代碼(handle)。
        hWndInsetAfter ---- 它就是決定是否“總在前”的引數,
        應用中設定為: HWND_TOPMOST      總在前
                      HWND_NOTOPMOST   正常的
        x,y,cx,cy ----表示窗體的位置和大小的引數,在實際應用中可忽略。
        wFlags ---- 決定窗體是否可以移動和改變尺寸,
        一般設定成這樣的形式: SWP_NOMOVE or SWP_NOSIZE。


VB中讓窗體始終處於最前面
2006-12-05 作者: 來源:enet
我們先來看看SetWindowPos函式的定義和引數:

  使用API函式之前必須先在程式中宣告如下:

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
  
  其中各引數的意義如下:

引數 意義
hwnd Long 欲定位的視窗
hWndInsertAfter Long 視窗控制代碼。在視窗列表中,視窗hwnd會置於這個視窗控制代碼的後面
x,y Long 視窗新的x,y座標
cx,cy Long 指定新的視窗寬度和高度
wFlags Long 包含了旗標的一個整數,是下列之一
返回值 Long 非零表示成功,零表示失敗

  下面是部分wFlags引數和它們的意義:

引數 意義和使用方法
SWP_DRAWFRAME 圍繞視窗畫一個框
SWP_HIDEWINDOW 隱藏視窗
SWP_NOACTIVATE 不啟用視窗
SWP_NOMOVE 保持當前位置 (x和y設定將被忽略) &H2
SWP_NOREDRAW 視窗不自動重畫
SWP_NOSIZE 保持當前大小 (cx和cy會被忽略) &H1
SWP_NOZORDER 保持視窗在列表的當前位置 (hWndInsertAfter將被忽略)
SWP_SHOWWINDOW 顯示視窗 &H40
SWP_FRAMECHANGED 強迫一條WM_NCCALCSIZE訊息進入視窗,即使視窗的大小沒有改變
函式的使用很簡單,我們只須在Form_Load中加入如下語句即可:

retValue = SetWindowPos(Me.hwnd, HWND_TOPMOST, Me.CurrentX, Me.CurrentY, 300, 300, SWP_SHOWWINDOW)

  這樣窗體就能保持在所有窗體的前面了。

  為了學習方便,下面提供了原始碼:

註釋:-------------------------------------------
註釋: 讓一個窗體總是處於最前的例子
註釋:-------------------------------------------
註釋:程式說明:
註釋:本例應用SetWindowPos函式,設定窗體的顯示屬性
註釋:來實現讓一個窗體總是處於其他窗體的前面而不會
註釋:被其他窗體所遮住。
註釋:-------------------------------------------
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

註釋:【說明】
註釋: 這個函式能為視窗指定一個新位置和狀態。它也可改變視窗在內部視窗列表中的位置。該函式與DeferWindowPos函式相似,只是它的作用是立即表現出來的(在vb裡使用:針對vb窗體,如它們在win32下遮蔽或最小化,則需重設最頂部狀態。如有必要,請用一個子類處理模組來重設最頂部狀態

註釋:【返回值】
註釋: Long,非零表示成功,零表示失敗。會設定GetLastError

註釋:【備註】
註釋: 視窗成為最頂級視窗後,它下屬的所有視窗也會進入最頂級。一旦將其設為非最頂級,則它的所有下屬和物主視窗也會轉為非最頂級。Z序列用垂直於螢幕的一根假想Z軸量化這種從頂部到底部排列的視窗順序

註釋:【引數表】
註釋: hwnd ----------- Long,欲定位的視窗

註釋: hWndInsertAfter - Long,視窗控制代碼。在視窗列表中,視窗hwnd會置於這個視窗控制代碼的後面。也可能選用下述值之一:
註釋: HWND_BOTTOM 將視窗置於視窗列表底部
註釋: HWND_TOP 將視窗置於Z序列的頂部;Z序列代表在分級結構中,視窗針對一個給定級別的視窗顯示的順序
註釋: HWND_TOPMOST 將視窗置於列表頂部,並位於任何最頂部視窗的前面 -1
註釋: HWND_NOTOPMOST 將視窗置於列表頂部,並位於任何最頂部視窗的後面 -2

註釋: x -------------- Long,視窗新的x座標。如hwnd是一個子視窗,則x用父視窗的客戶區座標表示

註釋: y -------------- Long,視窗新的y座標。如hwnd是一個子視窗,則y用父視窗的客戶區座標表示

註釋: cx ------------- Long,指定新的視窗寬度

註釋: cy ------------- Long,指定新的視窗高度
註釋: wFlags --------- Long,包含了旗標的一個整數,是下列之一:
註釋: SWP_DRAWFRAME 圍繞視窗畫一個框
註釋: SWP_HIDEWINDOW 隱藏視窗
註釋: SWP_NOACTIVATE 不啟用視窗 &H10
註釋: SWP_NOMOVE 保持當前位置 (x和y設定將被忽略) &H2
註釋: SWP_NOREDRAW 視窗不自動重畫
註釋: SWP_NOSIZE 保持當前大小 (cx和cy會被忽略) &H1
註釋: SWP_NOZORDER 保持視窗在列表的當前位置 (hWndInsertAfter將被忽略)
註釋: SWP_SHOWWINDOW 顯示視窗 &H40
註釋: SWP_FRAMECHANGED 強迫一條WM_NCCALCSIZE訊息進入視窗,即使視窗的大小沒有改變
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
  註釋:將窗體設定為處於所有視窗的頂層,注意在 VB 中執行時,
  ’可能不行,但編譯成EXE後就可以了
  retValue = SetWindowPos(Me.hwnd, HWND_TOPMOST, Me.CurrentX,
        Me.CurrentY, 300, 300, SWP_SHOWWINDOW)
End Sub