AGB  ·  Datenschutz  ·  Impressum  







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

Canvas drucken

Ein Thema von Masterofdesasta · begonnen am 10. Apr 2013 · letzter Beitrag vom 10. Apr 2013
Antwort Antwort
Seite 1 von 2  1 2      
Masterofdesasta

Registriert seit: 10. Apr 2013
4 Beiträge
 
Delphi 2010 Architect
 
#1

Canvas drucken

  Alt 10. Apr 2013, 09:55
Hallo erstmal...
Mein Problem besteht darin:
Hab ein Programm geschrieben welches Graphen über Canvas zeichnen kann. Die gesamten Graphen und das Koordinatensystem befindet sich im Gebiet(0,0,800,800). Ich hab einen 'Drucken' Button... was muss ich in die procedure des Buttons hineinschreiben damit er nur das Koordinatensystem + Graphen druckt?
Miniaturansicht angehängter Grafiken
geogaybra.jpg  
  Mit Zitat antworten Zitat
Andreas L.

Registriert seit: 23. Mai 2011
Ort: Furth im Wald
308 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Canvas drucken

  Alt 10. Apr 2013, 10:01
In etwa so:

Delphi-Quellcode:
  Printer.BeginDoc;
  try
    Printer.Canvas.Assign(DeinCanvas); // evtl. musst du dein Canvas mit Draw, etc. auf das Printer-Canvas zeichnen
  finally
    Printer.EndDoc;
 end;
Siehe http://docwiki.embarcadero.com/Libra...inters.Printer
Andreas Lauß
Blog
  Mit Zitat antworten Zitat
Masterofdesasta

Registriert seit: 10. Apr 2013
4 Beiträge
 
Delphi 2010 Architect
 
#3

AW: Canvas drucken

  Alt 10. Apr 2013, 10:25
Danke erstmal für die Antwort.
Leider hab ich keine Ahnung wenn du z.B. schreibst DeinCanvas... prog noch net solang
Könntest du es mir etwas einfacher erklären?
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#4

AW: Canvas drucken

  Alt 10. Apr 2013, 10:43
Wenn Du Deine Zeichenroutine universell implementierst, kannst Du ein und diese Routine für die Ausgabe auf dem Bildschirm, dem Drucker oder auch in ein BMP,Metafile etc. verwenden.
Nur als grober Anriss, zum feinschleifen:

Delphi-Quellcode:
unit Unit3;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;

type
  TForm3 = class(TForm)
    PaintBox1: TPaintBox;
    Drucken: TButton;
    procedure PaintBox1Paint(Sender: TObject);
    procedure DruckenClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form3: TForm3;

implementation

{$R *.dfm}

uses Math, Printers;

Procedure SetCanvasZoomAndRotation(ACanvas:TCanvas;Zoom:Double;Angle:Double;CenterpointX,CenterpointY:Double);
var
    form : tagXFORM;
    Winkel:Double;

begin
      Winkel := DegToRad(Angle);
      SetGraphicsMode(ACanvas.Handle, GM_ADVANCED);
      SetMapMode(ACanvas.Handle,MM_ANISOTROPIC);
      form.eM11 := Zoom * cos( Winkel);
      form.eM12 := Zoom *Sin( Winkel) ;
      form.eM21 := Zoom * (-sin( Winkel));
      form.eM22 := Zoom * cos( Winkel) ;
      form.eDx := CenterpointX;
      form.eDy := CenterpointY;
      SetWorldTransform(ACanvas.Handle,form);
end;




Procedure DoThePaint(C:TCanvas;Width,Height:Integer);
Const
 C_PaintRaster:TRect=(Left:-100;Top:-100;Right:100;Bottom:100);// Dein Koordinatensystem
var
  x,y:Integer;
  Zoom:Double;
  i:Integer;
begin

    Zoom := Width /(C_PaintRaster.Right-C_PaintRaster.Left); // hier gegf. einen geeigneteren Algorhytums
    SetCanvasZoomAndRotation(C,Zoom ,0,-C_PaintRaster.Left * Zoom ,-C_PaintRaster.Top * Zoom);

    // irgendeine Demozeichenroutine
    c.Font.Size := Round(10 / zoom);
    c.Brush.Style := bsClear;
    for I := -100 to 100 do
        if (i mod 10)=0 then
          begin
           C.Ellipse(i-5,i-5,i+5,i+5);
           c.TextOut(i-2,i-2,IntToStr(i));
          end;

