弹出式菜单的实现(PopupMenuMethod)
VB中在菜单设计窗口(MenuDesignWindow)中设计的菜单是下拉式菜单。下拉式菜单是用户在任何时候都可以在顶端菜单条上选择后拉出的菜单,而弹出式菜单则是在程序界面的一定区域内点按鼠标键后出现的菜单。在某些情况下,弹出式菜单会使系统功能的实现更加简洁和高效,使用起来更加得心应手。
Widnows程序的弹出式菜单一般是当用户在程序的桌面上点按鼠标键时出现的。弹出式菜单多用于实现系统的附加或增强功能。弹出式菜单的内容,可以随点按鼠标键的位置不同而变化。由于弹出的菜单要覆盖屏幕的一部分,所以应尽量缩短菜单里的文字。
在VB中,弹出式菜单的实现要用到下拉式菜单设计的技术和PopupMenu方法。具体的做法是:
在菜单设计窗口(MenuDesignWindow)里设计好相应窗体的弹出式菜单。要注意的是,要弹出的菜单必须至少有一个子菜单;因而这个菜单不能有快捷键,并且Checked属性必须是False。再把弹出式菜单的Visible属性改为False。
在具有设计好的弹出式菜单的窗体的Form_Click中加入以下代码(假设弹出式菜单的Name属性是mnuExample):
SubForm_Click()
PopupMenumnuExample
EndSub
如果要求只有按下鼠标左键或者右键才能激活菜单,就必须在Form_MouseDown里加入如下代码:
SubForm_MouseDown(ButtonAsInteger,ShiftAsInteger,xAsSingle,yAsSingle)
IfButton=2thenButton=2表示鼠标右键
PopupMenumnuExample
EndIf
PopupMenu的完整句法是:
[Form.]PopupMenumenuname[flags[,x[,y]]]
改变flags的值可以控制弹出式菜单的表现形式。Flags有两组值。第一组值用来控制菜单的显示方式,包括POPUPMENU_LEFTALIGNPOPUPMENU_CENTERALIGN,POPUPMENU_RIGHTALIGN,分别表示以x为左边界,以x为中心和以x为右边界的显示方式,并且以x为左边界是缺省的方式;另外一组值用来控制菜单项的选中方式,包括POPUPMENU_LEFTBUTTON和POPUPMENU_RIGHTBUTTON,分别表示左键选中和左/右键选中均可,并且左键选中是缺省的方式。Flags的值由上面的两组值经过OR运算得出。例如,要求左对齐显示并且左键选中为准,则应有:
flags=POPUPMENU_LEFTALIGNORPOPUPMENU_LEFTBUTTON
x和y用来定义菜单弹出的位置、缺省是鼠标点中的位置。
菜单项的其他属性
用ALT+字母键激活顶层菜单,或者在菜单激活后用字母键激活一个菜单项,必须学会使用&。&用在菜单项的标题属性(Caption)里。它的用法和作用与在用C语言编制的Windows程序中的用法和作用相同。
有时希望顶层菜单之间的间隔大一些,或者某个顶层菜单出现在菜单条的最右端,这时就要用到标题属性是空格的菜单。如果一个菜单的标题是由多个空格组成的,那么这个菜单在菜单条上就占用跟空格的个数相应的空间,并且它后面的菜单也顺序地后移;如果这个菜单的Visible属性是False,那么它就跟不存在一样。
窗口设计的原则和举例
下面是一个浮动窗口技术的例子。为了引起用户的注意,或者必须保证含有重要信息的窗口不被其他窗口覆盖,就要用到浮动窗口技术,建立一个“总在最前面”(TopMost)的窗口。具体的做法是:
(1)在VB程序中加入如下的声明:
DeclareFunctionSetWindowPosLib"user"(Byvalh%,Byvalhb%,Byvalx%,Byvaly%,By
valcx%,Byvalcy%,Byvalf%)AsInteger
GlobalConstSWP_NOMOVE=2
GlobalConstSWP_NOSIZE=1
GlobalConstHWND_TOPMOST=?1
GlobalConstHWND_NOTOPMOST=?2
GlobalConstFLAGS=SWP_NOMOVEOrSWP_NOSIZE
(2)假设要把窗体frmExample设置成总在最前面的窗口,只要在frmExample窗体的Form_Load
过程里加入以下代码:
Dimsuccess%
success=SetWindowPos(frmExample.hWnd,HWND_TOPMOST,0,0,0,0,FLAGS)
如果要取消总在最前面的特性,则可以执行如下的代码:
success=SetWindowPos(frmExample.hWnd,HWND_NOTOPMOST,0,0,0,0,FLAGS)
success不等于0表示SetWindowPos执行成功。
在MDI程序里,有一个窗口是所有其他窗口的父窗口,各个子窗口完成相对独立的功能,就像是多个独立的工具组合起来一样。在这方面,MSWord和Windows的FileManager是最好的例子。