Mouse Handling

DirectX staat toe om een meer robuuste, precieze manier te gebruiken om de muis te benaderen dan diegene gegeven door Visual Basic zelf.
Om hiervan gebruik te maken moet je wel rekening houden met volgende factoren:

Dit zijn de initialisatie stappen:

Dim mobjdx As New DirectX7
Dim mobjdi As DirectInput
Dim mobjdiMouse As DirectInputDevice

Set mobjdi = mobjdx.DirectInputCreate()

Set mobjdiMouse = mobjdi.CreateDevice("GUID_SysMouse")

mobjdiMouse.SetCommonDataFormat DIFORMAT_MOUSE
mobjdiMouse.SetCooperativeLevel frmMouse.hWnd, DISCL_FOREGROUND Or DISCL_EXCLUSIVE
mobjdiMouse.Acquire


Hier wordt een DirectInput object gedeclareerd en wordt ook gebruik om een device aan te maken. De "DirectInput.CreateDevice" methode heeft slechts één argument: de "GUID" van het device dat we willen aanmaken. Om de standaard systeem-muis te gebruiken, geven we "GUID_SysMouse" door.
Volgende stap, is het data formaat van het device instellen. Dit vertelt DirectInput hoe het de verkrijgde gegevens moet interpreteren. In dit geval willen we "DIFORMAT_MOUSE".
Nu moeten we nog de cooperative level (inderdaad, net zoals in DirectDraw) instellen en de "DirectInputDevice.Acquire" methode aanroepen, om net zoals in de 'Keyboard'-tutorial het device toegankelijk te maken.

Een belangrijke opmerking hier is dat als het 'Form' object, doorgegeven als eerste parameter, van de "SetCooperativeLevel" methode nog niet zichtbaar is, de "Acquire" methode letterlijk zal falen en resulteren in een foutmelding. Wees dus zeker de 'Form.Show' methode te gebruiken wanneer nodig is. Ook zal je rekening moeten houden dat als we de exclusiviteit van de muis verliezen (kan gebeuren als een andere toepassing die afneemt), je de muis zal moeten re-acquiren of anders er de gevolgen van dragen.

Eens toegankelijk gemaakt, kunnen we het device ondervragen wanneer het ons aanstaat:

Dim mdiMState As DIMOUSESTATE
mobjdiMouse.GetDeviceStateMouse mdiMState


"DIMOUSESTATE" is zoals een UDT voor muis gegevens. Het bevat informatie omtrent de X, Y en Z (!!!) bewegingen van de muis, alsook omtrent de status van de knoppen. Het aanroepen van de "DirectInputDevice.GetDeviceStateMouse" methode vult de variable met de meest recente data verkrijgbaar van de muis.
Noot: Je kan hier mischien wat code aan toevoegen, want dit zal zeer waarschijnlijk foutmeldingen geven, zodra we de exclusiviteit verlore zijn.

De teruggestuurde informatie is, zoals eerder vermeld, niet absoluut. Door de waarde van "mdiMState.x" te verifieren, verkrijg je NIET de huidige X-coordinaat van de muis. Wat het je wel zal geven is de X-verandering t.o.v. de laatste keer dat je de status controleerde (Eigenlijk de ijking tussen de twee waarden die je dan hebt!). Met andere woorden: je zal zelf rekening moeten houden met de positie van de muis.

Const MOUSE_SPEED = 2
Dim mintMouseX As Integer

mintMouseX = mintMouseX + mdiMState.x * MOUSE_SPEED


Deze code zal de waargenomen X-verandering van de muis toevoegen aan de huidige X coördinaat. Het vermenigvuldigt ook de verandering met een constante, zodat dit ons toelaat de gevoeligheid van de muisbeweging aan te passen. Doe hetzelfde voor de Y-verandering, en je verkrijgt, inderdaad, absolute coördinaten! Je zou waarschijnlijk wat code moeten toevoegen om rekening te houden met de rand van het scherm.

Dim mblnLMouseButton As Boolean
Dim mblnRMouseButton As Boolean

If mdiMState.buttons(0) <> 0 Then mblnLMouseButton = True
If mdiMState.buttons(0) = 0 Then mblnLMouseButton = False

If mdiMState.buttons(1) <> 0 Then mblnRMouseButton = True
If mdiMState.buttons(1) = 0 Then mblnRMouseButton = False


Nu nog de knoppen. DirectInput geeft ondersteuning tot 8 knoppen, maar we zullen het maar houden bij de standaard 'links en rechts'-muizen. De knoppen, leden van het "DIMOUSESTATE" type, zijn een array, de eerste index vertegenwoordigt de status van de linker muis-knop, de tweede die van de rechter. Het enige dat we moeten doen is om te zien of deze waarden gelijk zijn aan nul of niet, en zo hun status opslagen in variabelen van het type boolean, om de code wat makkelijker te maken.

Zo simpel is het. Nu heb je de coördinaten en de status van de knoppen van de muis. Benut deze informatie zoals je wilt

mobjdiMouse.Unacquire
Set mobjdiMouse = Nothing
Set mobjdi = Nothing


Vergeet natuurlijk niet je muis weer vrij te geven aan andere toepassingen, als je klaar bent.

Klik hier om een voorbeeld te downloaden dat dit illustreert.

Translated by Djamel Grine