阅读:1201回复:0
如何将图形与菜单项关联
<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> |
|
|