WEB开发网
开发学院软件开发VB VB中实现菜单分割 阅读

VB中实现菜单分割

 2006-02-27 21:08:46 来源:WEB开发网   
核心提示:当一个菜单下子菜单项较多时,一打开菜单就出现了长长的菜单项,VB中实现菜单分割,如果其他的菜单项下子菜单较少,就显得很不协调,右边四项,程序运行环境:中文WIN95,现在的一些软件还允许用户在已有的菜单中添加菜单项,这都会造成子菜单项过多的情况
当一个菜单下子菜单项较多时,一打开菜单就出现了长长的菜单项,如果其他的菜单项下子菜单较少,就显得很不协调。现在的一些软件还允许用户在已有的菜单中添加菜单项,这都会造成子菜单项过多的情况,如果能像某些软件那样将较多的子菜单项分成两列显示就显得美观多了。在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。->

Tags:VB 实现 菜单

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接