Mausposition in PaintBox ermitteln

Rund um die LCL und andere Komponenten
Antworten
Targion
Beiträge: 688
Registriert: Mi 3. Okt 2007, 21:00
OS, Lazarus, FPC: Linux (L 0.9.29 FPC 2.4.2)
CPU-Target: x86_64

Mausposition in PaintBox ermitteln

Beitrag von Targion »

Hallo!
Da in meiner PaintBox das OnMouseMove-Event nur bei gedrückter Maustatse ausgelöst wird, und da ich die Position des Cursors in der PaintBox auch gerne hätte, wenn ein Control darüberliegt, benutze ich folgenden Code:

Code: Alles auswählen

pX:=Mouse.CursorPos.X-Form1.Left-box.Parent.Left-box.Left;
  pY:=Mouse.CursorPos.Y-Form1.Top-box.Parent.Top-box.Top;
box.Parent ist eine GroupBox, die unter der PaintBox liegt. Eigentlich müsste mir das die Koordinaten in der PaintBox liefern... Die X-Koordinate stimmt auch, allerdings ist die Y-Korrdinate um über 50 Einheiten zu groß.
Wenn ich den Code so verändere:

Code: Alles auswählen

pX:=Mouse.CursorPos.X-Form1.Left-box.Parent.Left-box.Left-6;
  pY:=Mouse.CursorPos.Y-Form1.Top-box.Parent.Top-box.Top-58; //???: Why 58?
Habe ich die korrekte Mausposition. Diese empirische Variante gefällt mir aber nicht so, da ich nicht weiß, warum die Position korrigiert werden muss und die Position so auf anderen Systemen eventuell falsch ermittelt wird.
Woran kann das liegen?

P.S: Ich nutze FPC 2.4.0-rc1 + Lazarus 0.9.28

Benutzeravatar
theo
Beiträge: 10904
Registriert: Mo 11. Sep 2006, 19:01

Re: Mausposition in PaintBox ermitteln

Beitrag von theo »

Ich weiss es nicht ganz genau, aber das klingt nach Titelleiste.
Form.Top ist der Obere Rand des Formulars (Titelleiste). Dort beginnt aber nicht deine Arbeitsfläche.
Die Höhe der Titelleiste habe ich experimentell so herausfinden können:
ClientToScreen(Point(0,0)).Y-Top
Muss man aber nochmal überdenken. :wink:

Targion
Beiträge: 688
Registriert: Mi 3. Okt 2007, 21:00
OS, Lazarus, FPC: Linux (L 0.9.29 FPC 2.4.2)
CPU-Target: x86_64

Re: Mausposition in PaintBox ermitteln

Beitrag von Targion »

Hmm... wo kommt diese Variante von ClientToScreen her?
Bei mir ist di nur so definiert:

Code: Alles auswählen

function ClientToScreen(
  Handle: HWND;
  var P: TPoint
):Boolean;
Außerdem: Die Titelleiste (darauf war ich schon gekommen...) ist niemals über 50 Pixel hoch. Da muss noch irgendwas anderes vergessen worden sein.

Benutzeravatar
theo
Beiträge: 10904
Registriert: Mo 11. Sep 2006, 19:01

Re: Mausposition in PaintBox ermitteln

Beitrag von theo »

Targion hat geschrieben:Hmm... wo kommt diese Variante von ClientToScreen her?
Das ist eine Methode von TControl
z.B. Form1.ClientToScreen();

Geht's denn nicht mit MyControl.ScreenToClient(Point(Mouse.CursorPos.X,Mouse.CursorPos.Y)) ?

Targion
Beiträge: 688
Registriert: Mi 3. Okt 2007, 21:00
OS, Lazarus, FPC: Linux (L 0.9.29 FPC 2.4.2)
CPU-Target: x86_64

Re: Mausposition in PaintBox ermitteln

Beitrag von Targion »

Ja, das funktioniert super! Vielen Dank!

Antworten