top
Loading...
實現平面工具欄
流行軟件的工具欄上的按鈕是平的按鈕,當鼠標移過時才會突起,這種效果采用貼圖的方法實現十分麻煩,而利用API函數實現起來就很方便,快捷。實現的基本思路是:用SendMessage函數向工具欄發送設置顯示樣式TB_SETSTYLE的消息來改變工具欄的顯示效果。

我們先來聲明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
作者:http://www.zhujiangroad.com
來源:http://www.zhujiangroad.com
北斗有巢氏 有巢氏北斗