VFB将菜单做成了控件,分为窗口菜单(TopMenu)和弹出菜单(PopupMenu)。窗口菜单显示在窗口中,弹出菜单一般用于右键弹出。从工具栏中选择窗口菜单和弹出菜单到设计窗体,选择窗口菜单,则可以看到属性栏中有Menu(菜单)属性,点击下拉按钮后会出现菜单编辑器,如图:
新增按钮可以新增一个菜单,插入按钮可以插入菜单,上下箭头(不大用,其实鼠标点也是一样的)可以上下移动一个选中的位置,左右箭头可以修改菜单的级别。新增按钮后,在文字里输入显示的菜单名称,在名称里输入调用菜单的定义名称。快捷键、是否选中和是否可用都可以根据需要选择。如果菜单需要设置图标,则选择图像。要注意的是如果需要分隔线,则使用"-",名称不能为空。
编辑一个文件菜单示例,如图:
窗体上的效果如图:
双击窗体菜单后,即可看到自动生成的菜单事件。
Sub Form1_TopMenu1_WM_Command(hWndForm As hWnd,wID As ULong) '点击了菜单项
Select Case wID
Case mnuFile ' 文件
Case mnuFileNew ' 新建
Case mnuFileOpen ' 打开
Case mnuFileSave ' 保存
Case mnuExit ' 退出
End Select
End Sub
弹出菜单的编辑方式跟窗口菜单类似,不再重复,弹出菜单中设置剪切、复制、粘贴属性。
一、属性
1、Check(是否选中)
该属性是菜单前是否有打钩选项,True则打钩,表示选中,False则不打钩,表示未选中。Check的参数就是之前菜单编辑的名称,这个名称也就是菜单的ID号。
2、Enabled(是否使能)
该属性设置菜单是否可用的。Enabled的参数就是之前菜单编辑的名称。
3、hMenu(菜单句柄)
该属性返回菜单句柄。
4、Text(文本)
该属性设置菜单显示文字。Text的参数就是之前菜单编辑的名称。
二、方法
1、PopupMenu
该方法函数的原型如下:
Function PopupMenu(hWndParent As hWnd = 0, x As Long = 0, y As Long = 0) As Long '在当前鼠标位置,弹出此菜单,hWndParent 是接收菜单事件的窗口。返回点击的菜单项标识符。
hWndParent必须是菜单所在窗口,因为菜单的事件需要窗口来接收消息,不能是控件。x,y指定菜单显示的位置。
三、事件
1、WM_Command事件
Sub Form1_PopupMenu1_WM_Command(hWndForm As hWnd,wID As ULong) '点击了菜单项
Select Case wID
Case mnuCut ' 剪切
Case mnuCopy ' 复制
Case mnuPaste ' 粘贴
End Select
End Sub
菜单的事件只要编辑好菜单,双击控件即可生成。
四、实例
代码如下:
Sub Form1_TopMenu1_WM_Command(hWndForm As hWnd,wID As ULong) '点击了菜单项
Select Case wID
Case mnuFile ' 文件 '不用
Case mnuFileNew ' 新建
AfxMsg "选择了【新建】"
Case mnuFileOpen ' 打开
AfxMsg "选择了【打开】"
Case mnuFileSave ' 保存
AfxMsg "选择了【保存】"
Case mnuExit ' 退出
Form1.Close '关闭窗体
End Select
End Sub
Sub Form1_WM_ContextMenu(hWndForm As hWnd, xPos As Long, yPos As Long) '单击鼠标右键,通常用于弹出菜单
PopupMenu1.PopupMenu(hWndForm,xPos,yPos)
End Sub
Sub Form1_PopupMenu1_WM_Command(hWndForm As hWnd,wID As ULong) '点击了菜单项
Select Case wID
Case mnuCut ' 剪切
AfxMsg "选择了【剪切】"
Case mnuCopy ' 复制
AfxMsg "选择了【复制】"
Case mnuPaste ' 粘贴
AfxMsg "选择了【粘贴】"
End Select
End Sub
运行效果:
完整工程:
https://github.com/rainheart311/VisualFreeBASIC/tree/master/Menu