end;

procedure TForm3.DruckenClick(Sender: TObject);
begin
  Printer.Begindoc;
  DoThePaint(Printer.Canvas,Printer.PageWidth,Printer.Pageheight);
  Printer.EndDoc;
end;

procedure TForm3.PaintBox1Paint(Sender: TObject);
begin
   DoThePaint(PaintBox1.Canvas,PaintBox1.Width,PaintBox1.Height);
end;

end.
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Andreas L.

Registriert seit: 23. Mai 2011
Ort: Furth im Wald
308 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Canvas drucken

  Alt 10. Apr 2013, 10:53
Danke erstmal für die Antwort.
Leider hab ich keine Ahnung wenn du z.B. schreibst DeinCanvas... prog noch net solang
Könntest du es mir etwas einfacher erklären?
In deinem ersten Post steht das du dein Koordinatensystem auf ein Canvas zeichnest. Und dieses Canvas muss an das Printer.Canvas übergeben werden. Oder du zeichnest das Koordinatensystem direkt auf das Printer.Canvas. Damit du nicht doppelten Code für das Zeichnen schreibst, machst du dir eine Routine der du das Canvas übergeben kannst:

Delphi-Quellcode:
procedure DrawToCanvas(ACanvas: TCanvas);
begin
  ACanvas.LineTo(..);
  ...
  ...
end;

// Aufruf:

DrawToCanvas(PaintBox1.Canvas); // auf eine PaintBox zur visuellen Darstellung malen
DrawToCanvas(Printer.Canvas); // auf den Printer zum drucken malen
Also in etwa so wie Bummi es schon geschrieben hat.
Andreas Lauß
Blog
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.746 Beiträge
 
Delphi 2007 Professional
 
#6

AW: Canvas drucken

  Alt 10. Apr 2013, 10:58
Du hast doch momentan irgendwo Code, der auf den Canvas einer PaintBox o.ä. malt. Den musst in eine Prozedur a la MalDenGraphen(ACanvas: TCanvas) verpacken. Diese Prozedur kannst du dann einmal als MalDenGraphen(PaintBox.Canvas) und einmal als MalDenGraphen(Printer.Canvas) aufrufen.

Edit: Roter Kasten? Haaaaalllllllo?
Uli Gerhardt
  Mit Zitat antworten Zitat
Masterofdesasta

Registriert seit: 10. Apr 2013
4 Beiträge
 
Delphi 2010 Architect
 
#7

AW: Canvas drucken

  Alt 10. Apr 2013, 11:13
Wieder danke für die ganzen Antworten
Leider ist selbst das wirklich noch zu kompliziert (Besonders das von Bummi)
So weit bin ich leider noch nicht...

Ich glaube aber herausgelesen zu haben das canvas irgendwie ein Objekt ist o.O ...
Vieleicht hab ich mich falsch ausgedrückt(wenn ja sryyyyy). Aber ich zeichne mein Koordiantensystem einfach so:
Code:
   canvas.MoveTo(50,400);    //x-Achse
   canvas.LineTo(750,400);
   canvas.MoveTo(400,50);    //y-Achse
   canvas.LineTo(400,750);
   canvas.MoveTo(225,575);   //z-Achse
   canvas.LineTo(575,225);
Und meinen Graphen so:
Code:
if (a<>0) or (b<>0) or (c<>0) or (d<>0) then begin
                                                 canvas.Pen.Color:=rgb(random(256),random(256),random(256));
                                                 canvas.Pen.Width:=2;
                                                 x:=-7;
                                                 xl:=50;
                                                 repeat begin
                                                           y:=a*x*x*x+b*x*x+c*x+d;
                                                           canvas.MoveTo(xl,400-round(y*50));
                                                           xl:=xl+1;
                                                           x:=x+0.02;
                                                         end;
                                                 until ((400-round(y*50))<751) and ((400-round(y*50))>49);
                                                 repeat begin
                                                           y:=a*x*x*x+b*x*x+c*x+d;
                                                           if ((400-round(y*50))<751) and ((400-round(y*50))>49) then canvas.LineTo(xl,400-round(y*50))
                                                                                                                 else canvas.MoveTo(xl,400-round(y*50));
                                                           xl:=xl+1;
                                                           x:=x+0.02;
                                                         end;
                                                 until xl=751;
                                               end;
