Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Canvas Bezugspunkt ändern (https://www.delphipraxis.net/88567-canvas-bezugspunkt-aendern.html)

Flo.Hoe 17. Mär 2007 10:17


Canvas Bezugspunkt ändern
 
Ist es möglich bei Zeichnungen auf der Form mit Hilfe von canvas den Bezugspunkt(0,0)zu ändern?
Das würde mir die Arbeit an meinem Zeichenprogramm erheblich erleichtern(weniger Quelltext).

inherited 17. Mär 2007 10:20

Re: Canvas Bezugspunkt ändern
 
Was meinst du mit Bezugspunkt? :gruebel:

Flocke 17. Mär 2007 10:25

Re: Canvas Bezugspunkt ändern
 
Aus dem Kopf (also ungetestet):
Delphi-Quellcode:
SetWindowOrgEx(Canvas.Handle, x, y, nil);
Weiß aber nicht mehr genau, wie du bei X und Y die Vorzeichen setzen musst.

Flo.Hoe 17. Mär 2007 10:34

Re: Canvas Bezugspunkt ändern
 
Ich meine den Punkt,nach dem sich canvas beim Zeichnen richtet.
(die linke obere Ecke)
zB beim Zeichnen eines Rechteckes
Delphi-Quellcode:
Form1.canvas.rectangle(30,30,100,100)
Ich möchte jetzt den "Bezugspunkt" auf (30,30) verlagern , sodass die folgende Schreibweise genau das selbe Rechteck darstellt.
Delphi-Quellcode:
Form1.canvas.rectangle(0,0,70,70)
@Flocke: Die Methode die du mir gegeben hast setzt den Bezugspunkt nicht auf die Form, sondern auf einen Festen Punkt auf dem "Monitor". So kommt es dazu, dass die Zeichnungen sich verschieben, wenn die Form verschoben wird.

Reinhard Kern 17. Mär 2007 11:16

Re: Canvas Bezugspunkt ändern
 
Zitat:

Zitat von Flo.Hoe
Ich meine den Punkt,nach dem sich canvas beim Zeichnen richtet.
(die linke obere Ecke)
....
@Flocke: Die Methode die du mir gegeben hast setzt den Bezugspunkt nicht auf die Form, sondern auf einen Festen Punkt auf dem "Monitor". So kommt es dazu, dass die Zeichnungen sich verschieben, wenn die Form verschoben wird.

SetViewportOrgEx ist das entsprechende Gegenstück.

Gruss Reinhard

Flo.Hoe 17. Mär 2007 11:49

Re: Canvas Bezugspunkt ändern
 
Es ist zwar das Gegenstück (die Vorzeichen sind entgegengesetzt), aber mein Problem ist noch nicht gelöst.
Alle Zeichnungen orientieren sich immer noch nicht an der Form, sondern an der Position am "Bildschirm".

herkulesamstart 17. Mär 2007 11:56

Re: Canvas Bezugspunkt ändern
 
Ist zwar nciht genau was du willst aber so gehts ja auch:

deklarier doch zwei konstanten...

Delphi-Quellcode:

CONST x=30
      y=30 

Form1.canvas.rectangle(0+x,0+y,70+x,70+y)

Flo.Hoe 17. Mär 2007 12:08

Re: Canvas Bezugspunkt ändern
 
ja so hab ich es auch schon probiert , aber auf dauer ist mir das einfach zu viel code.
Bei komplexen Algorithmen wird das ganz schön unübersichtlich.

Flocke 17. Mär 2007 14:24

Re: Canvas Bezugspunkt ändern
 
Zitat:

Zitat von Flo.Hoe
@Flocke: Die Methode die du mir gegeben hast setzt den Bezugspunkt nicht auf die Form, sondern auf einen Festen Punkt auf dem "Monitor". So kommt es dazu, dass die Zeichnungen sich verschieben, wenn die Form verschoben wird.

Dann probiere die Varianten OffsetWindowOrgEx bzw. OffsetViewportOrgEx, die verschieben den Ursprung und setzen ihn nicht komplett neu. Außerdem solltest du diese Aktion später wieder rückgängig machen, also etwa so:
Delphi-Quellcode:
var
  pt: TPoint;
begin
  OffsetWindowOrgEx(Canvas.Handle, DeltaX, DeltaY, pt);
  try
    // Zeichnen auf Canvas
  finally
    SetWindowOrgEx(Canvas.Handle, pt.X, pt.Y, nil);
  end;
end;
Nachtrag: Siehe auch unter Coordinate Space and Transformation Functions, da finden sich alle API-Funktionen, die damit zu tun haben.

Cöster 17. Mär 2007 19:01

Re: Canvas Bezugspunkt ändern
 
Sonst könntest du ja auch erst alles auf ein Offscreen-Bitmap zeichnen und das dann an die Position (30|30) auf das Canvas kopieren.

Flo.Hoe 18. Mär 2007 16:33

Re: Canvas Bezugspunkt ändern
 
Ja ich glaub auch. Das ist bestimmt sinnvoller. Dann komm ich wenigstens nicht so schnell bei mehreren Objekten durcheinander.
Aber wie ist das möglich?

Cöster 18. Mär 2007 17:03

Re: Canvas Bezugspunkt ändern
 
Zitat:

Zitat von Flo.Hoe
Aber wie ist das möglich?

Was? Wie man mit Offscreen-Bitmaps arbeitet? Die DP-Suche müsste dazu was finden.

Khabarakh 18. Mär 2007 19:32

Re: Canvas Bezugspunkt ändern
 
Zitat:

Zitat von Cöster
Sonst könntest du ja auch erst alles auf ein Offscreen-Bitmap zeichnen und das dann an die Position (30|30) auf das Canvas kopieren.

Wenn man also etwas auf einem 50x50-Image zeichnen will, soll man dafür ein 2,5-mal so großes Bitmap erstellen :shock: ?

Cöster 19. Mär 2007 14:08

Re: Canvas Bezugspunkt ändern
 
Zitat:

Zitat von Khabarakh
Zitat:

Zitat von Cöster
Sonst könntest du ja auch erst alles auf ein Offscreen-Bitmap zeichnen und das dann an die Position (30|30) auf das Canvas kopieren.

Wenn man also etwas auf einem 50x50-Image zeichnen will, soll man dafür ein 2,5-mal so großes Bitmap erstellen :shock: ?

:gruebel: Wie kommst du darauf? Dazu bräuchte man dann nur ein 20x20-Offscreen-Bitmap. Die Geschichte mit dem Offscreen-Bitmap geht aber natürlich nur, wenn man nur im ersten Quadranten zeichnet (ist doch der erste, oder? Der rein positive Bereich? Müsste ja rechts unten (statt wie im Mathe-Unterricht rechts oben) sein, weil die y-Achse ja gespiegelt ist).

Khabarakh 19. Mär 2007 16:16

Re: Canvas Bezugspunkt ändern
 
Ich merke gerade erst, dass dein Beispiel sowieso etwas verquer ist :gruebel: . Nehmen wir mal an, ich will eine Linie ((30|30);(80|80)) zeichnen, also die Diagonale des Images. Dann muss ich doch wohl ein 80x80-Bitmap erstellen und dessen Rect(30, 30, 80, 80)-Ausschnitt auf das Image ((0|0)) kopieren.

Lannes 19. Mär 2007 17:36

Re: Canvas Bezugspunkt ändern
 
Hallo,

da bietet sich doch eine Hilfsprozedur an:
Delphi-Quellcode:
procedure PosRectangle(aCanvas: TCanvas;Left,Top,Width,Height: Integer);
begin
  aCanvas.Rectangle(Left,Top,Left+Width,Top+Height);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  PosRectangle(PaintBox1.Canvas,30,30,70,70);
end;

Cöster 19. Mär 2007 20:24

Re: Canvas Bezugspunkt ändern
 
Zitat:

Zitat von Khabarakh
Ich merke gerade erst, dass dein Beispiel sowieso etwas verquer ist :gruebel: . Nehmen wir mal an, ich will eine Linie ((30|30);(80|80)) zeichnen, also die Diagonale des Images. Dann muss ich doch wohl ein 80x80-Bitmap erstellen und dessen Rect(30, 30, 80, 80)-Ausschnitt auf das Image ((0|0)) kopieren.

Nene, er will den Bezugspunkt auf (30|30) setzen, NICHT (-30|-30). D.h., wenn er 0 schreibt, soll bei 30 gezeichnet werden. Wenn er quer durch ein 50x50-Image zeichnen wollte (was er aber wahrscheinlich nicht will, weil er nur jenseits der 30en zeichnen will), müsste er schreiben wollen "MoveTo(-30,-30); LineTo(20, 20);" Das würde mit dem Offscreen-Bitmap nicht funzen (wg. negativen Werten).

soncer 10. Apr 2007 09:25

Re: Canvas Bezugspunkt ändern
 
Hi,

den Bezugspunkt kannst du ändern mit[Movewindoworg(canvas.handle, 35, 35, nil)] oder auch ohne nil.

mfg

soncer


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