AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Bereich beim Mouseover hervorheben

Offene Frage von "Keks"
Ein Thema von Keks · begonnen am 9. Mai 2008 · letzter Beitrag vom 10. Mai 2008
Antwort Antwort
Seite 2 von 2     12
Keks

Registriert seit: 25. Mai 2005
122 Beiträge
 
#11

Re: Bereich beim Mouseover hervorheben

  Alt 9. Mai 2008, 23:30
Zitat von bitsetter:
Du kannst doch allen Komponenten die gleiche MouseMove Prozedur zuweisen.
Das finde ich nicht sehr geschickt...

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:
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?
  Mit Zitat antworten Zitat
Benutzerbild von Fussball-Robby
Fussball-Robby

Registriert seit: 22. Okt 2007
Ort: Nähe Köln
1.063 Beiträge
 
Delphi 7 Enterprise
 
#12

Re: Bereich beim Mouseover hervorheben

  Alt 9. Mai 2008, 23:41
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;
Robert L.
Der folgende Satz ist richtig!
Der vorherige Satz ist falsch!

Paradox
  Mit Zitat antworten Zitat
Keks

Registriert seit: 25. Mai 2005
122 Beiträge
 
#13

Re: Bereich beim Mouseover hervorheben

  Alt 10. Mai 2008, 00:25
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?
  Mit Zitat antworten Zitat
Benutzerbild von bitsetter
bitsetter

Registriert seit: 17. Jan 2007
1.169 Beiträge
 
Turbo Delphi für Win32
 
#14

Re: Bereich beim Mouseover hervorheben

  Alt 10. Mai 2008, 00:38
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.
Gruß bitsetter
"Viele Wege führen nach Rom"
Wolfgang Mocker (geb. 1954), dt. Satiriker und Aphoristiker
  Mit Zitat antworten Zitat
Keks

Registriert seit: 25. Mai 2005
122 Beiträge
 
#15

Re: Bereich beim Mouseover hervorheben

  Alt 10. Mai 2008, 15:39
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?
  Mit Zitat antworten Zitat
Benutzerbild von Fussball-Robby
Fussball-Robby

Registriert seit: 22. Okt 2007
Ort: Nähe Köln
1.063 Beiträge
 
Delphi 7 Enterprise
 
#16

Re: Bereich beim Mouseover hervorheben

  Alt 10. Mai 2008, 15:56
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
Robert L.
Der folgende Satz ist richtig!
Der vorherige Satz ist falsch!

Paradox
  Mit Zitat antworten Zitat
Keks

Registriert seit: 25. Mai 2005
122 Beiträge
 
#17

Re: Bereich beim Mouseover hervorheben

  Alt 10. Mai 2008, 16:27
Stark! Vielen Dank!
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:03 Uhr.
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