当一个菜单下子菜单项较多时,一打开菜单就出现了长长的菜单项,如果其他的菜单项下子菜单较少,就显得很不协调。现在的一些软件还允许用户在已有的菜单中添加菜单项,这都会造成子菜单项过多的情况,如果能像某些软件那样将较多的子菜单项分成两列显示就显得美观多了。在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,(mnuItemCount\2)+pad,True,mInfo)
′按新格式显示菜单
mInfo.fType=RGB—STARTNEWCOLUMNWITHVERTBAR
mInfo.fMask=MIIM—TYPE
rv=SetMenuItemInfo(hSubMenu,(mnuItemCount\2)+pad,True,mInfo)
IfrvThenMsgBox″分割完毕″
EndSub
运行后按命令按钮,将发现子菜单项分成了两部分,左边五项,右边四项。
程序运行环境:中文WIN95,VB5.0。->