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