當一個菜單下子菜單項較多時,一打開菜單就出現了長長的菜單項,如果其他的菜單項下子菜單較少,就顯得很不協調。現在的一些軟件還允許用戶在已有的菜單中添加菜單項,這都會造成子菜單項過多的情況,如果能像某些軟件那樣將較多的子菜單項分成兩列顯示就顯得美觀多了。在VB中要實現這一功能還是比較方便的,下面舉例說明。
實現菜單分割這一功能需要使用API函數,思路是:首先獲得菜單句柄,從而可得到其子菜單項數,然後將子菜單項數除以2,若子菜單項數為奇數,則將多余的一項劃到第一部分,然後利用API函數SetMenuItemInfo重新設定菜單顯示形式即可。
下面是一個例子。首先用菜單生成器制做一個包括9個子菜單項的菜單,然後,在總體聲明部分聲明用到的API函數和常數,這些可以從API說明文件中復制。
OptionExplicit
′菜單信息結構說明
PrivateTypeMENUITEMINFO
cbSizeAsLong
fMaskAsLong
fTypeAsLong
fStateAsLong
wIDAsLong
hSubMenuAsLong
hbmpCheckedAsLong
hbmpUncheckedAsLong
dwItemDataAsLong
dwTypeDataAsString
cchAsLong
EndType
′所需的API函數和常數
PrivateDeclareFunctionGetMenuLib″user32″-
(ByValhwndAsLong)AsLong
PrivateDeclareFunctionGetMenuItemCountLib″user32″-
(ByValhMenuAsLong)AsLong
PrivateDeclareFunctionGetSubMenuLib″user32″-
(ByValhMenuAsLong,ByValnPosAsLong)AsLong
PrivateDeclareFunctionGetMenuItemInfoLib″user32″-
Alias″GetMenuItemInfoA″(ByValhMenuAsLong,ByValunAsLong,-
ByValbAsBoolean,lpmiiAsMENUITEMINFO)AsLong
PrivateDeclareFunctionSetMenuItemInfoLib″user32″-
Alias″SetMenuItemInfoA″(ByValhMenuAsLong,ByValuItemAsLong,-
ByValfByPositionAsLong,lpmiiAsMENUITEMINFO)AsLong
ConstMIIM—TYPE=&H10
ConstRGB—STARTNEWCOLUMNWITHVERTBAR=&H20&
ConstMFT—STRING=&H0&
在窗體中添加一個命令按鈕,Caption=“分割菜單”,雙擊寫如下代碼:
PrivateSubCommand1—Click()
DimrvAsLong
DimhSubMenuAsLong
DimmnuItemCountAsLong
DimmInfoAsMENUITEMINFO
DimpadAsLong
′獲取菜單項句柄和子菜單項數
hSubMenu=GetSubMenu(GetMenu(Me.hwnd),0)
mnuItemCount=GetMenuItemCount(hSubMenu)
′將子菜單項分成兩部分
IfmnuItemCountMod2<>0Thenpad=1
′取得當前菜單信息
mInfo.cbSize=Len(mInfo)
mInfo.fMask=MIIM—TYPE
mInfo.fType=MFT—STRING
mInfo.dwTypeData=Space$(256)
mInfo.cch=Len(mInfo.dwTypeData)
rv=GetMenuItemInfo(hSubMenu,(mnuItemCount2)+pad,True,mInfo)
′按新格式顯示菜單
mInfo.fType=RGB—STARTNEWCOLUMNWITHVERTBAR
mInfo.fMask=MIIM—TYPE
rv=SetMenuItemInfo(hSubMenu,(mnuItemCount2)+pad,True,mInfo)
IfrvThenMsgBox″分割完畢″
EndSub
運行後按命令按鈕,將發現子菜單項分成了兩部分,左邊五項,右邊四項。
程序運行環境:中文WIN95,VB5.0。->