龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > VB开发 >

VB中实现菜单分割

时间:2009-12-30 15:42来源:未知 作者:admin 点击:
分享到:
当一个菜单下子菜单项较多时,一打开菜单就出现了长长的菜单项,如果其他的菜单项下子菜单较少,就显得很不协调。现在的一些软件还允许用户在已有的菜单中添加菜单项,这都会
当一个菜单下子菜单项较多时,一打开菜单就出现了长长的菜单项,如果其他的菜单项下子菜单较少,就显得很不协调。现在的一些软件还允许用户在已有的菜单中添加菜单项,这都会造成子菜单项过多的情况,如果能像某些软件那样将较多的子菜单项分成两列显示就显得美观多了。在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。->

精彩图集

赞助商链接