gis
gis
管理员
管理员
  • 注册日期2003-07-16
  • 发帖数15951
  • QQ
  • 铜币25345枚
  • 威望15368点
  • 贡献值0点
  • 银元0个
  • GIS帝国居民
  • 帝国沙发管家
  • GIS帝国明星
  • GIS帝国铁杆
阅读:1199回复:0

如何将图形与菜单项关联

楼主#
更多 发布于:2004-09-23 16:12
<DIV class=summary>
<H2>概要</H2>本文说明如何将图形与菜单项关联起来。 </DIV>
<DIV class=moreinformation>
<H2>更多信息</H2>在 Visual Basic 中,菜单项已经有两个关联的图形:未选中的图像(它是默认的图像,没有选中标记)和选中的图像(在“菜单编辑器”中,可通过选择菜单项的<b>Checked(已选中)</b> 复选框来设置)。要添加您自己的图像并将它与菜单项关联起来,可通过调用<b>SetMenuItemBitmaps</b> 函数来更改原始图像。

.但是,在调用此函数之前,必须获得子菜单的句柄。这要求您调用<b>GetMenu</b> 函数(它返回主菜单的句柄)和<b>GetSubMenu</b> 函数(它返回子菜单的句柄)。

获得子菜单的句柄后,要指定想更改的菜单项的位置,必须将此句柄传递给<b>SetMenuItemBitmaps</b> ,以便将位图与未选中的菜单项图形关联起来。可以用常量<b>MF_BYPOSITION</b> 将该位置指定为菜单项的从零开始的相对位置。

下面的示例还使用<b>LoadImage</b> 函数将位图载入内存并返回位图的句柄。您也可以使用隐藏的<b>PictureBox</b> 控件,如下所示:
<PRE>Set Picture1.Picture = LoadPicture(App.Path ; "\MenuImg.bmp")
hMenuImg = Picture1.Picture.Handle
</PRE>
<H3>分步示例</H3>
<OL>
<LI>在 Visual Basic 中打开一个新的标准 EXE 项目。默认情况下创建 Form1。
<LI>将一个<b>CommandButton</b> 控件 Command1 放置到 Form1 上。
<LI>从<b>Tools(工具)</b> 菜单中,单击<b>Menu Editor(菜单编辑器)</b>并将三个菜单项添加到窗体上,如下所示:
<OL>
<LI>对于第一个菜单项,在<b>Caption(标题)</b> 文本框中键入 <KBD>Menu</KBD>,然后在<b>Name(名称)</b> 文本框中键入 <KBD>mnuMenu</KBD>,并确保选中<b>Visible(可见)</b> 复选框。
<LI>对于第二个菜单项,单击<b>Next(下一步)</b>,然后在<b>Caption(标题)</b> 文本框中键入 <KBD>SubOne</KBD>,在<b>Name(名称)</b> 文本框中键入 <KBD>mnuOne</KBD>,然后单击右箭头按钮将该菜单项缩进一级,使它作为第一个菜单项的子菜单显示。
<LI>对于第三个菜单项,单击<b>Next(下一步)</b>,在<b>Caption(标题)</b> 文本框中键入 <KBD>SubTwo</KBD>,在<b>Name(名称)</b> 文本框中键入 <KBD>mnuTwo</KBD>,并让它缩进一级,使它也作为第一个菜单项的子菜单显示。单击<b>OK(确定)</b>。注意窗体现在有了一个菜单栏。</LI></OL>
<LI>从<b>File(文件)</b> 菜单中,单击<b>Save As(另存为)</b> 将窗体和项目保存到您选择的位置。
<LI>打开 Microsoft 画图程序或您喜欢的图形应用程序,创建想用作菜单图形的位图图像。位图必须是 10 x 10 像素的正方形才能正确显示。要在 Microsoft 画图程序中设置尺寸,请单击<b>Image(图像)</b> 菜单中的<b>Attibutes(属性)</b> 。另外,为了得到最佳效果,建议您使用单色位图。
<LI>用 MenuImg.bmp 名称将位图另存到项目目录中。
<LI>返回到 Visual Basic 并将下列代码添加到 Form1 代码窗口中:<PRE>Option Explicit

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 Declare Function LoadImage Lib "user32" Alias "LoadImageA" _
   (ByVal hInst As Long, ByVal lpsz As String, ByVal un1 As Long, _
   ByVal n1 As Long, ByVal n2 As Long, ByVal un2 As Long) As Long

' Constant for SetMenuItemBitmaps
Private Const MF_BYPOSITION = ;H400;

' Constants for LoadImage
Private Const IMAGE_BITMAP = ;O0
Private Const LR_LOADFROMFILE = 16
Private Const LR_CREATEDIBSECTION = 8192

Private Sub Command1_Click()
   Dim hMenu As Long
   Dim hSubMenu As Long
   Dim hMenuImg As Long
   Dim sFileName As String

' Get the bitmap.
   sFileName = App.Path ; "\MenuImg.bmp"
   hMenuImg = LoadImage(0, sFileName, IMAGE_BITMAP, 0, 0, _
              LR_LOADFROMFILE Or LR_CREATEDIBSECTION)
' Get the menu item handle.
    hMenu = GetMenu(Me.hwnd)
    hSubMenu = GetSubMenu(hMenu, 0)
' Set the "mnuTwo" bitmap to the one that is loaded in memory.
    Call SetMenuItemBitmaps(hSubMenu, 1, MF_BYPOSITION, hMenuImg, 0)
End Sub
</PRE>
<LI>运行项目。单击<b>Command1</b>,然后选择菜单。您创建的图像出现在第二个菜单项<b>SubTwo </b>的旁边。</LI></OL></DIV>
<DIV class=references>
<H2>参考</H2>有关如何将图形与 16 位 Visual Basic 中的菜单项关联起来的其他信息,请单击下面的文章编号,查看 Microsoft 知识库文章:
<P><a href="http://support.microsoft.com/default.aspx?scid=kb;EN-US;71281" target="_blank" >71281</A> 如何在 Visual Basic 菜单内实现位图 </P></DIV>
喜欢0 评分0
GIS麦田守望者,期待与您交流。
游客

返回顶部