Drukowanie bitmapy

Adam Boduch

Często można mieć problemy z prawidłowym wydrukowaniem bitmapy.

Oto kod, który nadesłał czytelnik. Dzięki temu stworzona zostanie
bitmapa do której zaimportowana zostaje zawartość komponentu
"Panel". Następnie drukowana zostaje sama bitmapa.

Niestety autor nie dodał do kodu komentarzy.

unit junit;

interface

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

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Label1: TLabel;
    Button1: TButton;
    CheckBox1: TCheckBox;
    Button2: TButton;
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure PrintBitmap(Canvas:  TCanvas; DestRect:  TRect;  Bitmap: TBitmap);
var
  BitmapHeader: pBitmapInfo;
  BitmapImage: pointer;
  HeaderSize: DWord;
  ImageSize: DWord;
BEGIN
  GetDIBSizes(Bitmap.Handle, HeaderSize, ImageSize);
  GetMem(BitmapHeader, HeaderSize);
  GetMem(BitmapImage,  ImageSize);
  try
  GetDIB(Bitmap.Handle, Bitmap.Palette, BitmapHeader^, BitmapImage^);
  StretchDIBits(Canvas.Handle,
                DestRect.Left, DestRect.Top,
                DestRect.Right  - DestRect.Left,
                DestRect.Bottom - DestRect.Top,
                0, 0,
                Bitmap.Width, Bitmap.Height,
                BitmapImage,TBitmapInfo(BitmapHeader^),
                DIB_RGB_COLORS,SRCCOPY)
  finally
    FreeMem(BitmapHeader);
    FreeMem(BitmapImage)
  end;
end;


procedure TForm1.Button2Click(Sender: TObject);
var
   im : TBitMap;
   printarea : TRect;
begin
     Printer.BeginDoc;
        try
        im := TBitMap.Create;
        try
           im.PixelFormat := pf24bit; //<<===

           im.Width := panel1.Width;
           im.Height := panel1.Height;

           im.Canvas.CopyRect(Rect(0,0, im.Width,im.Height),
                                form1.Canvas,
                                Rect(Panel1.Left, Panel1.Top,
                                     Panel1.Left + Panel1.Width-1,
                                     Panel1.Top  +
Panel1.Height-1));
           printarea.Left := MulDiv(Printer.PageWidth, 10,100);
           printarea.Right := MulDiv(Printer.PageWidth, 80,100);
           printarea.Top := MulDiv(Printer.PageHeight,10,100);
           printarea.Bottom := MulDiv(printarea.Right, im.Height,
im.Width);
           PrintBitmap(Printer.Canvas, printarea, im);
        finally
           im.free;
        end;
     finally
        Printer.EndDoc;
     end;

end;

end.

2 komentarzy

A jak chce zrobić aby drukował sie nie panel tylko StringGrid to co ? Zmienić wszystkie słowa panel1 na Stringgrid1 ?

A jak zmienić rozmiar wyświetlanej bitmapy aby była drukowana na całej Stronie A4 ????