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.
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 ????