通过形象化的图标,浮动工具箱可以省去用户点击主菜单的麻烦。当鼠标位于其图标上时,在鼠标下方会自动“掉出”一个小标签,说明它的功能。而且常居上层,不会被打开的文件所覆盖。并且可以改变形状及位置,尽可能地减少所占用的桌面面积。
能不能在我们自己的应用程序中使用这种先进手段呢?这里介绍一种用VB来实现的简单方法。主要编程思路是:引用WindowsAPL函数,实现表单常居上层;建立控件数组,通过控件的MouseMove事件,引发注释的弹出和消失。
一、浮动工具箱的可视化实现方法
1.在Form1上放置控件SSRIBBON按钮(因为它本身有三种状态:按下、弹起、禁止使用,大部分图标按钮都是这类按钮)。再放置文本框Text1(也可以用Label控件,但效果会有所不同,稍后会讲到),再放置一个命令按钮Command1。各控件属性见表1(表中只列出一个例子,其它的只要修改相应的属性即可)。
2.单击GP3D1,按ALT+Del剪切,然后按ALT+Insert复制若干,形成控件数组GP3D1(0)、GP3D1(2)、GP3D1(3)……,再如法建立Text1(0)、Text1(1)、Text1(3)……。
3.调整按钮及文本框位置。
在此期间,每一项工作都是必要的,如文本框的Visible值为False,以确保程序启动时不显示文本框,而Enable值为False是为了在运行过程中,文本框不能输入文本。如果使用标签(Label)代替文本框,则不能纵向排列图标按钮,只能横向。因为下面的按钮会盖住Label,但使用Label要比文本框省内存。
为了实现常居上层的效果,必须调用WindowsAPI函数,事实上VB的很多方法都引用于WindowsAPI。这里我们用SetWindowsPos过程,此过程在User.exe中定义,它是Windows系统重要的动态链接库。在VB中引用API函数时,必须在通用声明部分声明注册。声明API函数往往比较麻烦且易出错,比如:
DeclareSubSetWindowPosLib″User″(ByValhwndAsInteger,ByVal
hWndInsertAfterAsInteger,ByValXAsInteger,ByValYAsInteger,ByVal
cxAsInteger,ByValcyAsInteger,ByValwFlagsAsInteger)
如果所有的API函数声明都这么输入,效率太低。好在各版本的VB都提供了一个WindowsAPIHelp程序,打开它,搜索SetWindowPos,找到以后点击超文本带出解释,拷贝即可。
二、创建代码在通用声明部分输入下列代码并声明一些常量及全程变量:
DeclareSubsetwindowposLib″User″(ByValhwndAsInteger,ByVal
hWndInsertAfterAsInteger,ByValXAsInteger,ByValYAsInteger,
ByValcxAsInteger,ByValcyAsInteger,ByValwFlagsAsInteger)
ConstSWP_NOSIZE=1
ConstSWP_nomove=2
Constflags=SWP_NOSIZEOrSWP_nomove
Consthwnd_topmost=-1
Consthwnd_notopmost=-2
DimIAsInteger
DimBAsInteger
为GP3D1按钮的MouseMove事件添加如下代码,这里仅实现鼠标在其上时注释器弹出、不在其上时隐去的功能,读者可再加一个计时器控件和一些代码,即可很容易地实现鼠标位于其上片刻后注释器弹出的效果,这样就不会出现鼠标“路过”按钮时,注释器即出现的结果了。
SubGP3D1_MouseMove(indexAsInteger,ButtonAsInteger,Shift
AsInteger,XAsSingle,YAsSingle)
I=index′记录下当前鼠标位于哪个按钮上
text1(I).Visible=True″使其弹出
IfB<>IThen′使其它按钮隐去
text1(B).Visible=False
EndIf
B=I′请好好体会这个变量B的作用
EndSub
为Command1按钮的Click事件添加如下代码:
SubCommand1_Click()
doWhileDoEvents()′用DoEvents()实现空闲循环下的多任务监测
setwindowposhwnd,hwnd_topmost,0,0,0,0,flags′实现常居上层
loop
EndSub
为Command1按钮的MouseMove事件添加如下代码:
SubCommand1_MouseMove(ButtonAsInteger,ShiftAsInteger,X
AsSingle,YAsSingle)
text1(I).Visible=False′鼠标离开按钮区,位于命令按钮上时隐去注释器
EndSub
为Form1的MouseMove事件添加如下代码:
SubForm_MouseMove(ButtonAsInteger,ShiftAsInteger,X
AsSingle,YAsSingle)
text1(I).Visible=False′鼠标离开按钮区,进入表单时隐去注释器
EndSub->