标题: vb 利用API为系统菜单添加图标 [打印本页] 作者: SKY晓夜 时间: 2013-11-11 12:33 标题: vb 利用API为系统菜单添加图标 为保证读者顺利上机实践,请遵照下面的每一个步骤
(1)建立一个菜单(如果不清楚菜单编辑器的使用,请百度),层次结构如下图:
(2)添加一个IimageList控件,并添加至少四张图片(不会添加的请百度,此处不赘述),效果如图2
(3)引用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 GetMenuItemID 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
Const MF_bitmap = &H4&
(4)添加Form_Load事件代码
Private Sub Form_Load()
'为“进货管理”菜单下的子菜单添加图标
Dim i As Integer
Dim menu1 As Long
Dim menuID As Long
menu1 = GetMenu(Me.hwnd)
For i = 1 To 4
menuID = GetMenuItemID(GetSubMenu(menu1, 0), i - 1)
SetMenuItemBitmaps menu1, menuID, MF_bitmap, ImageList2.ListImages(i).Picture, ImageList2.ListImages(i).Picture
Next
End Sub 作者: SKY晓夜 时间: 2013-11-11 12:35
下面是关于API的详细介绍
GetMenu
VB声明
Declare Function GetMenu Lib "user32" Alias "GetMenu" (ByVal hwnd As Long) As Long
说明
取得窗口中一个菜单的句柄
返回值
Long,依附于指定窗口的一个菜单的句柄(如果有菜单);否则返回零
参数表
参数 类型及说明
hwnd Long,窗口句柄。对于vb,这应该是一个窗体句柄。注意可能不是子窗口的句柄 作者: SKY晓夜 时间: 2013-11-11 12:35
GetSubMenu
VB声明
Declare Function GetSubMenu Lib "user32" Alias "GetSubMenu" (ByVal hMenu As Long, ByVal nPos As Long) As Long
说明
取得一个弹出式菜单的句柄,它位于菜单中指定的位置
返回值
Long,位于指定位置的弹出式菜单的句柄(如果有的话);否则返回零
参数表
参数 类型及说明
hMenu Long,菜单的句柄
nPos Long,条目在菜单中的位置。第一个条目的编号为0 作者: SKY晓夜 时间: 2013-11-11 12:36
GetMenuItemID
VB声明
Declare Function GetMenuItemID Lib "user32" Alias "GetMenuItemID" (ByVal hMenu As Long, ByVal nPos As Long) As Long
说明
返回位于菜单中指定位置处的条目的菜单ID
返回值
Long,指定条目的菜单ID。如条目属于一个弹出式菜单,就返回-1;如指定的条目属于一个分隔符(比如一条分隔线)则返回0
参数表
参数 类型及说明
hMenu Long,菜单的句柄
nPos Long,条目在菜单中的位置。第一个条目的编号是0 作者: SKY晓夜 时间: 2013-11-11 12:37
SetMenuItemBitmaps
VB声明
Declare Function SetMenuItemBitmaps Lib "user32" Alias "SetMenuItemBitmaps" (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
参数表
参数 类型及说明
hMenu Long,菜单句柄
nPosition Long,欲设置位图的一个菜单条目的标识符。如在wFlags参数中指定了MF_BYCOMMAND,这个参数就代表欲改变的菜单条目的命令ID。如设置的是MF_BYPOSITION,这个参数就代表菜单条目在菜单中的位置(第一个条目的位置为零)
wFlags Long,常数MF_BYCOMMAND或MF_BYPOSITION,取决于nPosition参数
hBitmapUnchecked Long,撤消复选时为菜单条目显示的一幅位图的句柄。如果为零,表示不在未复选状态下显示任何标志
hBitmapChecked Long,复选时为菜单条目显示的一幅位图的句柄。可设为零,表示复选时不显示任何标志。如两个位图句柄的值都是零,则为这个条目恢复使用默认复选位图
注解
使用的位图可能由多个条目共享。一旦不再需要,位图必须由应用程序清除,因为windows不能自动对它进行清除