vb菜單加入圖標


 

VB菜單編輯器所提供的默認菜單是不能在菜單項中加入圖標的,而許多流行的軟件大都采用了漂亮的帶有小圖標的菜單,如果想利用VB實現這種效果就必須要調用API函數來實現了。例中我們使用了三個與菜單操作有關的函數:GetMenu、SetMenuItemBitmaps、GetSubMenu。 
  為了學習方便,提供的源碼已經作了詳細的中文注釋,看看源碼框中的代碼: 
代碼:  

’------------------------------------------------- 
’           讓菜單中出現圖標一法 
’------------------------------------------------- 
’           洪恩在線 求知無限 
’------------------------------------------------- 
’程序應用三個API函數實現了在菜單項中加入小圖標 
’GetMenu、GetSubMenu、SetMenuItemBitmaps 
’------------------------------------------------- 
Option Explicit 
’【VB聲明】 
’ Private Declare Function GetMenu Lib "user32" (ByVal hwnd As Long) As Long 
’【說明】 
’ 取得窗口中一個菜單的句柄 
’【返回值】 
’ Long,依附於指定窗口的一個菜單的句柄(如果有菜單);否則返回零 
’【參數表】 
’ hwnd ----------- Long,窗口句柄。對於vb,這應該是一個窗體句柄。注意可能不是子窗口的句柄 
Private Declare Function GetMenu Lib "user32" _ 
(ByVal hwnd As Long) As Long------------------------------------------------- 
’【VB聲明】 
’ Private Declare Function GetSubMenu Lib "user32" (ByVal hMenu As Long, ByVal nPos As Long) As Long 
’【說明】 
’ 取得一個彈出式菜單的句柄,它位於菜單中指定的位置 
’【返回值】 
’ Long,位於指定位置的彈出式菜單的句柄(如果有的話);否則返回零 
’【參數表】 
’ hMenu ---------- Long,菜單的句柄 
’ nPos ----------- Long,條目在菜單中的位置。第一個條目的編號為0 
Private Declare Function GetSubMenu Lib "user32" _ 
(ByVal hMenu As Long, ByVal nPos As Long) As Long------------------------------------------------- 
’【VB聲明】 
’ Private Declare Function SetMenuItemBitmaps Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long, ByVal hBitmapUnchecked As Long, ByVal hBitmapChecked As Long) As Long 
’【說明】 
’ 設置一幅特定位圖,令其在指定的菜單條目中使用,代替標准的復選符號(√)。位圖的大小必須與菜單復選符號的正確大小相符,這個正確大小可以由GetMenuCheckMarkDimensions函數獲得 
’【返回值】 
’ Long,非零表示成功,零表示失敗。會設置GetLastError 
’【備注】 
’ 使用的位圖可能由多個條目共享。一旦不再需要,位圖必須由應用程序清除,因為windows不能自動對它進行清除 
’【參數表】 
’ hMenu ---------- Long,菜單句柄 
’ nPosition ------ Long,欲設置位圖的一個菜單條目的標識符。如在wFlags參數中指定了MF_BYCOMMAND,這個參數就代表欲改變的菜單條目的命令ID。如設置的是MF_BYPOSITION,這個參數就代表菜單條目在菜單中的位置(第一個條目的位置為零) 
’ wFlags --------- Long,常數MF_BYCOMMAND或MF_BYPOSITION,取決於nPosition參數 
’ hBitmapUnchecked - Long,撤消復選時為菜單條目顯示的一幅位圖的句柄。如果為零,表示不在未復選狀態下顯示任何標志 
’ hBitmapChecked - Long,復選時為菜單條目顯示的一幅位圖的句柄。可設為零,表示復選時不顯示任何標志。如兩個位圖句柄的值都是零,則為這個條目恢復使用默認復選位圖 
Private Declare Function SetMenuItemBitmaps Lib "user32" _ 
(ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long, _ 
  ByVal hBitmapUnchecked As Long, ByVal hBitmapChecked As Long) As Long------------------------------------------------- 
Const MF_BYPOSITION = &H400& 
Private Sub form_Load() 
  Dim mHandle As Long, lRet As Long, sHandle As Long, sHandle2 As Long 
  ’取得菜單的句柄並賦值給mHandle 
  mHandle = GetMenu(hwnd) 
  ’取得mHandle句柄所指菜單的第一個彈出式菜單(文件&F)的句柄並賦值給sHandle 
  sHandle = GetSubMenu(mHandle, 0) 
  ’將彈出式菜單的第0-4項加上圖片,為什么跳過2呢?因為2是分割線 
  lRet = SetMenuItemBitmaps(sHandle, 0, MF_BYPOSITION, imOpen.Picture, imSave.Picture) 
  lRet = SetMenuItemBitmaps(sHandle, 1, MF_BYPOSITION, imSave.Picture, imSave.Picture) 
  lRet = SetMenuItemBitmaps(sHandle, 3, MF_BYPOSITION, imPrint.Picture, imPrint.Picture) 
  lRet = SetMenuItemBitmaps(sHandle, 4, MF_BYPOSITION, imPrintSetup.Picture, imPrintSetup.Picture) 
  ’取得mHandle句柄所指菜單的第二個彈出式菜單(編輯&E)的句柄並賦值給sHandle 
  sHandle = GetSubMenu(mHandle, 1) 
  ’取得sHandle句柄所指菜單的第一個次級菜單(次級菜單&S)的句柄並賦值給sHandle2 
  sHandle2 = GetSubMenu(sHandle, 0) 
  ’將次級菜單中的第1項加上圖片 
  lRet = SetMenuItemBitmaps(sHandle2, 0, MF_BYPOSITION, imCopy.Picture, imCopy.Picture) 
