Software 版 (精华区)

发信人: checcy (老巴夺), 信区: Software
标  题: 用VB制作常居上层的浮动工具箱
发信站: 哈工大紫丁香 (Wed Apr  8 03:17:00 1998), 转信

用VB制作常居上层的浮动工具箱

□呼和浩特 于滔



通过形象化的图标,浮动工具箱可以省去用户点击主菜单的麻烦。当鼠标
位于其图标上时,在鼠标下方会自动“掉出”一个小标签,说明它的功
能。而且常居上层,不会被打开的文件所覆盖。并且可以改变形状及位置
,尽可能地减少所占用的桌面面积。

能不能在我们自己的应用程序中使用这种先进手段呢?这里介绍一种用VB
来实现的简单方法。主要编程思路是:引用 Windows APL函数,实现表单
常居上层;建立控件数组,通过控件的 MouseMove事件,引发注释的弹
出和消失。

一、浮动工具箱的可视化实现方法

1.在Form1 上放置控件SSRIBBON按钮(因为它本身有三种状态:按下、弹
起、禁止使用,大部分图标按钮都是这类按钮)。再放置文本框 Text1(也
可以用 Label控件,但效果会有所不同,稍后会讲到),再放置一个命令
按钮Command1。各控件属性见表1(表中只列出一个例子,其它的只要修
改相应的属性即可)。

2.单击GP3D1,按 ALT+Del剪切,然后按 ALT+Insert 复制若干,形成
控件数组GP3D1(0)、GP3D1(2)、GP3D1(3)……,再如法建立Text1(0)、T
ext1(1)、Text1(3)……。

3.调整按钮及文本框位置如图所示,右表为Tools窗体的特性表。

在此期间,每一项工作都是必要的,如文本框的Visible值为 False,以
确保程序启动时不显示文本框,而Enable值为False是为了在运行过程中
,文本框不能输入文本。如果使用标签(Label)代替文本框,则不能纵向
排列图标按钮,只能横向。因为下面的按钮会盖住Label,但使用Label要
比文本框省内存。

为了实现常居上层的效果,必须调用Windows API 函数,事实上VB的很多
方法都引用于Windows API 。这里我们用SetWindowsPos过程,此过程在
User.exe中定义,它是Windows系统重要的动态链接库。在VB中引用 
API函数时,必须在通用声明部分声明注册。声明API函数往往比较麻烦且
易出错,比如:

Declare Sub SetWindowPos Lib ″User″ (ByVal hwnd As Integer, B
yVal hWndInsertAfter As Integer,ByVal X As Integer, ByVal Y As
Integer,ByVal cx As Integer, ByVal cy As Integer, ByVal wFlags
As Integer)

如果所有的API函数声明都这么输入,效率太低。好在各版本的VB都提供
了一个Windows API Help程序,打开它,搜索 SetWindowPos ,找到以
后点击超文本带出解释, 拷贝即可。

二、创建代码 在通用声明部分输入下列代码并声明一些常量及
全程变量:

Declare Sub setwindowpos Lib ″User″ (ByVal hwnd As Integer, B
yVal hWndInsertAfter As Integer, ByVal X As Integer, ByVal Y As
Integer, ByVal cx As Integer, ByVal cy As Integer, ByVal wFlag
s As Integer)

Const SWP_NOSIZE = 1

Const SWP_nomove = 2

Const flags = SWP_NOSIZE Or SWP_nomove

Const hwnd_topmost = -1

Const hwnd_notopmost = -2

Dim i As Integer

Dim B As Integer

为GP3D1按钮的MouseMove 事件添加如下代码,这里仅实现鼠标在其上时
注释器弹出、不在其上时隐去的功能,读者可再加一个计时器控件和一些
代码,即可很容易地实现鼠标位于其上片刻后注释器弹出的效果,这样
就不会出现鼠标“路过”按钮时,注释器即出现的结果了。

Sub GP3D1_MouseMove (index As Integer, Button As Integer, Shift
As Integer, X As Single, Y As Single)

i = index ′记录下当前鼠标位于哪个按钮上

text1(i).Visible = True ″使其弹出

If B <> i Then ′使其它按钮隐去

text1(B).Visible = False

End If

B = i ′请好好体会这个变量B的作用

End Sub

为Command1按钮的Click事件添加如下代码:

Sub Command1_Click ()

do While DoEvents() ′用DoEvents()实现空闲循环下的多任务监


setwindowpos hwnd, hwnd_topmost, 0, 0, 0, 0, flags ′实现常
居上层

loop

End Sub

为Command1按钮的MouseMove事件添加如下代码:

Sub Command1_MouseMove (Button As Integer, Shift As Integer, X 
As Single, Y As Single)

text1(i).Visible = False ′鼠标离开按钮区,位于命令按钮上
时隐去注释器

End Sub

为Form1的MouseMove事件添加如下代码: 

Sub Form_MouseMove (Button As Integer, Shift As Integer, X 
As Single, Y As Single)

text1(i).Visible = False ′鼠标离开按钮区,进入表单时
隐去注释器

End Sub

                           GO BACK

-- 
*********************************
Chengyan Che - Software Freelancer
Harbin, P.R.China
mailto: checcy@public.hr.hl.cn
ICQ: 5116726

--
☆ 来源:.哈工大紫丁香 bbs.hit.edu.cn.[FROM: checcy@public.hr.hl.]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:2.698毫秒