實現平面工具欄
流行軟件的工具欄上的按鈕是平的按鈕,當鼠標移過時才會突起,這種效果采用貼圖的方法實現十分麻煩,而利用API函數實現起來就很方便,快捷。實現的基本思路是:用SendMessage函數向工具欄發送設置顯示樣式TB_SETSTYLE的消息來改變工具欄的顯示效果。
我們先來聲明API函數,本例中用到的兩個函數聲明如下:
FindWindowEx函數的作用是在窗口列表中尋找與指定條件相符的第一個子窗口,它返回的值是找到的窗口的句柄,其中各個參數的意義如下表所示:
參數 意義
hWnd1 Long,查找子窗口的父窗口。如設為零,表示使用桌面窗口(一般認為它是頂級父窗口)
hWnd2 Long,從這個窗口后開始查找。這樣便可利用對FindWindowEx的多次調用找到符合條件者
lpsz1 String,欲搜索的類名。零表示忽略
lpsz2 String,欲搜索的類名。零表示忽略
返回值 Long,找到的窗口的句柄。如未找到相符窗口,則返回零。
SendMessage函數用于向某一窗口發送消息,它的各個參數的意義如下:
參數 意義
hwnd Long,要接收消息的那個窗口的句柄
wMsg Long,消息的標識符,改變工具欄樣式的標識為TB_SETSTYLE,它的值為 &H400 + 56
wParam Long,具體取決于消息
lParam String,與消息有關,平面工具欄是TBSTYLE_FLAT,它的值是&H800
返回值 Long,找到的窗口的句柄。如未找到相符窗口,則返回零。
我們先利用FindWindowEx函數取得Toolbar控件(是一個窗口,這里所說的窗口包括窗體、按鈕、標簽等各種控件)的窗口句柄,使用語法如下:
然后利用取得的句柄發送TB_GETSTYLE消息給Toolbar,此時程序中的lngStyle返回原有的Toolbar的樣式。
最后發送TB_SETSTYLE消息給Toolbar,設置新的樣式:
lngStyle = lngStyle Or TBSTYLE_FLAT 設置工具欄的新樣式
用API函數實現工具欄的新樣式
通過以上的幾個步驟,平面的工具欄就實現了,現在我們來運行一下程序,看看鼠標移到工具欄上的效果吧。
為了學習方便,以下提供了源代碼并附詳細的中文注釋:
-------------------------------------------
實現平面工具欄
-------------------------------------------
程序說明:
流行軟件的工具欄上的按鈕是平的按鈕,當鼠標移過時才
會突起,這種效果采用貼圖的方法實現十分麻煩,而利用
API函數實現起來就很方便,快捷。
實現的基本思路是:用SendMessage函數向工具欄發送設
置顯示風格STYLE的消息來改變工具欄的顯示效果。
【VB聲明】
【說明】
在窗口列表中尋找與指定條件相符的第一個子窗口
【返回值】
Long,找到的窗口的句柄。如未找到相符窗口,則返回零。會設置GetLastError
【參數表】
hWnd1 ---------- Long,在其中查找子的父窗口。如設為零,表示使用桌面窗口(通常說的頂級窗口都被認為是桌面的子窗口,所以也會對它們進行查找)
hWnd2 ---------- Long,從這個窗口后開始查找。這樣便可利用對FindWindowEx的多次調用找到符合條件的所有子窗口。如設為零,表示從第一個子窗口開始搜索
lpsz1 ---------- String,欲搜索的類名。零表示忽略
lpsz2 ---------- String,欲搜索的類名。零表示忽略
【VB聲明】
【說明】
調用一個窗口的窗口函數,將一條消息發給那個窗口。除非消息處理完畢,否則該函數不會返回。SendMessageBynum,
SendMessageByString是該函數的“類型安全”聲明形式
【返回值】
Long,由具體的消息決定
【參數表】
hwnd ----------- Long,要接收消息的那個窗口的句柄
wMsg ----------- Long,消息的標識符
wParam --------- Long,具體取決于消息
lParam --------- Any,具體取決于消息
設置工具欄為新的樣式
得到Toolbar的句柄
得到原有的Toolbar的樣式
設置一個圖形在上、文字在下的平面工具欄
用API函數實現工具欄的新樣式
刷新工具欄
調用函數改變工具欄
我們先來聲明API函數,本例中用到的兩個函數聲明如下:
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" _ (ByVal hWnd1 As Long, _ ByVal hWnd2 As Long, _ ByVal lpsz1 As String, _ ByVal lpsz2 As String) As Long Private Declare Function SendMessage Lib "user32" Alias _ "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, _ ByVal wParam As Integer, ByVal lParam As Any) As Long |
FindWindowEx函數的作用是在窗口列表中尋找與指定條件相符的第一個子窗口,它返回的值是找到的窗口的句柄,其中各個參數的意義如下表所示:
參數 意義
hWnd1 Long,查找子窗口的父窗口。如設為零,表示使用桌面窗口(一般認為它是頂級父窗口)
hWnd2 Long,從這個窗口后開始查找。這樣便可利用對FindWindowEx的多次調用找到符合條件者
lpsz1 String,欲搜索的類名。零表示忽略
lpsz2 String,欲搜索的類名。零表示忽略
返回值 Long,找到的窗口的句柄。如未找到相符窗口,則返回零。
SendMessage函數用于向某一窗口發送消息,它的各個參數的意義如下:
參數 意義
hwnd Long,要接收消息的那個窗口的句柄
wMsg Long,消息的標識符,改變工具欄樣式的標識為TB_SETSTYLE,它的值為 &H400 + 56
wParam Long,具體取決于消息
lParam String,與消息有關,平面工具欄是TBSTYLE_FLAT,它的值是&H800
返回值 Long,找到的窗口的句柄。如未找到相符窗口,則返回零。
我們先利用FindWindowEx函數取得Toolbar控件(是一個窗口,這里所說的窗口包括窗體、按鈕、標簽等各種控件)的窗口句柄,使用語法如下:
| lngHWND = FindWindowEx(tBar.hwnd, 0&, "ToolbarWindow32", vbNullString) |
然后利用取得的句柄發送TB_GETSTYLE消息給Toolbar,此時程序中的lngStyle返回原有的Toolbar的樣式。
| lngStyle = SendMessage(lngHWND, TB_GETSTYLE, 0&, 0&) |
最后發送TB_SETSTYLE消息給Toolbar,設置新的樣式:
lngStyle = lngStyle Or TBSTYLE_FLAT 設置工具欄的新樣式
用API函數實現工具欄的新樣式
| lngResult = SendMessage(lngHWND, TB_SETSTYLE, 0, lngStyle) |
通過以上的幾個步驟,平面的工具欄就實現了,現在我們來運行一下程序,看看鼠標移到工具欄上的效果吧。
為了學習方便,以下提供了源代碼并附詳細的中文注釋:
-------------------------------------------
實現平面工具欄
-------------------------------------------
程序說明:
流行軟件的工具欄上的按鈕是平的按鈕,當鼠標移過時才
會突起,這種效果采用貼圖的方法實現十分麻煩,而利用
API函數實現起來就很方便,快捷。
實現的基本思路是:用SendMessage函數向工具欄發送設
置顯示風格STYLE的消息來改變工具欄的顯示效果。
| Const WM_USER = &H400 Const TB_SETSTYLE = WM_USER + 56 Const TB_GETSTYLE = WM_USER + 57 Const TBSTYLE_FLAT = &H800 Const TBSTYLE_LIST = &H1000 |
【VB聲明】
| Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long |
【說明】
在窗口列表中尋找與指定條件相符的第一個子窗口
【返回值】
Long,找到的窗口的句柄。如未找到相符窗口,則返回零。會設置GetLastError
【參數表】
hWnd1 ---------- Long,在其中查找子的父窗口。如設為零,表示使用桌面窗口(通常說的頂級窗口都被認為是桌面的子窗口,所以也會對它們進行查找)
hWnd2 ---------- Long,從這個窗口后開始查找。這樣便可利用對FindWindowEx的多次調用找到符合條件的所有子窗口。如設為零,表示從第一個子窗口開始搜索
lpsz1 ---------- String,欲搜索的類名。零表示忽略
lpsz2 ---------- String,欲搜索的類名。零表示忽略
| Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" _ (ByVal hWnd1 As Long, _ ByVal hWnd2 As Long, _ ByVal lpsz1 As String, _ ByVal lpsz2 As String) As Long |
【VB聲明】
| Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long |
【說明】
調用一個窗口的窗口函數,將一條消息發給那個窗口。除非消息處理完畢,否則該函數不會返回。SendMessageBynum,
SendMessageByString是該函數的“類型安全”聲明形式
【返回值】
Long,由具體的消息決定
【參數表】
hwnd ----------- Long,要接收消息的那個窗口的句柄
wMsg ----------- Long,消息的標識符
wParam --------- Long,具體取決于消息
lParam --------- Any,具體取決于消息
| Private Declare Function SendMessage Lib "user32" Alias _ "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, _ ByVal wParam As Integer, ByVal lParam As Any) As Long |
設置工具欄為新的樣式
| Private Sub SetToolbar(tBar As Toolbar) Dim lngResult As Long Dim lngHWND As Long Dim lngStyle As Long |
得到Toolbar的句柄
| lngHWND = FindWindowEx(tBar.hwnd, 0&, "ToolbarWindow32", vbNullString) |
得到原有的Toolbar的樣式
| lngStyle = SendMessage(lngHWND, TB_GETSTYLE, 0&, 0&) |
設置一個圖形在上、文字在下的平面工具欄
| lngStyle = lngStyle Or TBSTYLE_FLAT |
用API函數實現工具欄的新樣式
| lngResult = SendMessage(lngHWND, TB_SETSTYLE, 0, lngStyle) |
刷新工具欄
| tBar.Refresh End Sub Private Sub exitfile_Click() Unload Me End Sub Private Sub Form_Load() |
調用函數改變工具欄
| Call SetToolbar(Me.Toolbar1) End Sub |