AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

WM_MOUSEMOVE in mehr als einem TControl verarbeiten.

Ein Thema von alleinherrscher · begonnen am 30. Mai 2017 · letzter Beitrag vom 2. Jun 2017
Antwort Antwort
Benutzerbild von alleinherrscher
alleinherrscher

Registriert seit: 8. Jul 2004
Ort: Aachen
797 Beiträge
 
Delphi XE2 Professional
 
#1

AW: WM_MOUSEMOVE in mehr als einem TControl verarbeiten.

  Alt 31. Mai 2017, 12:45
Okay, ich versuche es mit dem Mousemove des TForms! Danke!!
„Software wird schneller langsamer als Hardware schneller wird. “ (Niklaus Wirth, 1995)

Mein Netzwerktool: Lan.FS
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#2

AW: WM_MOUSEMOVE in mehr als einem TControl verarbeiten.

  Alt 31. Mai 2017, 13:22
Okay, ich versuche es mit dem Mousemove des TForms! Danke!!
sagen wir mal dein Pfeil oben ist die Aktuelle X Position von der aktuellen CursorPosition dann sollte das ganz einfach so gehen.
Auf dein Beispiel angewendet.
Musst du aber auf dein Control hin noch ändern.. (Button1 wäre dann dein TGraphicControl)

Delphi-Quellcode:
procedure TForm1.Button1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
  p: TPoint;
begin

  GetCursorPos(p); // p.x und p.y wären dann die aktuellen Position von deinen Pfeilen
  Windows.ScreenToClient(Handle, p); // <<< Form Handle deshalb "Windows.ScreenToClient" und nicht ScreenToClient
  image1.Canvas.TextOut(1,30,'Button: ' +inttostr(x)+','+inttostr(y) + ' '); // + ' ' damit überschüssige Zeichen gelöscht werden (Uninteressant für dein Problem)
  image1.Canvas.TextOut(1,1,'Image: '+inttostr(p.x)+','+inttostr(p.y)+ ' ');
end;
Wenn du nun auf den Button gehst ändert sich die X-Position vom Image Relativ zum Screen.
Sorry es war nicht ganz einfach zu verstehen was du eigentlich wolltest.

gruss

