Nabídka portálu se při zobrazení článku přesouvá na konec pravého sloupce nabídek.
Jak přidat kontrolnímu prvku událost MouseExit |
Autor: Kočí Marek
| Zdroj:
| Vytvořeno: 10.1.2003
| Publikováno: 10.1.2003
| Čtenářů: 2924
| Unikátních: 2886
|
Postup pro využití API funkcí k zachycování přesunu ukazatele myši z ovládacího prvku
Jestliže si přejete vložit ke kontrolnímu prvku událost MouseExit(), nebo chcete odchytávat stav, kdy kurzor myši opouští prostor nad kontrolním prvkem, musíte použít dvojici Win32 API funkcí
SetCapture a ReleaseCapture.
Funkce SetCapture() umožní oknu dostávat informace o souřadnicích myši i v případě, že se kurzor nenachází nad kontrolním prvkem.
Pouze jedno jediné okno (prvek, form) může ve stejný čas dostávat tyto informace.
Navíc je tato volba resetována při stisku levého tlačítka myši.
Funkce ReleaseCapture resetuje tuto volbu.
Takže jak na to.
Do části General kontrolního prvku vložte tyto deklarace:
Option Explicit
Private fCapture As Boolean
Private Type POINTL
X As Long
Y As Long
End Type
Private Declare Function SetCapture Lib "user32" _
(ByVal hwnd As Long) As Long
Private Declare Function ReleaseCapture Lib "user32" () _
As Long
Private Declare Function ClientToScreen Lib "user32" ( _
ByVal hwnd As Long, _
lpPoint As POINTL) As Long
Private Declare Function WindowFromPoint Lib "user32" ( _
ByVal xPoint As Long, _
ByVal yPoint As Long) As Long
Public Event MouseMove(ByVal Button As Integer, _
ByVal Shift As Integer, _
ByVal X As Single, ByVal Y As Single)
Public Event MouseExit()
Private Sub Capture()
If Not fCapture Then
fCapture = True
SetCapture UserControl.hwnd
End If
End Sub
Funkce Capture() voláním API funkce SetCapture, které předá handle okna kontrolního prvku, umožní kontrolnímu prvku odchytávat pohyb myši i v případě, že se myš nenachází nad tímto oknem. Dále nastavuje privátní proměnnou fCapture. Ta je použita jako indikátor stavu, zda je umožněno
odchytávat pohyb myši nebo nikoliv. Pak již stačí přidat do událostí Click() a MouseMove() kontrolního prvku následující kód:
Private Sub UserControl_Click()
fCapture = False
Capture
End Sub
Private Sub UserControl_MouseMove(Button As Integer, _
Shift As Integer, X As Single, Y As Single)
Dim pt As POINTL, hwnd As Long
If Not fCapture Then
Capture
UserControl.BackColor = vbYellow
RaiseEvent MouseMove(Button, Shift, X, Y)
Else
pt.X = X / Screen.TwipsPerPixelX
pt.Y = Y / Screen.TwipsPerPixelY
ClientToScreen Parent.hwnd, pt
hwnd = WindowFromPoint(pt.X, pt.Y)
If hwnd = UserControl.hwnd Then
UserControl.BackColor = vbRed
RaiseEvent MouseMove(Button, Shift, X, Y)
Else
UserControl.BackColor = vbGreen
ReleaseCapture
fCapture = False
RaiseEvent MouseExit
End If
End If
End Sub
Jakmile se kurzor myši objeví v prostoru kontrolního prvku, je mu umožněno voláním procedury Capture() odchytávat pohyb myši na celé obrazovce.
Zároveň se změní barva pozadí kontrolního prvku na žlutou a vyvolá se událost MouseMove i s příslušnými parametry.
Jestliže se kurzor myši pohybuje v prostoru nad kontrolním prvkem, je barva pozadí změněna na červenou a též je vyvolána událost MouseMove.
Ovšem v případě, že myš se ocitne mimo prostor kontrolního prvku, je změněno pozadí na zelenou barvu a možnost odchytávání pohybu myši po celé obrazovce je voláním fce ReleaseCapture odstraněna. Nakonec je vyvolána událost MouseExit().
Protože, jak už bylo výše zmíněno, stisk tlačítka myši automaticky ruší sledování pohybu myši, je zapotřebí navíc přidat kód
do události Click kontrolního prvku. Ten nejprve resetuje hodnotu proměnné fCapture na False a poté je volána procedura Capture,
která toto sledování znova obnoví.
|