那个系统菜单总是不能自绘,而且极丑,大家有没有什么好办法啊
我有几个思路,一是吃掉该系统菜单,弹自己的菜单,已经做出来了,但总是有一些地方不尽人意
二是移除不能自绘的菜单项再追加上去,但是移除关闭后,窗口的关闭按钮又不能用,成灰色了
三就是修改菜单结构,但我对菜单结构不太会,各位帮手,写出来后一定奉上

解决方案 »

  1.   

    GetSystemMenu得到系统菜单句柄
    然后ModifyMenu设置自绘风格不就行了
      

  2.   

    MF_OWNERDRAW 创建一个物主绘图菜单(由您设计的程序负责描绘每个菜单条目) 
    ModifyMenu,ModifyMenuBynum VB声明 
    Declare Function ModifyMenu& Lib "user32" Alias "ModifyMenuA" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long, ByVal wIDNewItem As Long, ByVal lpString As String)
    Declare Function ModifyMenuBynum& Lib "user32" Alias "ModifyMenuA" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long, ByVal wIDNewItem As Long, ByVal lpString As Long) 
    说明 
    改变菜单条目。在vb里这个函数做出的许多改变都会有效的执行,但不能由vb菜单对象反映出来 
    返回值 
    Long,非零表示成功,零表示失败。会设置GetLastError 
    参数表 
    参数 类型及说明 
    hMenu Long,菜单句柄 
    nPosition Long,欲改变的菜单条目的标识符。如在wFlags参数中指定了MF_BYCOMMAND,这个参数就代表欲改变的菜单条目的命令ID。如设置的是MF_BYPOSITION,这个参数就代表菜单条目在菜单中的位置(第一个条目的位置为零) 
    wFlags Long,一系列常数标志的组合。详见菜单常数标志表 
    wIDNewItem Long,指定菜单条目的新命令ID。如在wFlags参数中指定了MF_POPUP标志,就应是一个弹出式菜单的句柄 
    lpString String或Long,如在wFlags参数中指定了MF_STRING标志,就代表欲设置到菜单的字串。如设置的是MF_BITMAP,就代表一个Long变量,其中包含了一个位图句柄。如设置的是MF_OWNERDRAW,那么这个值就会包括到DRAWITEMSTRUCT和MEASUREITEMSTRUCT结构中,并由windows在条目需要重画的时候发出 
    注解 
    标志的下述组合形式是不允许的:MF_BYCOMMAND和MF_BYPOSITION;MF_CHECKED和MF_UNCHECKED;MF_MENUBARBREAK和MF_MENUBREAK;MF_DISABLED,MF_ENABLED和MF_GRAYED;MF_BITMAP,MF_STRING,MF_OWNERDRAW和MF_SEPARATOR
     
    菜单常数标志表 
    MF_BITMAP 菜单条目是一幅位图。一旦设入菜单,这幅位图就绝对不能删除。所以不应该使用由vb的image属性返回的值 
    MF_BYCOMMAND 菜单条目由菜单的命令ID指定 
    MF_BYPOSITION 菜单条目由条目在菜单中的位置决定。零代表菜单中的第一个条目 
    MF_CHECKED 检查指定的菜单条目。不能与vb的checked属性兼容 
    MF_DISABLED 禁止指定的菜单条目。不与vb的enabled属性兼容 
    MF_ENABLED 允许指定的菜单条目。不与vb的enabled属性兼容 
    MF_GRAYED 禁止指定的菜单条目,并用浅灰色描述它。不与vb的enabled属性兼容 
    MF_MENUBARBREAK 在弹出式菜单中,将指定的条目放置于一个新列,并用一条垂直线分隔不同的列 
    MF_MENUBREAK 在弹出式菜单中,将指定的条目放置于一个新列。在顶级菜单中,将条目放置到一个新行 
    MF_OWNERDRAW 创建一个物主绘图菜单(由您设计的程序负责描绘每个菜单条目) 
    MF_POPUP 将一个弹出式菜单置于指定的条目。可用于创建子菜单及弹出式菜单 
    MF_SEPARATOR 在指定的条目处显示一条分隔线 
    MF_STRING 在指定的条目处放置一个字串。不与vb的caption属性兼容 
    MF_UNCHECKED 检查指定的条目。不能与vb的checked属性兼容 
      

  3.   

    推荐一个界面编程网站:vbAccelerator.com
    其中有很多经典的界面编程代码最好的XP阴影菜单源代码:
    http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=49985&lngWId=1
    HookMenu 1.5要想真正学好界面编程的话
    最先要学习好一般的图形绘制操作(《计算机图形学》对初学者太难了,但是还是很有启发的)
    然后要学习Windows系统的编程接口体系(推荐Charles Petzold的《Programming Windows》)
    最后要想提高界面的漂亮程度的话,去学《数字图像处理》
      

  4.   

    你写的这个API我懂,但在MF_OWNERDRAW 时需要DRAWITEMSTRUCT结构,这个结构我如何获得原菜单的,然后才能改啊
      

  5.   

    但在MF_OWNERDRAW 时需要DRAWITEMSTRUCT结构,这个结构我如何获得原菜单的,然后才能改啊
    --------------------------------------------------------DRAWITEMSTRUCT.itemID就是菜单项的ID这纯粹是VB菜单系统的设计问题
    VB的菜单对象没有提供一种方法来取得菜单项ID
    只有在修改菜单风格时,自己用一个数据结构保存菜单信息
    等绘制的时候再去查询那个数据结构