AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

FMX TPaintBox

Ein Thema von ScharfeMietze · begonnen am 9. Feb 2023 · letzter Beitrag vom 10. Feb 2023
Antwort Antwort
ScharfeMietze

Registriert seit: 5. Mär 2014
165 Beiträge
 
Delphi 10.2 Tokyo Architect
 
#1

FMX TPaintBox

  Alt 9. Feb 2023, 14:09
Ich habe in FMX
In einer TMultiview ein TLayout darin ein TImage mit einer TPaintbox
In diesem Minigame soll ein Kreis gezeichnet werden.
Nur erscheint der Kreis nicht dort wo der Nuzer den Bildschim berührt..
Hier der Code
Delphi-Quellcode:
procedure THeaderFooterForm.pb1Paint(Sender: TObject; Canvas: TCanvas);
begin
  Canvas.DrawBitmap(img1.Bitmap, RectF(0, 0, img1.Bitmap.Width, img1.Bitmap.Height),
    RectF(0, 0, pb1.Width, pb1.Height), 1);
end;


procedure THeaderFooterForm.pb1MouseDown(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Single);
var
  Canvas: TCanvas;
  BitmapPos: TPointF;
begin
  Canvas := img1.Bitmap.Canvas;
  Canvas.BeginScene;
  try
    Canvas.Stroke.Color := TAlphaColorRec.Green;
    Canvas.Fill.Color := TAlphaColorRec.Green;
    Canvas.DrawEllipse(RectF(X - 5, Y - 5, X + 5, Y + 5), 1);
  finally
    Canvas.EndScene;
  end;
  pb1.Repaint;
end;
Diverse Versuche mit
img1.ScreenToLocal(TRectF.Create(x,y); haben nicht den erwünschten Erfolg gebracht...
Was muss ich tun damit der Kreis genau unter dem Finger des Users erscheint?
Mit Dank vorab
Mietze
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.798 Beiträge
 
Delphi 12 Athens
 
#2

AW: FMX TPaintBox

  Alt 9. Feb 2023, 14:27
Kurze Frage...erscheint der Kreis da wo mit der Maus geklickt wurde? Wenn ja, dann müsste man versuchen herauszufinden, wie der Touchscreen die Eingabe weitergibt, wenn nein, dann wird das Testen zumindest einfacher... Ansetzen könnte man da bei der Bildschirmauflösung, bzw. Skalierung. Ist die bei etwas anderem als 100%?

Sherlock
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
ScharfeMietze

Registriert seit: 5. Mär 2014
165 Beiträge
 
Delphi 10.2 Tokyo Architect
 
#3

AW: FMX TPaintBox

  Alt 9. Feb 2023, 18:34
Kurze Frage...erscheint der Kreis da wo mit der Maus geklickt wurde? Wenn ja, dann müsste man versuchen herauszufinden, wie der Touchscreen die Eingabe weitergibt, wenn nein, dann wird das Testen zumindest einfacher... Ansetzen könnte man da bei der Bildschirmauflösung, bzw. Skalierung. Ist die bei etwas anderem als 100%?

Sherlock
Ich habe mir den Spaß gemacht und es die Plattform Windows 64 Hinzugefügt. Es ist auch dort so genau das Gleiche der Kreis erscheint NICHT beim MausKlick..
Ich habe nicht bewusst an Skalierungen gedreht. Auf dem Foto habe ich auf die ersten 3 Symbole geklickt. Die Kreise erscheinen alle unten drunter und rechts wobei sich auch die Abstände "willkürlich" zu vergrößern scheinen

Wo müsste ich den wenn nach welcher Skalierung suchen?
Miniaturansicht angehängter Grafiken
screenshot-2023-02-09-182023.jpg  
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: FMX TPaintBox

  Alt 9. Feb 2023, 19:28
So in etwa besser?
Delphi-Quellcode:
var
  newPos: TPoint;
begin
  newPos := ScreenToClient(Mouse.CursorPos);
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.062 Beiträge
 
Delphi 12 Athens
 
#5

AW: FMX TPaintBox

  Alt 9. Feb 2023, 19:31
Wie ist denn Windows/Desktop/Monitor eingestellt?
> Desktop > Konextmenü > Anzeigeeinstellungen > Skalierung und Anordnung

Und was hast du dazu in den Projektoptionen angegeben?
> Projektoptionen > Anwendung > Manifest > DPI-Unterstüzung (natürlich für die Windows-Configs)

@KodeZwerg
Wenn, dann natürlich pb1.ScreenToClient, denn Self.ScreenToClient wird nicht ganz passen.
Und eventuell sicherheitshalber auch nochmal von pb1 zu img1 umrechnen, also pb1.ConvertLocalPointTo(img1,...) oder img1.ConvertLocalPointFrom(pb1,...),
oder gleich direkt img1.ScreenToClient verwenden, falls die Beiden unterschiedlich skallieren.

Und dann noch der Spaß, falls auch noch das Bitmap in TImage gestrecht/scaliert wird.
z.B. in der VCL ändert sich die Größe des Bitmaps nicht, wenn sich die Größe des TImages ändert, nachdem das erste Mal auf das Bitmap zugegriffen (es generiert) wurde. Und hier vermutlich auch nicht.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu ( 9. Feb 2023 um 19:40 Uhr)
  Mit Zitat antworten Zitat
ScharfeMietze

Registriert seit: 5. Mär 2014
165 Beiträge
 
Delphi 10.2 Tokyo Architect
 
#6

AW: FMX TPaintBox

  Alt 9. Feb 2023, 23:23
Wie ist denn Windows/Desktop/Monitor eingestellt?
> Desktop > Konextmenü > Anzeigeeinstellungen > Skalierung und Anordnung

Und was hast du dazu in den Projektoptionen angegeben?
> Projektoptionen > Anwendung > Manifest > DPI-Unterstüzung (natürlich für die Windows-Configs)

@KodeZwerg
Wenn, dann natürlich pb1.ScreenToClient, denn Self.ScreenToClient wird nicht ganz passen.
Und eventuell sicherheitshalber auch nochmal von pb1 zu img1 umrechnen, also pb1.ConvertLocalPointTo(img1,...) oder img1.ConvertLocalPointFrom(pb1,...),
oder gleich direkt img1.ScreenToClient verwenden, falls die Beiden unterschiedlich skallieren.

Und dann noch der Spaß, falls auch noch das Bitmap in TImage gestrecht/scaliert wird.
z.B. in der VCL ändert sich die Größe des Bitmaps nicht, wenn sich die Größe des TImages ändert, nachdem das erste Mal auf das Bitmap zugegriffen (es generiert) wurde. Und hier vermutlich auch nicht.
Unter Windows war nur kurz zu Testzwecken und ist sofort wieder runter geflogen.
Diese screen to Client geschichten habe ich unter FMX in Android nicht...

Delphi-Quellcode:
procedure THeaderFooterForm.pb1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Single);
var
  Canvas: TCanvas;
  BitmapPos: TPointF;
