自绘菜单的代码看过一些,但都过于复杂了。但我不需要那些华丽的风格,仅仅需要增加一个图标,就象VB的开发环境那样的菜单,具体怎么做呢?我头都大了……
注意,不是位图。那个效果实在不好。
谢谢。

解决方案 »

  1.   

    位图也可以吧,就是分辨率为13*13的还有用hookmenu控件就更高级了~直接添加Icon
      

  2.   

    老大,可以详细指点一下吗?除了用子类外,第一次听你说用bitbilt……
      

  3.   

    我有大把这样的代码
    但是你要做这样的东西又不用控件就都不简单
    你可以用CurtMenu控件,该控件直接连接一个ImageList就可以在已有Menu上显示图标了,而且,免费
      

  4.   

    我主要是动态创建的菜单,再说使用控件对发布软件不太好,所以不希望用控件。
    这样吧,分开问。
    子类化的时候,拦截WM_DRAWITEM消息的时候,怎么知道这个菜单原来的标题是什么?我已经用一个动态数组将这些标题保存下来了,但lParam始终为0,导致我所有的标题都是一样的!
    系统绘制菜单的时候应该是一条一条绘制的吧?那怎么回事情?
    郁闷啊,继续求助!
      

  5.   

    .。听了头疼看了头更疼。遇到这部分我就是刷以前的代码用不过你怎么那么讨厌用OCX呢,挺好用的,用了程序也好你也好。(请注意,是控件不是汇源肾宝)
      

  6.   

    真晕
    到 www.skycn.com/soft/13653.html 把我做的ZX Messenger下下来
    安装后再安装他的源代码
    打开客户端代码
    看frmbannermenu里面的程序
      

  7.   

    'This project needs a form with a menu with at least one submenu
    'It also needs a picturebox, Picture1, that contains a small b/w bitmap
    Const MF_BYPOSITION = &H400&
    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
    Private Sub Form_Load()
       Dim hMenu As Long, hSubMenu As Long
        hMenu = GetMenu(Me.hwnd)    If hMenu = 0 Then
            MsgBox "This form doesn't have a menu!"
            Exit Sub
        End If    hSubMenu = GetSubMenu(hMenu, 0)
      
        If hSubMenu = 0 Then
            MsgBox "This form doesn't have a submenu!"
            Exit Sub
        End If
        SetMenuItemBitmaps hSubMenu, 0, MF_BYPOSITION, Picture1.Picture, Picture1.Picture
    End Sub
      

  8.   

    VirtualDesktop(吴滂) ,网上代码很多,就是看不明白才问的。province_(雍昊) ,请看清楚,不是位图。继续顶。
      

  9.   

    晕死!位图是BMP。图标是ICO。SetMenuItemBitmaps是不可能把一个标准ICO图标加上去的!!!如果Picture1.Picture为一个图标,不会有任何效果!!!
      

  10.   

    我说楼主
    这种东西不是一两句话旧能解决的
    你又不愿意研究代码简单的说,就是用LoadBitmap加载图标
    然后BitBlt画图到菜单上用控件你又嫌没技术
    代码你又不想研究
    我还能说什么...
      

  11.   

    7楼的时候已经将问题细化了啊,不研究代码怎么能提出这个问题?
    再说,我所看到的代码都是用drewiconex画上去的,从没有遇到BitBlt画图到菜单上的示例。在重复7楼的问题“子类化的时候,拦截WM_DRAWITEM消息的时候,怎么知道这个菜单原来的标题是什么?我已经用一个动态数组将这些标题保存下来了,但lParam始终为0,导致我所有的标题都是一样的!”所谓指点迷津,就是在某一点上迷惑了,需要解释、帮助。如此而已。
      

  12.   

    既然你要自画MENU,那你为什么不仔细看看MSDN里对WM_DRAWITEM消息相关的描述。我不帮你复制那一大堆E文了。
    另外,你加载了ICO到PICTUREBOX里难道你就不能变通?从PICTUREBOX里SAVEPICYURE到文件不就能转为BMP?很多东西不要想现成拿来用这也应该符合你说的不要依赖控件吧。
      

  13.   

    好吧,这么说吧,问题不在转换。ICO是透明的,而BMP不是!
    另外,不好意思,更正一下,好象BitBlt也是可以的,但这不是关键,关键在于“拦截WM_DRAWITEM消息的时候,怎么知道这个菜单原来的标题是什么”
    谢谢大家的帮助……
      

  14.   

    WM_DRAWITEM发生的时候,LPARAM是一个指针,它指向一个结构体:DRAWITEMSTRUCT;其内部的CtlID、CtlType、itemID应该是让你用于菜单项目判断的。其它几个如HDC及RCITEM等是用户绘画时用的。
      

  15.   

    主要是我没有注意到在添加菜单的时候MENUITEMINFO的wID。