Geändert von EWeiss (31. Mai 2017 um 13:55 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von alleinherrscher
alleinherrscher

Registriert seit: 8. Jul 2004
Ort: Aachen
797 Beiträge
 
Delphi XE2 Professional
 
#3

AW: WM_MOUSEMOVE in mehr als einem TControl verarbeiten.

  Alt 31. Mai 2017, 13:54
Okay, ich versuche es mit dem Mousemove des TForms! Danke!!
sagen wir mal dein Pfeil oben ist die Aktuelle X Position von der aktuellen CursorPosition dann sollte das ganz einfach so gehen.
Auf dein Beispiel angewendet.
Musst du aber auf dein Control hin noch ändern.. (Button1 wäre dann dein TGraphicControl)

Delphi-Quellcode:
procedure TForm1.Button1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
  p: TPoint;
begin

  GetCursorPos(p);
  Windows.ScreenToClient(Handle, p); // <<< Form Handle deshalb "Windows.ScreenToClient" und nicht ScreenToClient
  image1.Canvas.TextOut(1,30,'Button: ' +inttostr(x)+','+inttostr(y));
  image1.Canvas.TextOut(1,1,'Image: '+inttostr(p.x)+','+inttostr(p.y));
end;
Wenn du nun auf den Button gehst ändert sich die X-Position vom Image Relativ zum Screen.
Sorry es war nicht ganz einfach zu verstehen was du eigentlich wolltest.

gruss
Das meinte ich leider auch nicht. Sorry! Wie man zwischen Client und Parent Koordinaten umrechnet, ist mir klar. Guck mal, du hast jetzt beide TextOuts in Button1MouseMove gepackt. Genau das wollte ich aber ja nicht, weil es nicht allgemein genug ist. Vielleicht geht das, was ich vorhabe einfach nicht...

Guck dir bitte, wenn du Zeit hast, nochmal modifizierte Beispiel im Anhang an. Ich habe jetzt eine neues TControl Namens TMyButton, abgeleitet von TButton definiert. Dieses soll irgendetwas machen, sobald die Maus darauf rumfährt (das funktioniert: Es erscheint als Button.caption die position der Maus, und diese wird aktuallisiert, solange die Maus auf dem Button ist). Allerdings wird, während die Maus auf dem Button ist, das OnImage1MouseMove Ereignis logischerweise nicht mehr ausgeführt. Wie kann ich erreichen, dass dieses Ereignis ausgeführt wird, OBWOHL die Maus auf dem TMyButton ist? Ich kann es ja schlecht in das OnMouseMove des TMyButtons schreiben, denn der kennt das TImage ja gar nicht... Verständlicher? Ich weiß einfach nicht, wie ich mich sonst ausdrücken soll?!
Angehängte Dateien
Dateityp: zip testprojekt2.zip (1,97 MB, 4x aufgerufen)
„Software wird schneller langsamer als Hardware schneller wird. “ (Niklaus Wirth, 1995)

Mein Netzwerktool: Lan.FS

Geändert von alleinherrscher (31. Mai 2017 um 13:56 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#4

AW: WM_MOUSEMOVE in mehr als einem TControl verarbeiten.

  Alt 31. Mai 2017, 13:57
Ok
Letzter Versuch.
Werde es mir Anschauen.

EDIT:
Das wird so nicht gehen weil dein Image kein Handle zur Verfügung hat an dem ich Messagen schicken könnte.

gruss

Geändert von EWeiss (31. Mai 2017 um 14:15 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von alleinherrscher
alleinherrscher

Registriert seit: 8. Jul 2004
Ort: Aachen
797 Beiträge
 
Delphi XE2 Professional
 
#5

AW: WM_MOUSEMOVE in mehr als einem TControl verarbeiten.

  Alt 31. Mai 2017, 14:25
Schade, aber wie teilt denn das Panel (oder die Form) dem Image mit, dass sich gerade die Maus darauf bewegt und kann man da nicht irgendwie eingreifen? Oder beim Bearbeiten des WM_MouseMove im TButton irgendwie zurückmelden, dass die Nachricht nicht verarbeitet worden ist, oder so? -> Message.Result... ?

//edit gut, dann werde ich wohl vermutlich auf die Variante umsteigen, alles in eine Paintbox bzw ein Image zu zeichnen...
„Software wird schneller langsamer als Hardware schneller wird. “ (Niklaus Wirth, 1995)

Mein Netzwerktool: Lan.FS

Geändert von alleinherrscher (31. Mai 2017 um 14:45 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#6

AW: WM_MOUSEMOVE in mehr als einem TControl verarbeiten.

  Alt 31. Mai 2017, 14:47
Schade, aber wie teilt denn das Panel (oder die Form) dem Image mit, dass sich gerade die Maus darauf bewegt und kann man da nicht irgendwie eingreifen? Oder beim Bearbeiten des WM_MouseMove im TButton irgendwie zurückmelden, dass die Nachricht nicht verarbeitet worden ist, oder so? -> Message.Result... ?

//edit gut, dann werde ich wohl vermutlich auf die Variante umsteigen, alles in eine Paintbox bzw ein Image zu zeichnen...
Ich versuche mal eine Alternative mit Subclassing eines STATIC Image Window.. was dann auch ein Handle hat.
Versprechen kann ich aber nichts

gruss
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#7

AW: WM_MOUSEMOVE in mehr als einem TControl verarbeiten.

  Alt 31. Mai 2017, 14:56
TImage hat weder ein eigenes Handle, noch ein eigenes Canvas und verwendet stattdessen die entsprechenden Resourcen des Parent Controls.

Entweder nimmst du eine TPaintBox und zeichnest komplett alles darauf, oder du leitest weiterhin von TGraphicControl ab und zeichnest zusätzlich manuell den Inhalt, der vorher vom Image dargestellt wurde.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#8

AW: WM_MOUSEMOVE in mehr als einem TControl verarbeiten.

  Alt 31. Mai 2017, 17:59
Dein Testprojekt zurück das soll dir zeigen warum es mit einem normalen Image nicht funktioniert.
Scheint niemand zu brauchen, hab's gelöscht.
Du benötigst also eine Alternative ein Panel mit BorderStyle None wäre eine lösung das hat ein Handle..
Darauf kannst du genauso zeichnen wie auf einem Image.

gruss

Geändert von EWeiss (31. Mai 2017 um 21:29 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort

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 21:41 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz