注册 登录
编程论坛 VB6论坛

给 VB 窗体上鼠标右键菜单添加图标

opelwang 发布于 2014-06-28 11:52, 3324 次点击
如题,给VB窗体上鼠标右键菜单上添加菜单图标,应该如何操作,请指点,谢谢。
如图:
只有本站会员才能查看附件,请 登录
11 回复
#2
opelwang2014-06-28 11:53
如果一定需要源码,请跟贴回复,我再上传,谢谢。

窗体上已经添加三组菜单,共15个按钮。

如下图所示:
只有本站会员才能查看附件,请 登录

只有本站会员才能查看附件,请 登录

只有本站会员才能查看附件,请 登录


.
#3
bczgvip2014-06-28 14:32
你这是 吧?
#4
opelwang2014-06-28 14:35
回复 3 楼 bczgvip
版主,这是VB6.0下实现的。
#5
bczgvip2014-06-28 16:34
        SetMenuItemBitmaps
        ImageList
        PopupMenu

自己找找吧。
#6
opelwang2014-06-28 23:13
回复 5 楼 bczgvip
代码如下,请版主指点一下,谢谢。

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
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句柄所指菜单的第一个出式菜单的句柄并赋值给sHandle
    sHandle = GetSubMenu(mHandle, 0)
    ' 将弹出式菜单的第一个弹出式菜单(0/2/4/6/8)加上图片, 跳过1/3/5/7, 因为是分隔线
    lRet = SetMenuItemBitmaps(sHandle, 0, MF_BYPOSITION, Image1.Picture, Image1.Picture)
    lRet = SetMenuItemBitmaps(sHandle, 2, MF_BYPOSITION, Image2.Picture, Image2.Picture)
    lRet = SetMenuItemBitmaps(sHandle, 4, MF_BYPOSITION, Image3.Picture, Image3.Picture)
    lRet = SetMenuItemBitmaps(sHandle, 6, MF_BYPOSITION, Image4.Picture, Image4.Picture)
    lRet = SetMenuItemBitmaps(sHandle, 8, MF_BYPOSITION, Image5.Picture, Image5.Picture)

    ' 取得mHandle句柄所指菜单的第二个弹出式菜单的句柄并赋值给sHandle
    sHandle = GetSubMenu(mHandle, 1)
    lRet = SetMenuItemBitmaps(sHandle, 0, MF_BYPOSITION, ImageA.Picture, ImageA.Picture)
    lRet = SetMenuItemBitmaps(sHandle, 2, MF_BYPOSITION, ImageB.Picture, ImageB.Picture)
    lRet = SetMenuItemBitmaps(sHandle, 4, MF_BYPOSITION, ImageC.Picture, ImageC.Picture)
    lRet = SetMenuItemBitmaps(sHandle, 6, MF_BYPOSITION, ImageD.Picture, ImageD.Picture)
    lRet = SetMenuItemBitmaps(sHandle, 8, MF_BYPOSITION, ImageE.Picture, ImageE.Picture)

    ' 取得mHandle句柄所指菜单的第三个弹出式菜单的句柄并赋值给sHandle
    sHandle = GetSubMenu(mHandle, 2)
    lRet = SetMenuItemBitmaps(sHandle, 0, MF_BYPOSITION, Pic1.Picture, Pic1.Picture)
    lRet = SetMenuItemBitmaps(sHandle, 2, MF_BYPOSITION, Pic2.Picture, Pic2.Picture)
    lRet = SetMenuItemBitmaps(sHandle, 4, MF_BYPOSITION, Pic3.Picture, Pic3.Picture)
    lRet = SetMenuItemBitmaps(sHandle, 6, MF_BYPOSITION, Pic4.Picture, Pic4.Picture)
    lRet = SetMenuItemBitmaps(sHandle, 8, MF_BYPOSITION, Pic5.Picture, Pic5.Picture)


    sHandle = GetSubMenu(mHandle, 3) '以下两个是定义托盘的两个按钮图标---未起作用
    lRet = SetMenuItemBitmaps(sHandle, 0, MF_BYPOSITION, Pic1.Picture, Pic1.Picture)
    lRet = SetMenuItemBitmaps(sHandle, 2, MF_BYPOSITION, Pic2.Picture, Pic2.Picture)



    sHandle = GetSubMenu(mHandle, 4) '以下两个是定义窗体鼠标右键的三个按钮图标---未起作用
    lRet = SetMenuItemBitmaps(sHandle, 0, MF_BYPOSITION, Pic1.Picture, Pic1.Picture)
    lRet = SetMenuItemBitmaps(sHandle, 2, MF_BYPOSITION, Pic2.Picture, Pic2.Picture)
    lRet = SetMenuItemBitmaps(sHandle, 4, MF_BYPOSITION, Pic3.Picture, Pic3.Picture)

   

    ' --- 自定义图标-结束


End Sub

[ 本帖最后由 opelwang 于 2014-6-28 23:18 编辑 ]
#7
bczgvip2014-06-29 15:34
呃,还真没遇到这问题。
难道还要咱试试么?Orz
好吧试试吧。

    sHandle = GetSubMenu(mHandle, 3) '以下两个是定义托盘的两个按钮图标---未起作用
    debug.assert shandle '要显示菜单才能更改么?又或者说要显示才列入 SubMenu 。
'咱只知道重绘菜单或代码创建菜单这两方法可以解决。
#8
opelwang2014-06-29 16:32
以下是引用bczgvip在2014-6-29 15:34:13的发言:

呃,还真没遇到这问题。
难道还要咱试试么?Orz
好吧试试吧。

    sHandle = GetSubMenu(mHandle, 3) '以下两个是定义托盘的两个按钮图标---未起作用
    debug.assert shandle '要显示菜单才能更改么?又或者说要显示才列入 SubMenu 。
'咱只知道重绘菜单或代码创建菜单这两方法可以解决。


因为窗体鼠标右键上的菜单,在菜单编辑器中是隐藏的,获取不到句柄。
如果有办法获取到隐藏菜单的句柄,也好办了。
#9
bczgvip2014-06-30 02:26
以前见过别人用过这办法,咱这代码整洁强迫症眼里挺囧的。就代码量与效率而言还不错了。

只有本站会员才能查看附件,请 登录
#10
opelwang2014-06-30 16:51
以下是引用bczgvip在2014-6-30 02:26:50的发言:

以前见过别人用过这办法,咱这代码整洁强迫症眼里挺囧的。就代码量与效率而言还不错了。


这是将隐藏的菜单项取消了来操作。

我的那个,如何取消隐藏也可以的,关键是就是获取不到隐藏菜单的句柄。
#11
bczgvip2014-06-30 20:52
把菜单放到其他窗体去就行了。
漏说的概要
【要显示菜单才能得到 SubMenu 。】
这问题咱就不去找原因了,解决方法自己找吧。
#12
ChenAnLi2015-05-15 15:50
时间蛮久了    请问ImageA.Picture, ImageA.Picture  这是什么     我怎么将自己的图片对应
1