按常規(guī),IE風(fēng)格按紐的制作原理是,放置四條邊線在Image和Label控件四周,在 Image和Label控件的MouseMove事件中,改變左,上,右,下線的Visible 和 BorderColor屬性,按紐呈現(xiàn)浮起效果,同時(shí)改變Image控件的Picture 屬性,調(diào)入盤旋(Hover)圖片;在Image和Label的MouseDown事件中通過改變Image和Label控件的位置(右下移)按紐呈現(xiàn)按下效果;鼠標(biāo)離開按紐,按紐恢復(fù)平坦(Flat)狀態(tài)。
如果你正在這樣做,將會(huì)發(fā)現(xiàn)一個(gè)致命的問題。那就是,MouseMove事件只能檢測(cè)到鼠標(biāo)在Image和Label兩個(gè)控件本身范圍內(nèi)的移動(dòng),你沒有辦法檢測(cè)鼠標(biāo)的離開!坝(jì)算機(jī)世界”曾經(jīng)登載過一個(gè)解決的辦法,利用SetCapture和ReleaseCapture API函數(shù)。經(jīng)SetCapture設(shè)定的控件可以強(qiáng)制性地捕捉鼠標(biāo)在整個(gè)屏幕上的移動(dòng)。這樣,不管鼠標(biāo)是不是在控件界面范圍內(nèi)移動(dòng),控件都可以捕捉得到。經(jīng)過實(shí)踐發(fā)現(xiàn)這個(gè)解決方案仍然存在一個(gè)問題,那就是,SetCapture所設(shè)定控件在 ReleaseCapture前,自動(dòng)提示(ToolTipText)功能被抑制。這意味著這樣編制的按紐沒有自動(dòng)提示功能,對(duì)很多人來說,這難以忍受。
WIN32 API函數(shù)集是個(gè)不折不扣的龐大寶藏,你總能從里面找到你需要的工具。 GetCursorPos和WindowFromPoint兩個(gè)函數(shù)可以完美地解決這個(gè)問題。 GetCursorPos可以返回鼠標(biāo)指針相對(duì)整個(gè)屏幕的坐標(biāo),WindowFromPoint 則根據(jù)鼠標(biāo)指針的坐標(biāo),返回指針?biāo)幍目丶木浔T谶@里,還需要引入一個(gè)定時(shí)器 (Timer)控件。
整個(gè)編程原理是,在UserControl_Show事件中,先將定時(shí)器置為無效。在Image和Label的MouseMove事件中,執(zhí)行使按紐浮起的代碼,然后將定時(shí)器置為有效,這時(shí)定時(shí)器開始倒計(jì)時(shí),在計(jì)時(shí)器的Timer事件中,用上述API函數(shù)檢測(cè)鼠標(biāo)指針是否已經(jīng)離開了按紐,如果離開,則使按紐恢復(fù)平坦?fàn)顟B(tài)并立即使計(jì)時(shí)器無效,否則繼續(xù)檢測(cè)。我們看到,計(jì)時(shí)器的真正用途是用來觸發(fā)事件,以檢測(cè)鼠標(biāo)的離開。將計(jì)時(shí)器置為無效是為了在不必要的時(shí)間,降低計(jì)時(shí)器對(duì)CPU的占用。
以下是函數(shù)和所需數(shù)據(jù)類型聲明。
Private Type POINTAPI
X As Long
Y As Long
End Type
Private Declare Function GetCursorPos Lib "user32" _
(lpPoint As POINTAPI) As Long
Private Declare Function WindowFromPoint Lib "user32" _
(ByVal xPoint As Long, ByVal yPoint As Long) As Long
在VB6.0中新建一個(gè)ActiveX Control項(xiàng)目。添加LineLeft,LineTop,LineRight, LineBottom四條邊線,一個(gè)Image控件Image1,一個(gè)Label標(biāo)簽控件Label1,一個(gè)定時(shí)器控件Timer1。關(guān)于用VB創(chuàng)建ActiveX控件的步驟這里不作描述(可以參考本文所附完整源代碼)。與按紐制作有關(guān)的主要代碼如下:
Private Sub UserControl_Show()
Timer1.Interval = 1 1/1000 秒
Timer1.Enabled=False 關(guān)閉定時(shí)器
將UserControl的提示信息引入Image1,Label1控件,
If UserControl.Ambient.UserMode = True Then
在RunTime
Image1.ToolTipText = UserControl.Extender.ToolTipText
Label1.ToolTipText = UserControl.Extender.ToolTipText
End If
......此處添加其它代碼
End Sub
Private Sub Image1_MouseMove
(Button As Integer, Shift As Integer, _
X As Single, Y As Single)
....... 此處添加使按紐呈現(xiàn)浮起效果的代碼
Timer1.Enabled = True 打開定時(shí)器
End Sub
Private Sub Timer1_Timer() 定時(shí)器觸發(fā)
Dim MousePosition As POINTAPI
Dim ReturnValue As Long
Dim HwndHoverWindow As Long
ReturnValue = GetCursorPos(MousePosition)
返回鼠標(biāo)指針坐標(biāo)
返回指針?biāo)肝恢玫目丶浔?/P>
HwndHoverWindow = WindowFromPoint
(MousePosition.X, MousePosition.Y)
If HwndHoverWindow < > UserControl.hWnd Then
如果鼠標(biāo)離開了按紐區(qū)域
...... 此處添加使按紐恢復(fù)平坦?fàn)顟B(tài)的代碼
Timer1.Enabled = False 將定時(shí)器關(guān)閉,
以釋放資源
End If
End Sub
Private Sub Image1_MouseDown
(Button As Integer, Shift As Integer, _
X As Single, Y As Single)
If Button = 1 Then
....... 此處添加使按紐呈現(xiàn)按下狀態(tài)的代碼
End If
End Sub
相關(guān)推薦:2010年9月計(jì)算機(jī)等級(jí)考試精華備考資料匯總北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |