VB菜單編輯器所提供的默認(rèn)菜單是不能在菜單項(xiàng)中加入圖標(biāo)的,而許多流行的軟件大都采用了漂亮的帶有小圖標(biāo)的菜單,如果想利用VB實(shí)現(xiàn)這種效果就必須要調(diào)用API函數(shù)來實(shí)現(xiàn)了。例中我們使用了三個(gè)與菜單操作有關(guān)的函數(shù):GetMenu、SetMenuItemBitmaps、GetSubMenu。 為了學(xué)習(xí)方便,提供的源碼已經(jīng)作了詳細(xì)的中文注釋,看看源碼框中的代碼: 我們先來聲明API函數(shù),本例中用到的三個(gè)函數(shù)聲明如下: 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函數(shù)的作用得到一個(gè)窗口中的菜單的句柄(這個(gè)菜單句柄應(yīng)理解為處于某個(gè)窗體上的所有菜單的入口),其中各個(gè)參數(shù)的意義如下表所示: 參數(shù) | 意義 | hwnd | Long,窗口句柄。對于vb,這應(yīng)該是一個(gè)窗體句柄 | 返回值 | Long,依附于指定窗口的一個(gè)菜單的句柄(如果有菜單);否則返回零 | GetSubMenu函數(shù)用于取得一個(gè)彈出式菜單(彈出式菜單是指處于任何一級的菜單,注意不是菜單項(xiàng))的句柄,它位于菜單中指定的位置,它的各個(gè)參數(shù)的意義如下: 參數(shù) | 意義 | hMenu | Long,菜單的句柄 | nPos | Long,次級菜單在上級菜單中的位置。第一個(gè)位置的編號為0 | 返回值 | Long,位于指定位置的彈出式菜單的句柄(如果有的話);否則返回零 | SetMenuItemBitmaps函數(shù)用于設(shè)置一幅特定位圖,令其在指定的菜單條目中使用,代替標(biāo)準(zhǔn)的復(fù)選符號(√),它的各個(gè)參數(shù)的意義如下: 參數(shù) | 意義 | hMenu | Long,菜單的句柄 | nPosition | Long,欲設(shè)置位圖的一個(gè)菜單條目的標(biāo)識符。如在wFlags參數(shù)中指定了MF_BYCOMMAND,這個(gè)參數(shù)就代表欲改變的菜單條目的命令I(lǐng)D。如設(shè)置的是MF_BYPOSITION,這個(gè)參數(shù)就代表菜單條目在菜單中的位置(第一個(gè)條目的位置為零) | wFlags | Long,常數(shù)MF_BYCOMMAND或MF_BYPOSITION,取決于nPosition參數(shù) | hBitmapUnchecked | Long,撤消復(fù)選時(shí)為菜單條目顯示的一幅位圖的句柄。如果為零,表示不在未復(fù)選狀態(tài)下顯示任何標(biāo)志 | hBitmapChecked | Long,復(fù)選時(shí)為菜單條目顯示的一幅位圖的句柄??稍O(shè)為零,表示復(fù)選時(shí)不顯示任何標(biāo)志。如兩個(gè)位圖句柄的值都是零,則為這個(gè)條目恢復(fù)使用默認(rèn)復(fù)選位圖 | 返回值 | Long,非零表示成功,零表示失敗。 | 下面我們看看怎樣為菜單的指定項(xiàng)目加上圖標(biāo),步驟一:取得菜單的句柄并賦值給mHandle,接著取得mHandle句柄所指菜單的第一個(gè)彈出式菜單的句柄并賦值給sHandle: mHandle = GetMenu(form.hwnd) sHandle = GetSubMenu(mHandle, 0) 然后就為菜單項(xiàng)加入圖標(biāo),這里我們把wFlags參數(shù)設(shè)為了MF_BYPOSITION,也就是說使用菜單項(xiàng)的位置(從序號0開始)來標(biāo)示菜單項(xiàng): lRet = SetMenuItemBitmaps(sHandle, 0, MF_BYPOSITION, imOpen.Picture, imOpen.Picture) lRet = SetMenuItemBitmaps(sHandle, 1, MF_BYPOSITION, imSave.Picture, imSave.Picture) 以上是為菜單項(xiàng)添加圖標(biāo)的基本方法,例中還演示了怎樣為次級菜單中的菜單項(xiàng)添加圖標(biāo),以及菜單項(xiàng)處于復(fù)選/非復(fù)選狀態(tài)時(shí),對應(yīng)圖標(biāo)發(fā)生變化的方法,具體的實(shí)現(xiàn)方法可以參照程序中的注釋。 |