VB高級界面編程(一)
大家可能都會用vb編寫菜單程序,vb中有菜單編輯器可以輕松地編寫命令按鈕菜單,但大家可能對圖形菜單的制作不太了解(如下圖)。他可能在vc中編寫比較容易。要在vb中就要引用API編寫。下面就給大家介紹一下編寫過程。

先介紹一下菜單的基本知識,對vb而言每一個菜單命令或子菜單,都算是一個菜單對象,但對WINDOWS而言,會以一個hMenu(菜單句柄)代表整個菜單,而每一個子菜單則以一個hSubMenu(子菜單句柄)來代表,但每一個菜單命令(MenuItem)則不再給予handle(句柄),而是以Menu ID代表。
為獲得某一個Form的hMenu,我們必須調用GetMenu API函數:
Declare Function GetMenu Lib "user32" (ByVal hwnd As Long) As Long
參數 HWnd:某一個含有菜單窗口hWnd。
返回值 若該菜單含有菜單,則返回hMenu,否則返回0。
調用 Dim hMenu As Long
hMenu = GetMenu(Me.hwnd) `獲取窗口句柄
接下來要取得菜單的hSubMenu,則是調用GetSubMenu API函數:
Declare Function GetSubMenu Lib "user32" (ByVal hMenu As Long, ByVal nPos As Long) As Long
參數 hMenu:傳入hMenu 。
npos:欲取得subMenu的位置,subMenu的位置從0算起。
返回值 不等于0,表示hSubMenu: =,表示失敗。
調用 Dim hSubMenu As Long
hMenu = GetMenu(Me.hwnd)
`取得Form菜單的第0個Submenu `調入的一個菜單的位置
hSubMenu = GetSubMenu(hMenu, 0) `調入的一個菜單的位置
為取得Menu ID所調用的API函數是GetMenuItemID:
Declare Function GetMenuItemID Lib "user32" (ByVal hMenu As Long, ByVal nPos As Long) As Long
Dim hMenu As Long, hSubMenu As Long, menuid As Long
hMenu = GetMenu(Me.hwnd)
hSubMenu = GetSubMenu(hMenu, 0)
menuid = GetMenuItemID(hSubMenu, 0) ‘調入的一個菜單命令
取得hMenu,hSubMenu及Menu ID之后,我們可以調用ModifyMenModifyMenu API函數改變某一個菜單命令或子菜單的“標題、圖形、或Menu ID”。ModifyMenu幾個參數的意義如下:
Declare Function ModifyMenu Lib "user32" Alias "ModifyMenuA" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long, ByVal wIDNewItem As Long, ByVal lpString As Any) As Long
HMenu: 傳入hMenu或hSubMenu。
nPosition: 欲改變菜單命令的位置或Menu ID,這一參數取決于wFlags參數。
wFlags: 可以是以下設置值的組合:
1. MF_BYPOSITION 表示菜單命令的位置。
2. MF_BYCOMMAND 表示菜單命令的Menu ID,他不與1并存。
3. MF_STRING 表示菜單命令的文字標題。
4. MF_BITMAP 表示菜單命令的圖片,他不與3并存。
wIDNewItem:傳入原有的Menu ID,也就是不要改變。
IpString: 新的菜單命令的文字標題或圖片。
調用
Dim hMenu As Long, hSubMenu As Long, menuid As Long
hMenu = GetMenu(Me.hwnd)
hSubMenu = GetSubMenu(hMenu, 0) ‘0代表菜單的一項
menuid = GetMenuItemID(hSubMenu, 0) ‘0代表子菜單的第一項
ModifyMenu hSubMenu, 0, MF_BITMAP , menuid, pic(0).Handle
在調用前使用以下語句載入圖片:
Static pic as picture
Set pic =loadpicture(app.path & “ 圖片名稱“)
以上所介紹的菜單API函數其實只占菜單API函數的一小部分,但對編寫圖形菜單程序已綽綽有余,實際上,我們并不需要完全使用API函數來建立菜單,而是先用VB所提供的菜單編輯器先編輯好純文字菜單,接著再利用API將某一些菜單命令或子菜單改變成圖形。最后我把API聲明的模塊告訴大家。主程序部分大家根據需要參照以上介紹編寫。
Option Explicit
Public Const MF_BYCOMMAND = &H0&
Public Const MF_BYPOSITION = &H400&
Public Const MF_BITMAP = &H4&
Public Const MF_STRING = &H0&
Declare Function GetMenu Lib "user32" (ByVal hwnd As Long) As Long
Declare Function GetSubMenu Lib "user32" (ByVal hMenu As Long, ByVal nPos As Long) As Long
Declare Function GetMenuItemID Lib "user32" (ByVal hMenu As Long, ByVal nPos As Long) As Long
Declare Function ModifyMenu Lib "user32" Alias "ModifyMenuA" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long, ByVal wIDNewItem As Long, ByVal lpString As Any) As Long

