![]() |
FMX TPaintBox
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:
Diverse Versuche mit
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;
Delphi-Quellcode:
haben nicht den erwünschten Erfolg gebracht...
img1.ScreenToLocal(TRectF.Create(x,y);
Was muss ich tun damit der Kreis genau unter dem Finger des Users erscheint? Mit Dank vorab Mietze |
AW: FMX TPaintBox
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 |
AW: FMX TPaintBox
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
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? |
AW: FMX TPaintBox
So in etwa besser?
Delphi-Quellcode:
var
newPos: TPoint; begin newPos := ScreenToClient(Mouse.CursorPos); |
AW: FMX TPaintBox
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. |
AW: FMX TPaintBox
Zitat:
Diese screen to Client geschichten habe ich unter FMX in Android nicht...
Delphi-Quellcode:
Das sind die Sachen die ich erfolglos ausprobiert habe.... Ev. ist nur irgendwo die Syntax falsch?
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; |
AW: FMX TPaintBox
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); |
AW: FMX TPaintBox
Zitat:
mit dieser Zeile
Delphi-Quellcode:
ohne Bitmap pos: setzt er den "1/4" Kreis genau. Je weiter ich oben links weg gehe desto weiter (exponentiell) entfernt sich der Kreis.
Canvas.DrawEllipse(RectF(X - 10, Y - 10, X + 10, Y + 10), 1);
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.. |
AW: FMX TPaintBox
Kannst Du Dein Projekt teilen um selbst herum-zu-experimentieren?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:45 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