Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Grafik als screenshot (https://www.delphipraxis.net/86872-grafik-als-screenshot.html)

Hartfrid Krause 20. Feb 2007 20:24


Grafik als screenshot
 
Ich maniupuliere in einem delphi7-pogramm eine geladene bitmap-Datei farblich.
Dies möchte ich innerhalb meines Programmes ausdrucken ohne erst (extern) hardcopy zu installieren.
Der Umweg über Druck - in word datei kopieren und druckensoll nicht beschritten werden.

SirThornberry 20. Feb 2007 20:27

Re: Grafik als screenshot
 
dazu könntest du die Unit Printers einbinden und über Printer.Canvas dann drucken. Ein gutes Tutorial gibts hier:
so kannst du zum Beispiel Text ausdrucken
Delphi-Quellcode:
Printer.BeginDoc();
Printer.Canvas.TextOut(10, 10, 'MeinText');
Printer.EndDoc();
Über die suche findet sich da sicher auch noch einiges dazu.

[Edit]
Hast du dich eventuell im Titel vertan? Was hat ein Screenshot mit deinem Problem (das Drucken) zu tun?

Hartfrid Krause 22. Feb 2007 16:50

Re: Grafik als screenshot
 
Ich Lade zunächst eine bitmap-Datei (Umrisse der Bundesländer).
Dann färbe ich die einzelnen Bundesländer nach den stärksten politischen Fraktionen.
Jetzt möchste ich dieses neue Bild ausdrucken, erhalte über print aber nur die originäre bitmap-Datei, nicht die farblich überschriebene (mit floodfil).
Dein Hinweis löstz so das Problem nicht.[delphi]

marabu 22. Feb 2007 16:58

Re: Grafik als screenshot
 
Herzlich willkommen in der Delphi-PRAXiS, Hartfrid.

Vielleicht bringt dich dieser Code auf die richtige Spur: klick

Freundliche Grüße

Hartfrid Krause 25. Feb 2007 16:33

Re: Grafik als screenshot
 
So klappt das noch nicht.
Hier mehr - neben eoiner bitmap der Umrisse der Bundesländer, die durch die Prozedure unterschiedlich farblich markiert werden. Der Ausdruck sollte mit den farblichen Flächenfüllungen - also bunt - erfolgen.
Delphi-Quellcode:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    PaintBox1: TPaintBox;
    Button1: TButton;
    Button2: TButton;
    procedure form1show(sender:TObject);
     procedure PaintBox1Paint(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure einfaerben(sender:TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
   Bitmap1: TBitmap;
    Form1: TForm1;

implementation

{$R *.dfm}
procedure tform1.form1show(sender:TObject);
begin
 form1.Height:=19*screen.Height div 20;
 form1.Left:=(screen.Width-form1.Width) DIV 2;
 form1.Top:=(screen.Height-form1.Height) div 2;
 button1.top:=form1.Top+form1.Height-4*button1.height;
 button2.Top:=button1.Top;
 button2.left:=button1.Left+21*button1.width div 20;
 paintbox1.Height:=645;
 paintbox1.width:=486;
 paintbox1.Left:=(form1.Width-paintbox1.Width) div 2;
 paintbox1.Top:=(form1.Height-paintbox1.Height) div 2;
 paintbox1paint(sender);
end;


procedure TForm1.PaintBox1Paint(Sender: TObject);
begin
 Bitmap1 := TBitmap.Create;
 Bitmap1.LoadFromFile('DeutschUmriss.bmp');
 PaintBox1.Canvas.Draw(0,0,Bitmap1);
 Bitmap1.Free;
 einfaerben(sender);
end;


procedure tform1.einfaerben(sender:TObject);
Var farbe:tcolor;
 x,y:integer;
begin
 with canvas do
 with paintbox1 do
 begin
 moveto(paintbox1.Left,paintbox1.Top);
 lineto(paintbox1.Left+paintbox1.Width,paintbox1.Top);
 lineto(paintbox1.Left+paintbox1.Width,paintbox1.Top+paintbox1.Height);
 lineto(paintbox1.Left,paintbox1.Top+paintbox1.Height);
   brush.color:= clred; //Berlin
   farbe:= pixels[X,Y];
   floodfill(paintbox1.Left+385,paintbox1.Top+200,farbe, fsborder);

   brush.color:= clyellow; //Hamburg
   farbe:= pixels[X,Y];
   floodfill(paintbox1.Left+220,paintbox1.Top+115,farbe, fsborder);

   brush.color:= clblack; //Bremen
   farbe:= pixels[X,Y];
   floodfill(paintbox1.Left+154,paintbox1.Top+160,farbe, fsborder);
   floodfill(paintbox1.Left+150,paintbox1.Top+124,farbe, fsborder);

   brush.color:= clgreen; //Nieders
   farbe:= pixels[X,Y];
   floodfill(paintbox1.Left+170,paintbox1.Top+150,farbe, fsborder);

   brush.color:= clmaroon; //NRW
   farbe:= pixels[X,Y];
   floodfill(paintbox1.Left+80,paintbox1.Top+260,farbe, fsborder);
 end;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
 close;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 showmessage('Aber wie???');
end;

end.
[edit=r_kerber]Delphi-Tags eingefügt. Das nächste Mal bitte selbst machen. Mfg, r_kerber[/edit]

Namenloser 25. Feb 2007 18:35

Re: Grafik als screenshot
 
was funktionert denn nicht? du weist x und y nie einen wert zu.

bitsetter 25. Feb 2007 19:41

Re: Grafik als screenshot
 
Hallo,

mit deinem Code lädst du das Bild, und zeichnest es dann auf den Canvas der Paintbox und dann färbst du einige Bereiche auf dem Canvas der Paintbox ein.
Deine Bilddatei wird dadurch jedoch nicht geändert. Hier ist ein wenig Code, wie du deine gezeichneten Bereiche in die Bilddatei speicherst.
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
   Bitmap1: TBitmap;
begin
  Bitmap1 := TBitmap.Create;
  try
    Bitmap1.LoadFromFile('DeutschUmriss.bmp');
    Bitmap1.Canvas.CopyRect(Rect(0, 0, Bitmap1.Width, Bitmap1.Height), PaintBox1.Canvas, Rect(0, 0, Bitmap1.Width, Bitmap1.Height));
    Bitmap1.SaveToFile('DeutschUmriss.bmp');//wird jetzt überschrieben!
  finally
    Bitmap1.Free;
  end;
end;
Wenn du Canvas deiner Paintbox ausdrucken möchtest, dann müsste es etwa so aussehen: (allerdings nicht getestet)
Delphi-Quellcode:
uses printers;

procedure TForm1.Button2Click(Sender: TObject);
var
   Bitmap1: TBitmap;
begin
  Bitmap1 := TBitmap.Create;
  try//oder du druckst den Bitmap1.Canvas aus(dann Code anpassen)
    Bitmap1.LoadFromFile('DeutschUmriss.bmp');//breite und höhe feststellen
    Printer.BeginDoc;                                              
    Printer.Canvas.CopyRect(Rect(0, 0, Bitmap1.Width, Bitmap1.Height), PaintBox1.Canvas, Rect(0, 0, Bitmap1.Width, Bitmap1.Height));
    Printer.EndDoc;
  finally
    Bitmap1.Free;
  end;
end;

Hartfrid Krause 26. Feb 2007 14:03

Re: Grafik als screenshot
 
danke, das klappt hervorragend.
Nun doch noch eine Frage:
Wie muss ich dies abändern, um nicht nur die bveränderte bitmap auszudrucken, sondern die gesamte Form54, die noch einige andere listbox' etc enthält??
danke für die Unterstützung
h.k.

bitsetter 26. Feb 2007 19:00

Re: Grafik als screenshot
 
Delphi-Quellcode:
uses Printers;

Procedure BildAusSchnitt(hWND: HWND; iLeft, iTop, iWidth, iHeight: integer);
var
  c: TCanvas;
begin
  BringWindowToTop(hWND);
  c:= TCanvas.Create;
  c.Handle:= GetWindowDC(hWND);
  try
    printer.begindoc;
    printer.Canvas.CopyRect(Rect(0, 0, iWidth* 10, iHeight* 10), c, Rect(iLeft, iTop, iLeft+ iWidth, iTop+ iHeight));
    printer.enddoc;
  finally
    ReleaseDC(hWND, c.handle);
    c.Free;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   BildAusSchnitt(Form54.Handle, 0, 0, Form54.Width, Form54.Height);
end;
Wie der Name der Procedur es schon vermuten lässt, kann man wenn die Parameter verändert werden, auch nur ein Bildausschnitt ausdrucken.
Theoretisch kannst du damit auch fremde Fenster ausdrucken, wenn du das Handle des Fensters kennst.

Hartfrid Krause 4. Mär 2007 13:32

Re: Grafik als screenshot
 
Wunderbar, wie das klappt.
Zu jeder Frage gibt es eine Neue:
auf dem Bildschirm erscheint nunmehr eine Grenzen-Karte
n Deutschlands(als bmp-Datei).
Jetzt möchte ich erreichen, dass die Bundesländernamen angezeigt werden, wenn man mit der Maus über die Fläche fährt.
Wenn es eine Schaltfläche wäre, ginge es ganz gut, aber die Differenzierung innerhalb der Karte macht Schwierigkeiten
Idee??
Danke für die Hilfe


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:52 Uhr.
Seite 1 von 3  1 23      

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