'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
但是你要做这样的东西又不用控件就都不简单
你可以用CurtMenu控件,该控件直接连接一个ImageList就可以在已有Menu上显示图标了,而且,免费
这样吧,分开问。
子类化的时候,拦截WM_DRAWITEM消息的时候,怎么知道这个菜单原来的标题是什么?我已经用一个动态数组将这些标题保存下来了,但lParam始终为0,导致我所有的标题都是一样的!
系统绘制菜单的时候应该是一条一条绘制的吧?那怎么回事情?
郁闷啊,继续求助!
到 www.skycn.com/soft/13653.html 把我做的ZX Messenger下下来
安装后再安装他的源代码
打开客户端代码
看frmbannermenu里面的程序
'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
这种东西不是一两句话旧能解决的
你又不愿意研究代码简单的说,就是用LoadBitmap加载图标
然后BitBlt画图到菜单上用控件你又嫌没技术
代码你又不想研究
我还能说什么...
再说,我所看到的代码都是用drewiconex画上去的,从没有遇到BitBlt画图到菜单上的示例。在重复7楼的问题“子类化的时候,拦截WM_DRAWITEM消息的时候,怎么知道这个菜单原来的标题是什么?我已经用一个动态数组将这些标题保存下来了,但lParam始终为0,导致我所有的标题都是一样的!”所谓指点迷津,就是在某一点上迷惑了,需要解释、帮助。如此而已。
另外,你加载了ICO到PICTUREBOX里难道你就不能变通?从PICTUREBOX里SAVEPICYURE到文件不就能转为BMP?很多东西不要想现成拿来用这也应该符合你说的不要依赖控件吧。
另外,不好意思,更正一下,好象BitBlt也是可以的,但这不是关键,关键在于“拦截WM_DRAWITEM消息的时候,怎么知道这个菜单原来的标题是什么”
谢谢大家的帮助……