VB讓表單始終處於最前面

來源:互聯網
上載者:User
應用SetWindowPos函數可以設定一個視窗的位置和狀態,本例正是利用此函數來把一個表單放在所有表單之上,使之總是處於最前面。

  我們先來看看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設定將被忽略) &H2SWP_NOREDRAW視窗不自動重畫SWP_NOSIZE保持當前大小 (cx和cy會被忽略) &H1SWP_NOZORDER保持視窗在列表的當前位置 (hWndInsertAfter將被忽略)SWP_SHOWWINDOW顯示視窗 &H40SWP_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 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.