’提示:在SetMenuItemBitmaps()我們把后兩項設為相同的圖片,如果設為不同的兩張圖片會有什么效果呢? 
’     原來這兩張圖片分別表示復選和撤消復選時的狀態,你只須在菜單項被點擊的函數中加入以下語句: 
’     Private Sub mnuOpen_Click() 
’     If mnuOpen.Checked = True Then 
’     mnuOpen.Checked = FalseElse: mnuOpen.Checked = TrueEnd IfEnd Sub 
’     然后在SetMenuItemBitmaps()我們把后兩項設為不同的圖片即可,有興趣的話試一試。 
End Sub 
  

  我們先來聲明API函數,本例中用到的三個函數聲明如下: 
   Private Declare Function GetMenu Lib "user32" (ByVal hwnd As Long) As Long 
   Private Declare Function GetSubMenu Lib "user32" (ByVal hMenu As Long, ByVal nPos As Long) As Long 
   Private Declare Function SetMenuItemBitmaps Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long, ByVal hBitmapUnchecked As Long, ByVal hBitmapChecked As Long) As Long  
  GetMenu函數的作用得到一個窗口中的菜單的句柄(這個菜單句柄應理解為處於某個窗體上的所有菜單的入口),其中各個參數的意義如下表所示: 
參數 意義  
hwnd Long,窗口句柄。對於vb,這應該是一個窗體句柄  
返回值 Long,依附於指定窗口的一個菜單的句柄(如果有菜單);否則返回零  
  GetSubMenu函數用於取得一個彈出式菜單(彈出式菜單是指處於任何一級的菜單,注意不是菜單項)的句柄,它位於菜單中指定的位置,它的各個參數的意義如下: 
參數 意義  
hMenu Long,菜單的句柄  
nPos Long,次級菜單在上級菜單中的位置。第一個位置的編號為0  
返回值 Long,位於指定位置的彈出式菜單的句柄(如果有的話);否則返回零  
  SetMenuItemBitmaps函數用於設置一幅特定位圖,令其在指定的菜單條目中使用,代替標准的復選符號(√),它的各個參數的意義如下: 
參數 意義  
hMenu Long,菜單的句柄  
nPosition Long,欲設置位圖的一個菜單條目的標識符。如在wFlags參數中指定了MF_BYCOMMAND,這個參數就代表欲改變的菜單條目的命令ID。如設置的是MF_BYPOSITION,這個參數就代表菜單條目在菜單中的位置(第一個條目的位置為零)  
wFlags Long,常數MF_BYCOMMAND或MF_BYPOSITION,取決於nPosition參數  
hBitmapUnchecked Long,撤消復選時為菜單條目顯示的一幅位圖的句柄。如果為零,表示不在未復選狀態下顯示任何標志  
hBitmapChecked Long,復選時為菜單條目顯示的一幅位圖的句柄。可設為零,表示復選時不顯示任何標志。如兩個位圖句柄的值都是零,則為這個條目恢復使用默認復選位圖  
返回值 Long,非零表示成功,零表示失敗。  
  下面我們看看怎樣為菜單的指定項目加上圖標,步驟一:取得菜單的句柄並賦值給mHandle,接着取得mHandle句柄所指菜單的第一個彈出式菜單的句柄並賦值給sHandle: 
   mHandle = GetMenu(form.hwnd) 
   sHandle = GetSubMenu(mHandle, 0)  
  然后就為菜單項加入圖標,這里我們把wFlags參數設為了MF_BYPOSITION,也就是說使用菜單項的位置(從序號0開始)來標示菜單項: 
   lRet = SetMenuItemBitmaps(sHandle, 0, MF_BYPOSITION, imOpen.Picture, imOpen.Picture) 
   lRet = SetMenuItemBitmaps(sHandle, 1, MF_BYPOSITION, imSave.Picture, imSave.Picture)  
  以上是為菜單項添加圖標的基本方法,例中還演示了怎樣為次級菜單中的菜單項添加圖標,以及菜單項處於復選/非復選狀態時,對應圖標發生變化的方法,具體的實現方法可以參照程序中的注釋


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM