Mauskoordinaten auslesen

Hi!
Ich lese mit folgendem Quellcode die Mauskoordinaten aus und zeichne Pixel auf die UserForm. Trotzdem werden die Punkte versetzt gezeichnet, wo liegt mein Fehler?

Vielen Dank für Eure Hilfe! MfG, Andi


Private Declare Function GetDC Lib "user32" (ByVal hWnd As Long) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function SetPixel Lib "gdi32" (ByVal hDC As Long, ByVal X As Long, ByVal Y As Long, ByVal crColor As Long) As Long
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long

Private Type POINTAPI
 X As Long
 Y As Long
End Type

Private Sub UserForm\_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
 Dim hWnd As Long
 Dim hDC As Long
 Dim PT As POINTAPI

 hWnd = FindWindow(vbNullString, Me.Caption)
 hDC = GetDC(hWnd)
 GetCursorPos PT

 SetPixel hDC, PT.X + KorrekturX, PT.Y + KorrekturY, vbBlack
End Sub

[MOD] Pre-Tags eingefügt

Hi Andi,

die API gibt Dir die Koordinaten der Maus auf dem Bildschirm zurück. Wenn Du einen Punkt setzt, gibst Du aber die Koordinaten auf dem Formular an. Dann fehlt Dir natürlich der Abstand des Formulars von Rand, der Pixel wird um diesen Betrag versetzt gesetzt.

Dann hast Du auf der Form noch das Image. Wenn Du zum Zeichnen Koordinaten im Image angibst, mußt Du auch noch die Lage des Images auf der form berücksichtigen.

Dazu kommt noch, daß die Koordinaten tatsächlich ‚verschoben‘ sind, eine Konstante kommt tatsächlich noch dazu. Ein Beispiel in VB:

Option Explicit

Private Declare Function GetCursorPos Lib "user32" (lpPoint As \_
 POINTAPI) As Long

Private Type POINTAPI
 x As Long
 y As Long
End Type

Private Sub Picture1\_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single)
 Dim Result&, P As POINTAPI
 Dim TF As Integer

 TF = 15 'Twip-Faktor :smile: Pixel in Twips wandeln
 Result = GetCursorPos(P)
 If Button = 1 Then
 Picture1.PSet ((((P.x - 132) \* TF) - Me.Left + Picture1.Left), ((P.y - 87) \* TF) - Me.Top + Picture1.Top)
 End If
End Sub

An VBA anpassen mußt Du’s selbst, mit VBA kenne ich mich nicht so gut aus. :smile:

Gruß, Rainer
PS: Versuch mal Pre-Tags für Code zu verwenden, dann muß ich die nicht immer einfügen.

Hi Rainer!
Danke für deine Antwort! Wie kommst du auf 132 und 87?

Ganz ehrlich: mir ist Excel ein Rätsel… eigentlich müsste es doch auch problemlos mit X und Y aus der MouseMove Funktion klappen, aber keine Chance…

MfG, Andi

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hi Andi,

Danke für deine Antwort! Wie kommst du auf 132 und 87?

*gg* probiert. :smile: Der Rest war logisch zu ermitteln, wo diese Differenz her kommt, weiß ich nicht.

Ganz ehrlich: mir ist Excel ein Rätsel… eigentlich müsste es
doch auch problemlos mit X und Y aus der MouseMove Funktion
klappen, aber keine Chance…

So einfach nicht. VBA ist eben keine richtige Programmiersprache, sondern nur ein zusätzliches Hilfsmittel, um den Funktionsumfang von Excel etwas zu erweitern. Excel ist aber nur eine Tabellenkalkulation, mehr nicht.

Wenn Du nun grafische Anwendungen mit Excel schreiben willst, verwendest Du schlicht das falsche Werkzeug. Astronomische Forschungen gestalten sich mit einem Mikroskop etwas schwierig, dafür nimmt man besser ein Teleskop und nicht das Mikroskop, das man ohnehin schon hat. Wenn Du aber VB nicht extra kaufen willst und das, was man eigentlich mit VB macht mit Excel machen willst, bereitet das erhebliche Schwierigkeiten. Nicht alles, was mit VB problemlos geht, ist mit Excel realisierbar.

Gruß, Rainer

Lösung
Hi Rainer!

Also bei mir funktionierts jetzt und zwar mit dem Faktor ~(4/3), frag mich aber bitte nicht wieso, die hauptsache ist es funktioniert :wink:

Dim XRichtig As Integer
Dim YRichtig As Integer

Private Sub Image1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal x As Single, ByVal y As Single)
XRichtig = (X * 1.33) + Image1.Left
YRichtig = (Y * 1.33) + Image1.Top
End Sub

Schönes Wochenende! MfG, Andi