|
VFP5.0的多数控件具有自己的RightClick方法来响应鼠标右键单击事件。我们可以利用这一特性,方便地定制适合自己需要的快捷菜单。比如在常用的编辑框里单击一下鼠标右键,就可以获得一个编辑快捷菜单,包含有常用的复制、剪切、粘贴、还原、重做等功能。下面是创建动态菜单的步骤。
首先,需要创建一个不可视类ShortcutMenu,该类用来响应自定义快捷菜单的显示和动作:选择新建类,在“新类”对话框中填入新类名称ShortcutMenu,该类派生于Container,将其存储在dymenu.vcx中。
在类设计器界面下,将其调整为一个图标大小(16*16)。为该类添加一个“新方法程序” ShowMenu,用于显示快捷菜单。
·建立菜单·
1.为showmenu填入以下代码:
LPARAMETERS taMenu
*:\\taMenu是上级传来的数组
LOCAL lcOnSelection, lnMenuCount, lnCount, llDoubleArray
LOCAL lcMenuItem, lcMenuSelection
IF PARAMETERS()=0 OR TYPE(″taMenu″)#″C″
RETURN .F.
ENDIF
lnMenuCount=0
lnMenuCount=ALEN(taMenu,1)
*:\\获取数组的行数,即菜单项数
IF lnMenuCount=0
RETURN .F.
ENDIF
llDoubleArray=(ALEN(taMenu,2)>0)
*:\\检查传来的数组是否是二维数组
ACTIVATE SCREEN
DEACTIVATE POPUP —popShortcutMenu
*:定义动态菜单
DEFINE POPUP —popShortcutMenu ;
FROM MROW(),MCOL() ;
MARGIN ;
RELATIVE ;
SHORTCUT
FOR lnCount = 1 TO lnMenuCount
*:根据上级传来的参数定义菜单条目
lcMenuItem=IIF(llDoubleArray,taMenu[lnCount,1],taMenu[ln
Count])
*:\\ 逐一提取菜单项。如果是二维数组则取第lnCount行
第一列元素
*:\\ 否则如果是二维数组则取第lnCount行元素
DEFINE BAR lnCount OF —popShortcutMenu PROMPT
(lcMenuItem)
*:\\定义第lnCount菜单项
ENDFOR
ON SELECTION POPUP —popShortcutMenu DEACTIVATE
POPUP —popShortcutMenu
ACTIVATE POPUP —popShortcutMenu
RELEASE POPUP —popShortcutMenu
*:\\如果没有活动菜单或者用户按下 Esc 键则直接返回
IF BAR()=0
RETURN .F.
ENDIF
IF llDoubleArray
lcMenuSelection=taMenu[BAR(),2]
*:\\ 根据实际选择的内容提取对应的命令语句,并送入字
符变量lcOnSelection
IF (NOT EMPTY(lcMenuSelection)) AND
(TYPE(″lcMenuSelection″)==″C″)
lcOnSelection=ALLTRIM(lcMenuSelection)
ENDIF
IF EMPTY(lcOnSelection)
lcOnSelection=ALLTRIM(IIF(EMPTY(tcOnSelection),″″,t
cOnSelection))
ENDIF
ELSE
lcOnSelection=ALLTRIM(IIF(EMPTY(tcOnSelection),″″,tcOn
Selection))
ENDIF
IF EMPTY(lcOnSelection)
*:\\如果对应命令为空则返回
RETURN .F.
ELSE
*:\\否则展开命令字符串解释执行
&lcOnSelection
ENDIF
2.在方法destroy中填入以下代码:
DEACTIVATE MENU —popShortcutMenu
3.在方法Init Event中填入以下代码:
THIS.visible = .F. &&运行期间不显示。
至此,我们的幕后响应工作已经完成。
方法ShowMenu用一个二维数组接收一组快捷菜单命令,动态地定义、显示它们。其中,数组的第一列数据是菜单提示信息,第二列是对应的命令字符串。因此,调用过程只需按此格式定义好一个二维数组,然后发送给ShortcutMenu类的实例即可。
·使用动态菜单·
1.先建立一个表单form1;
2.按下表单控制工具栏上的查看类按钮,添加一个用户自定义的类库:dymenu.vcx,注册自定义控制:shortcutmenu;
3.在表单上添加一个快捷菜单类的控制shortcutmenu1;
4.在表单上添加上一个编辑框edit1。在其RightClick Event方法中添加如下代码:
LOCAL laMenu[7,2]
*:\\ 为该编辑框定义7个菜单条目
*:\\ 数组的第一列是菜单条提示信息,第二列是要执行的命令字符串。
IF THIS.SELLENGTH>0
laMenu[1,1]=″\
ELSE
laMenu[1,1]=″\拷贝″
ENDIF
laMenu[1,2]=[SYS(1500,″—med—copy″,″—medit″)]
IF THIS.SELLENGTH>0
laMenu[2,1]=″\
ELSE
laMenu[2,1]=″\剪切″
ENDIF
laMenu[2,2]=[SYS(1500,″—med—cut″,″—medit″)]
laMenu[3,1]=″粘贴″
laMenu[3,2]=[SYS(1500,″—med—paste″,″—medit″)]
laMenu[4,1]=′\-′ &&分隔条
laMenu[4,2]=′ ′
laMenu[5,1]=′复原′
laMenu[5,2]=[SYS(1500,″—MED—UNDO″,″—medit″)]
laMenu[6,1]=′重做′
laMenu[6,2]=[SYS(1500,″—MED—REDO″,″—medit″)]
laMenu[7,1]=′自定义′
laMenu[7,2]=″ wait window ′能看见我么?′ ″
THISFORM. Shortcutmenu1.ShowMenu(@laMenu)
*:\\调用快捷菜单方法,注意要以传地址方式传递数组
RETURN
5.单击运行按钮,然后右击编辑框,快捷菜单就被激活了。
在实际使用当中,可以为不同的控制在RightClick Event方法中定义不同的快捷菜单,使用起来就更为方便。当然,一个表单上有一个shortcutmenu类的控制就够了!
Tags:菜单 快捷 自己 定义 laMenu 一个 ENDIF IF popShortcutMenu
|