说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

在菜单中加入图标 -VB资料

HTML文档下载 WORD文档下载 PDF文档下载
在菜单中加入图标 -VB资料

 
VB菜单编辑器所提供的默认菜单是不能在菜单项中加入图标的,而许多流行的软件大都采用了漂亮的带有小图标的菜单,如果想利用VB实现这种效果就必须要调用API函数来实现了。例中我们使用了三个与菜单操作有关的函数:GetMenu、SetMenuItemBitmaps、GetSubMenu。

  
  我们先来声明API函数,本例中用到的三个函数声明如下:
   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函数的作用得到一个窗口中的菜单的句柄(这个菜单句柄应理解为处于某个窗体上的所有菜单的入口),其中各个参数的意义如下表所示:

参数 意义
hwnd Long,窗口句柄。对于vb,这应该是一个窗体句柄
返回值 Long,依附于指定窗口的一个菜单的句柄(如果有菜单);否则返回零

  GetSubMenu函数用于取得一个弹出式菜单(弹出式菜单是指处于任何一级的菜单,注意不是菜单项)的句柄,它位于菜单中指定的位置,它的各个参数的意义如下:

参数 意义
hMenu Long,菜单的句柄
nPos Long,次级菜单在上级菜单中的位置。第一个位置的编号为0
返回值 Long,位于指定位置的弹出式菜单的句柄(如果有的话);否则返回零

  SetMenuItemBitmaps函数用于设置一幅特定位图,令其在指定的菜单条目中使用,代替标准的复选符号(√),它的各个参数的意义如下:

参数 意义
hMenu Long,菜单的句柄
nPosition Long,欲设置位图的一个菜单条目的标识符。如在wFlags参数中指定了MF_BYCOMMAND,这个参数就代表欲改变的菜单条目的命令ID。如设置的是MF_BYPOSITION,这个参数就代表菜单条目在菜单中的位置(第一个条目的位置为零)
wFlags Long,常数MF_BYCOMMAND或MF_BYPOSITION,取决于nPosition参数
hBitmapUnchecked Long,撤消复选时为菜单条目显示的一幅位图的句柄。如果为零,表示不在未复选状态下显示任何标志
hBitmapChecked Long,复选时为菜单条目显示的一幅位图的句柄。可设为零,表示复选时不显示任何标志。如两个位图句柄的值都是零,则为这个条目恢复使用默认复选位图
返回值 Long,非零表示成功,零表示失败。

  下面我们看看怎样为菜单的指定项目加上图标,步骤一:取得菜单的句柄并赋值给mHandle,接着取得mHandle句柄所指菜单的第一个弹出式菜单的句柄并赋值给sHandle:
   mHandle = GetMenu(form.hwnd)
   sHandle = GetSubMenu(mHandle, 0)

  然后就为菜单项加入图标,这里我们把wFlags参数设为了MF_BYPOSITION,也就是说使用菜单项的位置(从序号0开始)来标示菜单项:
   lRet = SetMenuItemBitmaps(sHandle, 0, MF_BYPOSITION, imOpen.Picture, imOpen.Picture)
   lRet = SetMenuItemBitmaps(sHandle, 1, MF_BYPOSITION, imSave.Picture, imSave.Picture)

  以上是为菜单项添加图标的基本方法,例中还演示了怎样为次级菜单中的菜单项添加图标,以及菜单项处于复选/非复选状态时,对应图标发生变化的方法,具体的实现方法可以参照程序中的注释。
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