先介紹一下菜單的基本知識,對vb而言每一個菜單命令或子菜單,都算是一個菜單對象,但對WINDOWS而言,會以一個hMenu(菜單句柄)代表整個菜單,而每一個子菜單則以一個hSubMenu(子菜單句柄)來代表,但每一個菜單命令(MenuItem)則不再給予handle(句柄),而是以Menu ID代表。
為獲得某一個Form的hMenu,我們必須調用GetMenu API函數:
Declare Function GetMenu Lib "user32" (ByVal hwnd As Long) As Long
參數 HWnd:某一個含有菜單窗口hWnd。
返回值 若該菜單含有菜單,則返回hMenu,否則返回0。
調用 Dim hMenu As Long
hMenu = GetMenu(Me.hwnd) `獲取窗口句柄
接下來要取得菜單的hSubMenu,則是調用GetSubMenu API函數:
Declare Function GetSubMenu Lib "user32" (ByVal hMenu As Long, ByVal nPos As Long) As Long
參數 hMenu:傳入hMenu 。
npos:欲取得subMenu的位置,subMenu的位置從0算起。
返回值 不等于0,表示hSubMenu: =,表示失敗。
調用 Dim hSubMenu As Long
hMenu = GetMenu(Me.hwnd)
`取得Form菜單的第0個Submenu `調入的一個菜單的位置
hSubMenu = GetSubMenu(hMenu, 0) `調入的一個菜單的位置
為取得Menu ID所調用的API函數是GetMenuItemID:
Declare Function GetMenuItemID Lib "user32" (ByVal hMenu As Long, ByVal nPos As Long) As Long
Dim hMenu As Long, hSubMenu As Long, menuid As Long
hMenu = GetMenu(Me.hwnd)
hSubMenu = GetSubMenu(hMenu, 0)
menuid = GetMenuItemID(hSubMenu, 0) ‘調入的一個菜單命令
取得hMenu,hSubMenu及Menu ID之后,我們可以調用ModifyMenModifyMenu API函數改變某一個菜單命令或子菜單的“標題、圖形、或Menu ID”。ModifyMenu幾個參數的意義如下:
Declare Function ModifyMenu Lib "user32" Alias "ModifyMenuA" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long, ByVal wIDNewItem As Long, ByVal lpString As Any) As Long
HMenu: 傳入hMenu或hSubMenu。
nPosition: 欲改變菜單命令的位置或Menu ID,這一參數取決于wFlags參數。
wFlags: 可以是以下設置值的組合:
1. MF_BYPOSITION 表示菜單命令的位置。
2. MF_BYCOMMAND 表示菜單命令的Menu ID,他不與1并存。
3. MF_STRING 表示菜單命令的文字標題。
4. MF_BITMAP 表示菜單命令的圖片,他不與3并存。
wIDNewItem:傳入原有的Menu ID,也就是不要改變。
IpString: 新的菜單命令的文字標題或圖片。
調用
Dim hMenu As Long, hSubMenu As Long, menuid As Long
hMenu = GetMenu(Me.hwnd)
hSubMenu = GetSubMenu(hMenu, 0) ‘0代表菜單的一項
menuid = GetMenuItemID(hSubMenu, 0) ‘0代表子菜單的第一項
ModifyMenu hSubMenu, 0, MF_BITMAP , menuid, pic(0).Handle
在調用前使用以下語句載入圖片:
Static pic as picture
Set pic =loadpicture(app.path & “ 圖片名稱“)
以上所介紹的菜單API函數其實只占菜單API函數的一小部分,但對編寫圖形菜單程序已綽綽有余,實際上,我們并不需要完全使用API函數來建立菜單,而是先用VB所提供的菜單編輯器先編輯好純文字菜單,接著再利用API將某一些菜單命令或子菜單改變成圖形。最后我把API聲明的模塊告訴大家。主程序部分大家根據需要參照以上介紹編寫。
Option Explicit
Public Const MF_BYCOMMAND = &H0&
Public Const MF_BYPOSITION = &H400&
Public Const MF_BITMAP = &H4&
Public Const MF_STRING = &H0&
Declare Function GetMenu Lib "user32" (ByVal hwnd As Long) As Long
Declare Function GetSubMenu Lib "user32" (ByVal hMenu As Long, ByVal nPos As Long) As Long
Declare Function GetMenuItemID Lib "user32" (ByVal hMenu As Long, ByVal nPos As Long) As Long
Declare Function ModifyMenu Lib "user32" Alias "ModifyMenuA" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long, ByVal wIDNewItem As Long, ByVal lpString As Any) As Long