Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Bereich beim Mouseover hervorheben (https://www.delphipraxis.net/113540-bereich-beim-mouseover-hervorheben.html)

Keks 9. Mai 2008 22:30

Re: Bereich beim Mouseover hervorheben
 
Zitat:

Zitat von bitsetter
Du kannst doch allen Komponenten die gleiche MouseMove Prozedur zuweisen.

Das finde ich nicht sehr geschickt...

Zitat:

Zitat von bitsetter
Oder du verwendest das Ereignis onMessage der Komponente TApplicationEvents.

Das habe ich jetzt mal gemacht und es funktioniert soweit, dass die Koordinaten ständig aktualisiert werden, egal, worauf der Mauszeiger zeigt. Super!
Das Problem ist aber nun, dass die Koordinaten vom Gesamtbildschirm angezeigt werden und nicht die Koordinaten im Programmfenster, was ich aber bräuchte, um die Hervorhebung an die exakte Stelle zeichnen zu können. Kriegt man das nun auch noch irgendwie hin?
Wenn ich das hier versuche:
Delphi-Quellcode:
Label1.Caption := Format('%d:%d', [Mouse.CursorPos.X-Form1.Left, Mouse.CursorPos.Y-Form1.Top]);
dann stimmen die Werte immer noch nicht exakt. Ich vermute, es muss noch der Fensterrand abgezogen werden, aber das ist mir irgendwie nicht so ganz geheuer. Je nach Systemeinstellung (anderer Windows-Skin, große Schriftarten) wird das dann nachher doch anders berechnet und die Position stimmt nicht mehr. Also wie geht das richtig?

Fussball-Robby 9. Mai 2008 22:41

Re: Bereich beim Mouseover hervorheben
 
Zitat:

Zitat von Keks
Das Problem ist aber nun, dass die Koordinaten vom Gesamtbildschirm angezeigt werden und nicht die Koordinaten im Programmfenster, was ich aber bräuchte, um die Hervorhebung an die exakte Stelle zeichnen zu können. Kriegt man das nun auch noch irgendwie hin?

Delphi-Quellcode:
var
  Pt: TPoint;
begin
  Pt := {Form1.}ScreenToClient(Mouse.CursorPos);
end;

Keks 9. Mai 2008 23:25

Re: Bereich beim Mouseover hervorheben
 
Bestens! So sieht das ganze nun aus und gibt zuverlässig die Mausposition an:

Delphi-Quellcode:
procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean);
  var Pt : TPoint;
begin
  if (Msg.message = WM_MOUSEMOVE) then
  begin
    Pt := ScreenToClient(Mouse.CursorPos);
    Label6.Caption := Format('%d:%d', [Pt.X, Pt.Y]);
  end;
end;
Zu muss ich die möglichen Flächen definieren können. Dabei muss ich pro Fläche zwei Points bzw. 4 Integer speichern.
Erstelle ich dafür nun eigene Records und verwalte die in einem Array oder geht das auch geschickter? Ich muss ja anschließend bei jeder Mausbewegung die gesamte Liste durchgehen und schauen, ob sich der Mauszeiger in einem dieser Felder befindet. Entsprechend wäre es super, wenn das performanceoptimiert gehandhabt werden könnte. Was ist dafür die beste Vorgehensweise?

bitsetter 9. Mai 2008 23:38

Re: Bereich beim Mouseover hervorheben
 
Nimm doch die Struktur TRect dafür und teste mit der Funktion PtInRect() ob sich der Cursor in dem Bereich befindet.
Da sich die Bereiche zur Laufzeit wahrscheinlich nicht ändern werden, würde ein statischer Array dafür sicherlich ausreichen.

Keks 10. Mai 2008 14:39

Re: Bereich beim Mouseover hervorheben
 
Danke! Das klapt jetzt sehr gut. :)

Jetzt hoffentlich das letzte Problem: Wenn sich farblich etwas hinter einem Element verändert, nimmt das auf dessen Hintergrundfarbe keinen Einfluss. Es muss erst sowas wie Label1.Repaint gemacht werden, dann klappt das. Nun möchte ich das aber nicht für jedes Element einzeln machen. Kann man irgendwie alle Elemente in z.B. einer Groupbox gleichzeitig neu zeichnen?

Fussball-Robby 10. Mai 2008 14:56

Re: Bereich beim Mouseover hervorheben
 
Zitat:

Zitat von Keks
Kann man irgendwie alle Elemente in z.B. einer Groupbox gleichzeitig neu zeichnen?

Delphi-Quellcode:
procedure DoRepaint(c: TWinControl);
begin
  if (c = nil) or (c.Handle = 0) then
    Exit;
  RedrawWindow(c.Handle, nil, 0,
      RDW_ERASE or RDW_FRAME or RDW_INVALIDATE or RDW_ALLCHILDREN);
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  DoRepaint(GroupBox1);
end;
So dürfte es funktionieren.

Mfg

Keks 10. Mai 2008 15:27

Re: Bereich beim Mouseover hervorheben
 
Stark! Vielen Dank! :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:45 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz