久久―日本道色综合久久,亚洲欧美精品在线,狼狼色丁香久久婷婷综合五月,香蕉人人超,日本网站黄,国产在线观看不卡免费高清,无遮挡的毛片免费

2023信創(chuàng)獨(dú)角獸企業(yè)100強(qiáng)
全世界各行各業(yè)聯(lián)合起來,internet一定要實(shí)現(xiàn)!

VB自制IE風(fēng)格按扭控件

2004-02-20 eNet&Ciweek

  網(wǎng)上的IE風(fēng)格按紐控件不可謂少,然而天下的免費(fèi)午餐總不會讓你輕輕松松到吃下去,其中個(gè)味眾人自知。其實(shí),在VB6.0中,IE風(fēng)格按紐很容易制作,真正的核心代碼只需調(diào)用兩個(gè)API函數(shù)。

  按常規(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)。

  如果你正在這樣做,將會發(fā)現(xiàn)一個(gè)致命的問題。那就是,MouseMove事件只能檢測到鼠標(biāo)在Image和Label兩個(gè)控件本身范圍內(nèi)的移動,你沒有辦法檢測鼠標(biāo)的離開。 “計(jì)算機(jī)世界”曾經(jīng)登載過一個(gè)解決的辦法,利用SetCapture和ReleaseCapture API函數(shù)。經(jīng)SetCapture設(shè)定的控件可以強(qiáng)制性地捕捉鼠標(biāo)在整個(gè)屏幕上的移動。這樣,不管鼠標(biāo)是不是在控件界面范圍內(nèi)移動,控件都可以捕捉得到。經(jīng)過實(shí)踐發(fā)現(xiàn)這個(gè)解決方案仍然存在一個(gè)問題,那就是,SetCapture所設(shè)定控件在 ReleaseCapture前,自動提示(ToolTipText)功能被抑制。這意味著這樣編制的按紐沒有自動提示功能,對很多人來說,這難以忍受。

  WIN32 API函數(shù)集是個(gè)不折不扣的龐大寶藏,你總能從里面找到你需要的工具。 GetCursorPos和WindowFromPoint兩個(gè)函數(shù)可以完美地解決這個(gè)問題。 GetCursorPos可以返回鼠標(biāo)指針相對整個(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ù)檢測鼠標(biāo)指針是否已經(jīng)離開了按紐,如果離開,則使按紐恢復(fù)平坦?fàn)顟B(tài)并立即使計(jì)時(shí)器無效,否則繼續(xù)檢測。我們看到,計(jì)時(shí)器的真正用途是用來觸發(fā)事件,以檢測鼠標(biāo)的離開。將計(jì)時(shí)器置為無效是為了在不必要的時(shí)間,降低計(jì)時(shí)器對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)肝恢玫目丶浔?

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)頻道: eNews

您對本文或本站有任何意見,請?jiān)谙路教峤?,謝謝!

投稿信箱:tougao@enet16.com