📄 040105.htm
字号:
[问题:怎样给插入的菜单添加事件过程,以响应用户的单击操作?]<br>
----------------------------------------<br>
在菜单尾部附加菜单项:AppendMenuA函数<br>
声明:<br>
Declare Function AppendMenuA Lib "user32" (ByVal hMenu As Long, ByVal wFlags As Long, ByVal wIDNewItem As Long, ByVal lpNewItem As Any) As Long<br>
参数与上面的InsertMenuA基本相同,因它附加到菜单尾部,所以省去了指定插入位置的那个nPosition参数而已。调用如:<br>
lxn = GetSystemMenu(hwnd, False)<br>
AppendMenu lxn, MF_STRING, 11, "李新宁"<br>
连wFlags参数的MF_BYPOSITION也不要了,因为不要指定添加位置(反正就在尾部),故用来度量位置的"依据"也就免了。<br>
--------------------------------------------------<br>
修改菜单项:ModifyMenuA函数<br>
声明:<br>
Declare Function ModifyMenuA Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long, ByVal wIDNewItem As Long, ByVal lpString As String) as long<br>
五个参数与InsertMenuA的相同,第1个为菜单句柄,第2个为要修改的菜单项位置(从0开始)或ID,第3个指明①用位置或ID来选择菜单项②菜单项标题为文本还是图形③菜单项是否有效…,第4个自定1个菜单项的ID号,第5个指定菜单项的标题内容(文字或图形句柄)。<br>
-------------------------------------------<br>
删除菜单项:DeleteMenu函数<br>
声明:<br>
Declare Function DeleteMenu Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As Long<br>
第1个参数指定菜单句柄,第2个参数指定菜单项的位置或ID,第3个参数指定按位置还是按ID。调用如:<br>
DeleteMenu GetSystemMenu(hwnd,false),1,MF_BYPOSITION<br>
注:在上面多处的讲述中,"菜单"和"菜单项"不同,"菜单项"是"菜单"中的一个项。而"菜单"包含多个"菜单项"。<br>
--------------------------------------<br>
删除菜单:DestroyMenu函数<br>
此函数删除菜单,当然也就删除了它的所有菜单项。声明:<br>
Declare Function DestroyMenu Lib "user32" (ByVal hMenu As Long) As Long<br>
参数hMenu指定要删除的菜单句柄,调用如:<br>
lxn=GetSystemMenu(hwnd,false)<br>
DestroyMenu lxn<br>
---------------------------------------- <br>
取得指定菜单所包含菜单项数:GetMenuItemCount函数<br>
声明:<br>
Declare Function GetMenuItemCount Lib "user32"(ByVal hMenu As Long) As Long<br>
参数简单:hMenu指定1个菜单句柄。<br>
函数返回值为该菜单下包含的子菜单项数。<br>
调用如:<br>
s = GetMenuItemCount(GetSubMenu(GetMenu(form1.hwnd),0))<br>
Print s <br>
上例返回总句柄下第一个子菜单"文件"菜单下包含的子菜单项数。如为7。<br>
---------------------------------------------------<br>
取得指定菜单下某子菜单项的命令ID号:GetMenuItemID<br>
该函数返回1个菜单下指定位置的1个子菜单项的菜单ID号。如果指定的子菜单项是一分隔符,则函数返回值为0,声明:<br>
Declare Function GetMenuItemID Lib "user32"(ByVal hMenu As Long, ByVal nPos As Long) As Long <br>
参数:hMenu--父菜单句柄。 <br>
nPos--子菜单项在父菜单中的位置,第1个子菜单项编号为0。<br>
-----------------------------------------<br>
改变菜单项函数:ModifyMenuA函数<br>
声明:<br>
Declare Function ModifyMenuA Lib "user32"(ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long, ByVal wIDNewItem As Long, ByVal lpString As String) as long<br>
参数:hMenu--欲改变的菜单的上级父菜单句柄。<br>
nPosition--欲改变的子菜单项的标识符。如在wFlags参数中指定了MF_BYCOMMAND,这个参数就代表欲改变的子菜单项的命令ID号。如设置的是MF_BYPOSITION,这个参数就代表欲改变菜单项在上级父菜单中的位置(第一个菜单项的位置为零) <br>
wFlags--一系列常数标志的组合。详见菜单常数标志表 <br>
wIDNewItem--指定欲改变菜单项的新命令ID号。如在wFlags参数中指定MF_POPUP,就应是一个弹出式菜单的句柄。 <br>
lpString--如在wFlags参数中指定了MF_STRING标志,就代表欲设置到菜单项的字符串。如设置的是MF_BITMAP,就代表一个Long变量,其中包含了一个位图句柄。如设置的是MF_OWNERDRAW,那么这个值就会包括到DRAWITEMSTRUCT和MEASUREITEMSTRUCT结构中,并由windows在菜单项需要重画的时候发出 <br>
注:wFlags参数的下述组合形式是不允许的: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<br>
菜单常数标志表:<br>
MF_BITMAP 菜单项是一幅位图。一旦设入菜单,这幅位图就绝对不能删除。所以不应该使用由vb的image属性返回的值 <br>
MF_BYCOMMAND 菜单项由菜单的命令ID指定 <br>
MF_BYPOSITION 菜单项由其在父菜单中的位置决定。零代表父菜单中的第一个子菜单项 <br>
MF_CHECKED 检查指定的菜单项。不能与vb的checked属性兼容 <br>
MF_DISABLED 禁止指定的菜单项。不与vb的enabled属性兼容 <br>
MF_ENABLED 允许指定的菜单项。不与vb的enabled属性兼容 <br>
MF_GRAYED 禁止指定的菜单项,并用浅灰色描述它。不与vb的enabled属性兼容 <br>
MF_MENUBARBREAK 在弹出式菜单中,将指定的菜单项放置于一个新列,并用一条垂直线分隔不同的列 <br>
MF_MENUBREAK 在弹出式菜单中,将指定的菜单项放置于一个新列。在顶级菜单中,将菜单项放置到一个新行 <br>
MF_OWNERDRAW 创建一个物主绘图菜单(由您设计的程序负责描绘每个菜单项) <br>
MF_POPUP 将一个弹出式菜单置于指定的菜单项。可用于创建子菜单及弹出式菜单 <br>
MF_SEPARATOR 在指定的菜单项处显示一条分隔线 <br>
MF_STRING 在指定的菜单项处放置一个字符串。不与vb的caption属性兼容 <br>
MF_UNCHECKED 检查指定的菜单项。不能与vb的checked属性兼容 <br>
----------------------------------------------<br>
1个创建位图菜单的例子,代码如下:<br>
Public Const SRCCOPY = &HCC0020<br>
Public Const MF_BYPOSITION = &H400&<br>
Public Const MF_BITMAP = &H4&
<p>Private Sub Form_Load()<br>
Dim nLoopCtr, nWidth, nHeight As Integer<br>
Dim lResult, hTempDC, lTempID, hMenuID, lItemCount, hBitmap As Long<br>
nWidth = Picture1(nLoopCtr).Width \ Screen.TwipsPerPixelX<br>
nHeight = Picture1(nLoopCtr).Height \ Screen.TwipsPerPixelY<br>
hMenuID = GetSubMenu(GetMenu(Me.hwnd), 0)<br>
hTempDC = CreateCompatibleDC(Picture1(nLoopCtr).hdc)<br>
For nLoopCtr = 0 To 3<br>
hBitmap = CreateCompatibleBitmap(Picture1(nLoopCtr).hdc, nWidth, nHeight)<br>
lTempID = SelectObject(hTempDC, hBitmap)<br>
lResult = BitBlt(hTempDC, 0, 0, nWidth, nHeight, Picture1(nLoopCtr).hdc, 0, 0, SRCCOPY)<br>
lTempID = SelectObject(hTempDC, lTempID)<br>
mnubook(nLoopCtr).Caption = ""<br>
lResult = ModifyMenuA(hMenuID, nLoopCtr, MF_BYPOSITION Or MF_BITMAP, _<br>
GetMenuItemID(hMenuID, nLoopCtr), hBitmap)<br>
Next nLoopCtr<br>
lResult = DeleteDC(hTempDC)<br>
End Sub</p>
<p align="center">
<br>
< <a href="040104.htm">上一页</a>--<a href="http://www.xxby.com" target="_blank">华生小屋</a>--<a href="040106.htm">下一页</a>
><br>
</td>
</tr>
</table>
</center>
</div>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -