Dobrej pokec   Lišanská šlapka   MSDN   VB na Microsoft.cz   NCHAT Nový design
   Portál  O firmě  Profil  Reference  Produkty  Odkazy  Diskuse  Tisková verze 



  Novinky e-mailem
Pokud chcete být informováni o změnách ,přihlašte se k odběru novinek!
  
  
  Nejčtenější články
 Seznam všech českých hubů abecedně. (32126)
 Seznam hubů nad 100 uživatelů (20839)
 Konfigurovatelné rozbalovací menu (17454)
 Jak na makra (14334)
 Rozbalovací menu v JavaScriptu (2.) (12661)
  Nejstahovanější soubory
 Action Meter (1846)
 Slovní Fotbal (777)
 IE Boss Guard (484)
 zdroják slovní fotbal (383)
 Folder Watcher (370)
  Anketa

  Nabídka portálu

 Adobe Premiere
    Jak se dá udělat
 Alternativní prohlížeče
    FireFox
 ASP
    Tipy a triky
 Direct Connect
    Huby
    Scripty pro HUB
    Tipy a triky CZDC++
 Game Maker
    Tipy a triky
 Hry
    Akční
    Logické
 HTML
    Scripting (VBS,JS)
    Tipy a triky
 Internet
    Užitečné triky
 Microsoft Office
    Tipy, triky, návody
    Užitečná makra
    VBA Tipy a triky
 MS SQL Server
    Nastavení
    Seriály
    Tipy a triky
 Multimedia
    Návody
 Oracle
    PL/SQL
 PHP
    Jak na to
    Tipy a triky
 Užitečné odkazy
    Grafické programy
    Programátorské
 Visual Basic
    DirectX
    Formuláře
    Jak se dá udělat ...
    Užitečné funkce
    Win32Api
    Zdroje
 Visual Basic .NET
    Užitečné funkce
 Vtípky
    Vtipy a anekdnoty
 Vypalování
    DVD Shrink
    Tipy a triky
 Windows
    Jak se dá ...
    Tipy a triky pro XP
    Triky pro IE


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ářů: 2873
Unikátních: 2835


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í.




Příspěvky ke článku:



© Swit.cz, Marek Kočí 2003