教程中国
PHOTOSHOP CS9.0中文版 MAYA 8.5 FOR WINDOWS Corel Painter v9.0 Flash MX2004 中文版 Illustrator cs2 中文版
VC++6.0含sp6 中英文版 VB6.0 +sp6 简体中文版 Borland Delphi 7汉化版 MSDN for vb6.0中文版 Visual Studio 2005简体
教程中国下属 文件存储共享专家BIBIDU.COM 提供大型软件,教材,源码,电影,音乐,图书等下载 更多精品请点此进入
  您目前所在位置: 教程中国 >> 编程基地 >> VB >> 在菜单中加入图标 RSS订阅
在菜单中加入图标
教程(视频,书籍)下载:  ASP.NET AutoCAD 数据库 C# ASP java photoshop 网页设计 delphi 3dmax Flash C++ VB 张孝祥 实例   更多请进入BIBIDU搜索
IT搜索引擎   
在菜单中加入图标
  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)  

  以上是为菜单项添加图标的基本方法,例中还演示了怎样为次级菜单中的菜单项添加图标,以及菜单项处于复选/非复选状态时,对应图标发生变化的方法,具体的实现方法可以参照程序中的注释。
  为了学习方便,这里提供了全部源码并作了详细的中文注释:
-------------------------------------------------
让菜单中出现图标一法
-------------------------------------------------
程序应用三个API函数实现了在菜单项中加入小图标
GetMenu、GetSubMenu、SetMenuItemBitmaps
-------------------------------------------------
Option Explicit
【VB声明】

Private Declare Function GetMenu Lib "user32" (ByVal hwnd As Long) As Long

【说明】
取得窗口中一个菜单的句柄

【返回值】
Long,依附于指定窗口的一个菜单的句柄(如果有菜单);否则返回零

【参数表】
hwnd ----------- Long,窗口句柄。对于vb,这应该是一个窗体句柄。注意可能不是子窗口的句柄
Private Declare Function GetMenu Lib "user32" _
(ByVal hwnd As Long) As Long
-------------------------------------------------
【VB声明】

Private Declare Function GetSubMenu Lib "user32" (ByVal hMenu As Long, ByVal nPos As Long) As Long

【说明】
取得一个弹出式菜单的句柄,它位于菜单中指定的位置

【返回值】
Long,位于指定位置的弹出式菜单的句柄(如果有的话);否则返回零

【参数表】
hMenu ---------- Long,菜单的句柄

nPos ----------- Long,条目在菜单中的位置。第一个条目的编号为0

Private Declare Function GetSubMenu Lib "user32" _
(ByVal hMenu As Long, ByVal nPos As Long) As Long

【VB声明】

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

【说明】
设置一幅特定位图,令其在指定的菜单条目中使用,代替标准的复选符号(√)。位图的大小必须与菜单复选符号的正确大小相符,这个正确大小可以由GetMenuCheckMarkDimensions函数获得

【返回值】
Long,非零表示成功,零表示失败。会设置GetLastError

【备注】
使用的位图可能由多个条目共享。一旦不再需要,位图必须由应用程序清除,因为windows不能自动对它进行清除

【参数表】
  hMenu ---------- Long,菜单句柄

  nPosition ------ Long,欲设置位图的一个菜单条目的标识符。如在wFlags参数中指定了MF_BYCOMMAND,这个参数就代表欲改变的菜单条目的命令ID。如设置的是MF_BYPOSITION,这个参数就代表菜单条目在菜单中的位置(第一个条目的位置为零)

  wFlags --------- Long,常数MF_BYCOMMAND或MF_BYPOSITION,取决于nPosition参数

  hBitmapUnchecked - Long,撤消复选时为菜单条目显示的一幅位图的句柄。如果为零,表示不在未复选状态下显示任何标志

  hBitmapChecked - 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
-------------------------------------------------

Const MF_BYPOSITION = &H400&

Private Sub Form_Load()
Dim mHandle As Long, lRet As Long, sHandle As Long, sHandle2 As Long

  取得菜单的句柄并赋值给mHandle

mHandle = GetMenu(hwnd)

  取得mHandle句柄所指菜单的第一个弹出式菜单(文件&F)的句柄并赋值给sHandle

sHandle = GetSubMenu(mHandle, 0)

  将弹出式菜单的第0-4项加上图片,为什么跳过2呢?因为2是分割线

lRet = SetMenuItemBitmaps(sHandle, 0, MF_BYPOSITION, imOpen.Picture, imSave.Picture)
lRet = SetMenuItemBitmaps(sHandle, 1, MF_BYPOSITION, imSave.Picture, imSave.Picture)
lRet = SetMenuItemBitmaps(sHandle, 3, MF_BYPOSITION, imPrint.Picture, imPrint.Picture)
lRet = SetMenuItemBitmaps(sHandle, 4, MF_BYPOSITION, imPrintSetup.Picture, imPrintSetup.Picture)

  取得mHandle句柄所指菜单的第二个弹出式菜单(编辑&E)的句柄并赋值给sHandle

  sHandle = GetSubMenu(mHandle, 1)
  取得sHandle句柄所指菜单的第一个次级菜单(次级菜单&S)的句柄并赋值给sHandle2

  sHandle2 = GetSubMenu(sHandle, 0)
  将次级菜单中的第1项加上图片

  lRet = SetMenuItemBitmaps(sHandle2, 0, MF_BYPOSITION, imCopy.Picture, imCopy.Picture)
  提示:在SetMenuItemBitmaps()我们把后两项设为相同的图片,如果设为不同的两张图片会有什么效果呢?
  原来这两张图片分别表示复选和撤消复选时的状态,你只须在菜单项被点击的函数中加入以下语句:

Private Sub mnuOpen_Click()
If mnuOpen.Checked = True Then
mnuOpen.Checked = False
Else: mnuOpen.Checked = True
End If
End Sub

  然后在SetMenuItemBitmaps()我们把后两项设为不同的图片即可,有兴趣的话试一试。
  End Sub

来源:upschool.cn
作者:
关键字:菜单中加入图标
发表日期:2006-12-20 20:42:07

网页显示有限 阅读全文请下载本文完整版WORD文档

上一篇:使用超链接和发送Email   下一篇:闪烁的标题栏


2009-1-10 9:44:59
本文的相类似文章
  • 在菜单中加入图标
  • 在菜单中加入图标
  • 在学习中进步 在进步中成长 教程中国相随您的成长之路
    华腾联合科技股份有限公司版权所有
    广告联系:Rosibo@163.com