我在VB里已经设置好菜单,想跟菜单同一个高度,右上角放置一个按钮,请帮我解决一下?

解决方案 »

  1.   

    用AppendMenu添加一个菜单项
    然后用ModifyMenu修改菜单风格,使其成为自绘菜单
    对用子类化技术拦截窗口消息
    处理WM_MEASUREITEM消息设置自毁的菜单项的大小
    处理WM_DRAWITEM消息自己绘制菜单项
      

  2.   

    你是用VC里实现,我想在VB里实现啊?
      

  3.   

    这是SDK编程你申明API就可以用了
      

  4.   

    一般意义的VC编程是指MFC编程
      

  5.   

    你能帮我把这几个API函数的原型写出来啊。
      

  6.   

    AppendMenu VB声明 
    Declare Function AppendMenu Lib "user32" Alias "AppendMenuA" (ByVal hMenu As Long, ByVal wFlags As Long, ByVal wIDNewItem As Long, ByVal lpNewItem As Any) As Long 
    说明 
    在指定的菜单里添加一个菜单项 
    返回值 
    Long,非零表示成功,零表示失败。会设置GetLastError 
    参数表 
    参数 类型及说明 
    hMenu Long,菜单句柄 
    wFlags Long,参考ModifyMenu函数中的菜单常数标志定义表,其中列出了允许使用的所有常数 
    wIDNewItem Long,指定菜单条目的新命令ID。如果在wFlags参数中指定了MF_POPUP字段,那么这应该是指向一个弹出式菜单的句柄 
    lpNewItem String(相应的vb声明见注解),如果在wFlags参数中指定了MF_STRING标志,这就代表在菜单中设置的字串。如设置了MF_BITMAP标志,这就代表一个Long型变量,其中包含了一个位图句柄。如设置了MF_OWNERDRAW,这个值就会包括在DRAWITEMSTRUCT和MEASUREITEMSTRUCT结构中,在条目需要重画的时候由windows发送出去 
    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属性兼容 
      

  7.   

    界面编程需要对gdi函数集很熟悉(界面是是画出来的)你先看看几个简单的自绘菜单代码
    http://www.applevb.com/sourcecode/ownerdrawmenu.zip
    下载ApiViewer,很不错的API申明工具
    http://www.activevb.de/rubriken/apiviewer/index-apiviewereng.html