VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)
首页 - 经验之谈 - VB高级界面编程
发表评论(0)作者:不详, 平台:VB6.0+Win98, 阅读:11848, 日期:2001-06-19
大家可能都会用vb编写菜单程序,vb中有菜单编辑器可以轻松地编写命令按钮菜单,但大家可能对图形菜单的制作不太了解(如下图)。他可能在vc中编写比较容易。要在vb中就要引用API编写。下面就给大家介绍一下编写过程。

           

  先介绍一下菜单的基本知识,对vb而言每一个菜单命令或子菜单,都算是一个菜单对象,但对WINDOWS而言,会以一个hMenu(菜单句柄)代表整个菜单,而每一个子菜单则以一个hSubMenu(子菜单句柄)来代表,但每一个菜单命令(MenuItem)则不再给予handle(句柄),而是以Menu ID代表。

  为获得某一个Form的hMenu,我们必须调用GetMenu API函数:

Declare Function GetMenu Lib "user32" (ByVal hwnd As Long) As Long

  参数 HWnd:某一个含有菜单窗口hWnd。

  返回值 若该菜单含有菜单,则返回hMenu,否则返回0。

  调用 Dim hMenu As Long

hMenu = GetMenu(Me.hwnd) `获取窗口句柄

  接下来要取得菜单的hSubMenu,则是调用GetSubMenu API函数:

Declare Function GetSubMenu Lib "user32" (ByVal hMenu As Long, ByVal nPos As Long) As Long

  参数 hMenu:传入hMenu 。

  npos:欲取得subMenu的位置,subMenu的位置从0算起。

  返回值 不等于0,表示hSubMenu: =,表示失败。

 调用 Dim hSubMenu As Long

hMenu = GetMenu(Me.hwnd)

  `取得Form菜单的第0个Submenu `调入的一个菜单的位置

hSubMenu = GetSubMenu(hMenu, 0) `调入的一个菜单的位置

  为取得Menu ID所调用的API函数是GetMenuItemID:

Declare Function GetMenuItemID Lib "user32" (ByVal hMenu As Long, ByVal nPos As Long) As Long

Dim hMenu As Long, hSubMenu As Long, menuid As Long

hMenu = GetMenu(Me.hwnd)

hSubMenu = GetSubMenu(hMenu, 0)

menuid = GetMenuItemID(hSubMenu, 0) ‘调入的一个菜单命令

  取得hMenu,hSubMenu及Menu ID之后,我们可以调用ModifyMenModifyMenu API函数改变某一个菜单命令或子菜单的“标题、图形、或Menu ID”。ModifyMenu几个参数的意义如下:

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 Any) As Long

  HMenu: 传入hMenu或hSubMenu。

  nPosition: 欲改变菜单命令的位置或Menu ID,这一参数取决于wFlags参数。

  wFlags: 可以是以下设置值的组合:

  1. MF_BYPOSITION 表示菜单命令的位置。

  2. MF_BYCOMMAND 表示菜单命令的Menu ID,他不与1并存。

  3. MF_STRING 表示菜单命令的文字标题。

  4. MF_BITMAP 表示菜单命令的图片,他不与3并存。

  wIDNewItem:传入原有的Menu ID,也就是不要改变。

  IpString: 新的菜单命令的文字标题或图片。

 调用

Dim hMenu As Long, hSubMenu As Long, menuid As Long

hMenu = GetMenu(Me.hwnd)

hSubMenu = GetSubMenu(hMenu, 0) ‘0代表菜单的一项

menuid = GetMenuItemID(hSubMenu, 0) ‘0代表子菜单的第一项

ModifyMenu hSubMenu, 0, MF_BITMAP , menuid, pic(0).Handle

  在调用前使用以下语句载入图片:

Static pic as picture

Set pic =loadpicture(app.path & “\ 图片名称“)

  以上所介绍的菜单API函数其实只占菜单API函数的一小部分,但对编写图形菜单程序已绰绰有余,实际上,我们并不需要完全使用API函数来建立菜单,而是先用VB所提供的菜单编辑器先编辑好纯文字菜单,接着再利用API将某一些菜单命令或子菜单改变成图形。最后我把API声明的模块告诉大家。主程序部分大家根据需要参照以上介绍编写。

Option Explicit

Public Const MF_BYCOMMAND = &H0&

Public Const MF_BYPOSITION = &H400&

Public Const MF_BITMAP = &H4&

Public Const MF_STRING = &H0&

Declare Function GetMenu Lib "user32" (ByVal hwnd As Long) As Long

Declare Function GetSubMenu Lib "user32" (ByVal hMenu As Long, ByVal nPos As Long) As Long

Declare Function GetMenuItemID Lib "user32" (ByVal hMenu As Long, ByVal nPos As Long) As Long

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 Any) As Long