Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi FMX-PaintBox.Canvas: Zeichnen ausserhalb OnPaint-Ereignis (https://www.delphipraxis.net/210075-fmx-paintbox-canvas-zeichnen-ausserhalb-onpaint-ereignis.html)

DenkDirNix 25. Feb 2022 16:20

FMX-PaintBox.Canvas: Zeichnen ausserhalb OnPaint-Ereignis
 
Liste der Anhänge anzeigen (Anzahl: 3)
Im anliegenden Minimal-Beispiel schreibe ich im OnPaint-Ereignis fünf Zeilen versetzt ins Canvas - okay. Wenn aber nach Click im OnMouseDown die Zeilen 0 und 4 nochmals geschrieben werden, so erscheinen sie an falscher Position. Es sieht eher aus, als würde ins Form-Canvas geschrieben, und zwar sogar außerhalb der PaintBox, nämlich im darüberliegenden Toolbar, siehe Screenshot2.

Interessanterweise hat ja das FMX-OnPaint einen Parameter "Canvas" - den gibt es in der VCL nicht.
Vermutlich liegt hier mein Verständnismangel. Andererseits ist der Parameter laut Debugger immer identisch mit TPaintBox(Sender).Canvas!

Was mache ich falsch?

Rollo62 25. Feb 2022 16:31

AW: FMX-PaintBox.Canvas: Zeichnen ausserhalb OnPaint-Ereignis
 
Ich würde nicht unbedingt versuchen den Canvas direkt zu beschreiben, und die verschachtelten FMX Controls auszutricksen.
Warum lässt Du nicht einfach immer Alles im OnPaint neu malen ?
Dann ist nur eine Routine dafür verantwortlich, und es sollte keine seltsamen Überraschungen geben.

Uwe Raabe 25. Feb 2022 16:45

AW: FMX-PaintBox.Canvas: Zeichnen ausserhalb OnPaint-Ereignis
 
Bei FMX musst du außerhalb des OnPaint-Events nach dem BeginScene noch die Matrix des Controls setzen:
Delphi-Quellcode:
procedure TForm1.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single);
begin
  var c:= TPaintBox(Sender).Canvas;
  if c.BeginScene then begin
    c.SetMatrix(TPaintBox(Sender).AbsoluteMatrix);
    PaintItem( c, 0 );
    PaintItem( c, 4 );
    c.EndScene;
  end;
end;

DenkDirNix 25. Feb 2022 16:56

AW: FMX-PaintBox.Canvas: Zeichnen ausserhalb OnPaint-Ereignis
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1502713)
Bei FMX musst du außerhalb des OnPaint-Events nach dem BeginScene noch die Matrix des Controls setzen:
Delphi-Quellcode:
    c.SetMatrix(TPaintBox(Sender).AbsoluteMatrix);

Auf eine Lösung in dieser Art hatte ich gehofft. Vielen Dank!
Kannst Du auch den Sinn des "Canvas"-Parameters in OnPaint() erklären?

Und bei der Gelegenheit noch eine FMX-Frage: Was entspricht dem ClientWidth aus der VCL?

Uwe Raabe 25. Feb 2022 17:19

AW: FMX-PaintBox.Canvas: Zeichnen ausserhalb OnPaint-Ereignis
 
Zitat:

Zitat von DenkDirNix (Beitrag 1502716)
Kannst Du auch den Sinn des "Canvas"-Parameters in OnPaint() erklären?

Der ist schon mit BeginScene und SetMatrix und ClipRect usw. sozusagen vorbehandelt.

Zitat:

Zitat von DenkDirNix (Beitrag 1502716)
Und bei der Gelegenheit noch eine FMX-Frage: Was entspricht dem ClientWidth aus der VCL?

ClientWidth gibt es nur beim Form. Bei den anderen Controls entspricht es in der Regel Width.

DenkDirNix 25. Feb 2022 18:11

AW: FMX-PaintBox.Canvas: Zeichnen ausserhalb OnPaint-Ereignis
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1502721)
Zitat:

Zitat von DenkDirNix (Beitrag 1502716)
Kannst Du auch den Sinn des "Canvas"-Parameters in OnPaint() erklären?

Der ist schon mit BeginScene und SetMatrix und ClipRect usw. sozusagen vorbehandelt.

--> und der "Canvas"-Parameter ist nicht identisch mit PaintBox.Canvas???


Zitat:

Zitat von DenkDirNix (Beitrag 1502716)
Und bei der Gelegenheit noch eine FMX-Frage: Was entspricht dem ClientWidth aus der VCL?

ClientWidth gibt es nur beim Form. Bei den anderen Controls entspricht es in der Regel Width.

--> Was mache ich bei den Ausnahmen von der Regel? Zum Beispiel hat TVertScrollBox mit StyleLookup = 'framedscrollboxstyle' einen Rahmen der den Client-Bereich verkleinert.

Uwe Raabe 25. Feb 2022 18:24

AW: FMX-PaintBox.Canvas: Zeichnen ausserhalb OnPaint-Ereignis
 
Zitat:

Zitat von DenkDirNix (Beitrag 1502727)
--> und der "Canvas"-Parameter ist nicht identisch mit PaintBox.Canvas???

Doch, zumindest aktuell, ist aber einfacher und leichter irgendwann mal zu ändern.


Zitat:

Zitat von DenkDirNix (Beitrag 1502727)
--> Was mache ich bei den Ausnahmen von der Regel? Zum Beispiel hat TVertScrollBox mit StyleLookup = 'framedscrollboxstyle' einen Rahmen der den Client-Bereich verkleinert.

Eventuell auf ClipRect ausweichen.

DenkDirNix 26. Feb 2022 17:23

AW: FMX-PaintBox.Canvas: Zeichnen ausserhalb OnPaint-Ereignis
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1502729)
Eventuell auf ClipRect ausweichen.

Falls es nochmal jemand hier sucht:
"Contentbounds" enthält das Client-Rechteck. Allerdings leider noch nicht im OnCreate() und im OnResize().
(Wie der Name eigentlich auch klar sagt wenn man VCL-gedanklich nicht noch auf was mit Client... fixiert ist.)


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:47 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