Naja... so in etwa... Ich such wirklich nur eine Möglichkeit dies zu drucken :S
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

AW: Canvas drucken

  Alt 10. Apr 2013, 11:24
Es gibt einen Bildschirm-Canvas und einen Drucker-Canvas.

Beide reagieren völlig gleich, nur dass der eine auf den Bildschirm malt und der andere auf den Drucker.

Wie kommst du denn an dein Canvas Objekt was du benutzt?
Irgendwo hast du ja stehen
Delphi-Quellcode:
  // Canvas merken
  canvas := ...
  
  canvas.MoveTo(50,400); //x-Achse
  canvas.LineTo(750,400);
  canvas.MoveTo(400,50); //y-Achse
  canvas.LineTo(400,750);
  canvas.MoveTo(225,575); //z-Achse
  canvas.LineTo(575,225);
oder
Delphi-Quellcode:
with ... do
  begin
    canvas.MoveTo(50,400); //x-Achse
    canvas.LineTo(750,400);
    canvas.MoveTo(400,50); //y-Achse
    canvas.LineTo(400,750);
    canvas.MoveTo(225,575); //z-Achse
    canvas.LineTo(575,225);
  end;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.746 Beiträge
 
Delphi 2007 Professional
 
#9

AW: Canvas drucken

  Alt 10. Apr 2013, 11:43
Wie kommst du denn an dein Canvas Objekt was du benutzt?
Irgendwo hast du ja stehen
Delphi-Quellcode:
  // Canvas merken
  canvas := ...
  
  canvas.MoveTo(50,400); //x-Achse
  canvas.LineTo(750,400);
  canvas.MoveTo(400,50); //y-Achse
  canvas.LineTo(400,750);
  canvas.MoveTo(225,575); //z-Achse
  canvas.LineTo(575,225);
oder
Delphi-Quellcode:
with ... do
  begin
    canvas.MoveTo(50,400); //x-Achse
    canvas.LineTo(750,400);
    canvas.MoveTo(400,50); //y-Achse
    canvas.LineTo(400,750);
    canvas.MoveTo(225,575); //z-Achse
    canvas.LineTo(575,225);
  end;
... oder du bist im FormPaint und benutzt den Canvas der Form selbst?
Uli Gerhardt
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#10

AW: Canvas drucken

  Alt 10. Apr 2013, 11:55
BTW

Delphi-Quellcode:
repeat
  begin
    ...
  end;
until SomeState;
ist nicht unbedingt falsch aber es reicht vollkommen
Delphi-Quellcode:
repeat
  ...
until SomeState;
Dann wäre es auch schön, wenn du die Delphi-Tags verwenden würdest
Code:
[DELPHI]
// hier Delphi-Code
[/DELPHI]
und die Formatierung ist ... "abenteuerlich"

So könnte das dann aussehen
Delphi-Quellcode:
  if ( a <> 0 ) or ( b <> 0 ) or ( c <> 0 ) or ( d <> 0 )
  then
    begin
      canvas.Pen.Color := rgb( random( 256 ), random( 256 ), random( 256 ) );
      canvas.Pen.Width := 2;
      x := - 7;
      xl := 50;

      repeat
        y := a * x * x * x + b * x * x + c * x + d;
        canvas.MoveTo( xl, 400 - round( y * 50 ) );
        xl := xl + 1;
        x := x + 0.02;
      until ( ( 400 - round( y * 50 ) ) < 751 ) and ( ( 400 - round( y * 50 ) ) > 49 );

      repeat
        y := a * x * x * x + b * x * x + c * x + d;
        if ( ( 400 - round( y * 50 ) ) < 751 ) and ( ( 400 - round( y * 50 ) ) > 49 )
        then
          canvas.LineTo( xl, 400 - round( y * 50 ) )
        else
          canvas.MoveTo( xl, 400 - round( y * 50 ) );
        xl := xl + 1;
        x := x + 0.02;
      until xl = 751;
    end;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (10. Apr 2013 um 11:58 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 18:24 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