top
Loading...
用VB制作常居上層的浮動工具箱
⊥ü蝸蠡耐急輳《ぞ呦淇梢允∪ビ沒У慊髦韃說サ穆櫸場5筆蟊晡揮諂渫急晟鮮保謔蟊晗路交嶙遠暗舫觥幣桓魴”昵得魎墓δ堋6頁>由喜悖換岜淮蚩奈募哺恰2⑶銥梢愿謀湫巫醇拔恢茫】贍艿丶跎偎加玫淖爛婷婊?

能不能在我們自己的應用程序中使用這種先進手段呢?這里介紹一種用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)、Text1(1)、Text1(3)……。

3.調整按鈕及文本框位置。

在此期間,每一項工作都是必要的,如文本框的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, ByVal
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 setwin pos Lib ″User″ (ByVal hwnd As Integer, ByVal
hWndInsertAfter As Integer, ByVal X As Integer, ByVal Y As Integer,
ByVal cx As Integer, ByVal cy As Integer, ByVal wFlags 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 $#@60;$#@62; 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

作者:http://www.zhujiangroad.com
來源:http://www.zhujiangroad.com
北斗有巢氏 有巢氏北斗