begin
  //BitmapPos:= PointF(X, Y); // <-- Zeichnet nicht
  //BitmapPos:= pb1.ScreenToLocal(PointF(X, Y)); // Zeichnet aber versetzt
  BitmapPos:= pb1.LocalToScreen (PointF(X, Y)); // <-- Zeichnet nicht
// pb1.ConvertLocalPointTo(img1,TPointF.Create(X, Y));

  Canvas := img1.Bitmap.Canvas;
  Canvas.BeginScene;
  try
    Canvas.Stroke.Color := TAlphaColorRec.Green;
    Canvas.Fill.Color := TAlphaColorRec.Green;
    // Canvas.DrawEllipse(RectF(X - 10, Y - 10, X + 10, Y + 10), 1); // Zeichnet aber versetzt
    Canvas.DrawEllipse(RectF(BitmapPos.X - 10, BitmapPos.Y - 10, X + 10, BitmapPos.Y + 10), 1);
  finally
    Canvas.EndScene;
  end;
  pb1.Repaint;
end;
Das sind die Sachen die ich erfolglos ausprobiert habe.... Ev. ist nur irgendwo die Syntax falsch?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.062 Beiträge
 
Delphi 12 Athens
 
#7

AW: FMX TPaintBox

  Alt 10. Feb 2023, 03:57
LocalToScreen kann doch fast nur außerhalb des sichtbaren Bereichs malen, wenn du die Screen-Koordinaten dann für das viel kleinere Bitmap benutzt.

Warum nicht erstmal einfach und diese Koordinaten/Zahlen in ein Label schreiben?
Oder an Position 0:0 als Text ins Bitmap.
Oder mal im Debugger nachsehn, was da drin steht?

plus die Eingangswete, Zwischenschritte usw.,
gegenüber img1.Width, img1.Bitmap.Width und Height.

Delphi-Quellcode:
BitmapPos := pb1.LocalToScreen(PointF(X, Y));
BitmapPos := img1.ScreenToLocal(BitmapPos);
?
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
ScharfeMietze

Registriert seit: 5. Mär 2014
165 Beiträge
 
Delphi 10.2 Tokyo Architect
 
#8

AW: FMX TPaintBox

  Alt 10. Feb 2023, 11:55
LocalToScreen kann doch fast nur außerhalb des sichtbaren Bereichs malen, wenn du die Screen-Koordinaten dann für das viel kleinere Bitmap benutzt.

Warum nicht erstmal einfach und diese Koordinaten/Zahlen in ein Label schreiben?
Oder an Position 0:0 als Text ins Bitmap.
Oder mal im Debugger nachsehn, was da drin steht?

plus die Eingangswete, Zwischenschritte usw.,
gegenüber img1.Width, img1.Bitmap.Width und Height.

Delphi-Quellcode:
BitmapPos := pb1.LocalToScreen(PointF(X, Y));
BitmapPos := img1.ScreenToLocal(BitmapPos);
?
Nach Stunden des probierens habe ich nur rausgefunden das wenn ich oben Links genau ins eck klicke
mit dieser Zeile
Canvas.DrawEllipse(RectF(X - 10, Y - 10, X + 10, Y + 10), 1); ohne Bitmap pos: setzt er den "1/4" Kreis genau. Je weiter ich oben links weg gehe desto weiter (exponentiell) entfernt sich der Kreis.
Ich habe das Image auch in die "Hauptform" gezogen um
Multiview und TLayout als Fehlerquelle auszuschließen.
Das ist wirklich zum verzweifeln. Ich hoffe Ihr habt noch Ideen..
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: FMX TPaintBox

  Alt 10. Feb 2023, 12:12
Kannst Du Dein Projekt teilen um selbst herum-zu-experimentieren?
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Antwort Antwort


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 09:08 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