如何在VB6.0中建立菜单,在子菜单中加入图标?

muhuairu 2002-12-16 10:47:42
如何在VB6.0中建立菜单,在子菜单中加入图标?
...全文
1499 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
chenyu5188 2002-12-20
  • 打赏
  • 举报
回复
UP

楼上的各位说的都很详细了
Hideal 2002-12-19
  • 打赏
  • 举报
回复
這种方法對MDI窗體不行,對SDI窗體可以.
orcale 2002-12-17
  • 打赏
  • 举报
回复
Declare Function GetMenu Lib "user32" (ByVal hwnd As Long) As Long
Declare Function GetSubMenu Lib "user32" (ByVal hMenu As Long,
ByVal nPos As Long) As Long
'To start things off right, just add a form to a project (or just start a new project). Add a picturebox control. Set 'Autosize' to 'True' with a bitmap (not an Icon) at a maximum of 13X13. Add a comandbutton with the following code:
Private Sub Command1_Click()
'Get the menuhandle of your app
hMenu& = GetMenu(Form1.hwnd)

'Get the handle of the first submenu (Hello)
hSubMenu& = GetSubMenu(hMenu&, 0)

'Get the menuId of the first entry (Bitmap)
hID& = GetMenuItemID(hSubMenu&, 0)

'Add the bitmap
SetMenuItemBitmaps hMenu&, hID&, MF_BITMAP, Picture1.Picture, Picture1.Picture

'You can add two bitmaps to a menuentry one for the checked and one for the unchecked state.
End Sub
zyl910 2002-12-17
  • 打赏
  • 举报
回复
做成那样的菜单有三种方法(其他的方法实现的效果太次):
一:自绘菜单:
我编的自绘菜单:

http://zyl910vb.51.net/vb/gui/DrawMenu-S.htm(有注释!特地为想学自绘菜单的人写的)
http://zyl910vb.51.net/vb/gui/CoolGUI.htm(效果比较好,但没有注释)
http://zyl910vb.51.net/vb/gui/ZXPMenu.htm(XP风格的菜单)

右击连接,目标另存为
注意把下载后的*.zip.jpg改名成*.zip

二:用窗体模拟菜单:
http://dapha.net/down/list.asp?id=426
XP下拉菜单(影子效果,酷!!!)

软件版本: 无图片
软件类型: 菜单技术
运行环境: VB6.0/Win9x
授权方式: 免费代码
软件大小: 12K
软件评价:
整理日期: 2001-12-3
作 者: http://www.dapha.net
本日下载: 8 本周:246 总计:246
下载地址1: 本地下载
软件简介: 用过XP再看这个简直是一模一样,而且不用任何XP控件,非常棒!


http://www.21code.com/codebase/?pos=down&id=1913
源码类型: VisualBasic源码-菜单处理
上传时间: 2002-02-01
下载次数: 1336
源码大小: 46 KB 源码评价:

源码简介:
OFFICE XP风格菜单代码最新版


三、用进程级Hook拦截处理消息,自绘菜单窗体的非客户区
http://dapha.net/down/list.asp?id=1926
dragon525 2002-12-16
  • 打赏
  • 举报
回复
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

7,785

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