hi I'd drawing in image canvas using lineto function ,and then printed that . but the printer creates an empty page .i used printer.canvas.StretchDraw but if the image been saved then load on, image printing would be successful. anybody knows the reason?
+2
A:
Here's what I use:
function PrintWrapper(ADrawProc : TDrawProc;
APreview: Boolean;
AWidth, AHeight : longint) : boolean;
var
bmp : Graphics.TBitmap;
PixPerInchX, PixPerInchY : longint;
begin
bmp := Graphics.TBitmap.Create;
try
if APreview then begin
PixPerInchX := GetDeviceCaps(bmp.Canvas.Handle, LOGPIXELSX);
PixPerInchY := GetDeviceCaps(bmp.Canvas.Handle, LOGPIXELSY);
bmp.Width := PixPerInchX * AWidth;
bmp.Height := PixPerInchY * AHeight;
bmp.Canvas.Brush.Color := clWhite;
bmp.Canvas.FillRect(Rect(0,0,bmp.Width,bmp.Height));
ADrawProc(bmp.Canvas,AWidth,AHeight);
result := (not APreview) or TFormImagePrintPreview.PrintNow(bmp);
if not result then
exit;
end;
Printer.Orientation := poLandscape;
Printer.BeginDoc;
try
ADrawProc(Printer.Canvas,AValues,AWidth,AHeight);
finally
Printer.EndDoc;
end;
result := true;
finally
FreeAndNil(bmp);
end;
end;
Where DrawProc is:
type
TDrawProc = procedure(ACanvas : TCanvas;
Width, Height : longint);
And the image preview is:
unit formImagePreviewDef;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
type
TformImagePrintPreview = class(TForm)
pnBottom: TPanel;
btPrint: TButton;
btCancel: TButton;
imgMain: TImage;
lbNotes: TLabel;
procedure btPrintClick(Sender: TObject);
procedure btCancelClick(Sender: TObject);
public
procedure Init(AGraphic : TGraphic; ANotes : string = '');
class function PrintNow(AGraphic : TGraphic; ANotes : string = '') : boolean;
end;
implementation
{$R *.dfm}
{ TformImagePrintPreview }
procedure TformImagePrintPreview.btCancelClick(Sender: TObject);
begin
Close;
ModalResult := mrCancel;
end;
procedure TformImagePrintPreview.btPrintClick(Sender: TObject);
begin
Close;
ModalResult := mrOk;
end;
procedure TformImagePrintPreview.Init(AGraphic: TGraphic; ANotes : string = '');
const
MAXSIZE = 600;
begin
lbNotes.caption := ANotes;
imgMain.Picture.Assign(AGraphic);
if AGraphic.Height > AGraphic.Width then begin
ClientWidth := trunc(MAXSIZE * AGraphic.Width / AGraphic.Height);
ClientHeight := MAXSIZE + pnBottom.Height;
end else begin
Width := MAXSIZE;
Height := trunc(MAXSIZE * AGraphic.Height/ AGraphic.Width)+pnBottom.Height;
end;
end;
class function TformImagePrintPreview.PrintNow(AGraphic: TGraphic; ANotes : string = ''): boolean;
var
form : TformImagePrintPreview;
begin
form := TformImagePrintPreview.Create(nil);
try
form.Init(AGraphic,ANotes);
result := form.ShowModal = mrOk;
finally
FreeAndNil(form);
end;
end;
end.
Zartog
2009-09-27 19:55:57
hi wath is Tdrawproc operation??
etoshey
2009-09-28 10:10:02
for example: image.cavas.linto(100,100);// printer.beginDoc;// printer.cavas.streachdraw(Rect(0,0,200,200),image.picture.Graphic);// printer.endDoc;// *but printer create empty page*
etoshey
2009-09-28 10:18:11
+1
A:
Perhaps you ignore the fact that the printing page has different resolution from a screen page.
The points you want to draw on the printing canvas should be multiplied by a factor, like Zartog uses in his example:
PixPerInchX := GetDeviceCaps(bmp.Canvas.Handle, LOGPIXELSX);
PixPerInchY := GetDeviceCaps(bmp.Canvas.Handle, LOGPIXELSY);
bmp.Width := PixPerInchX * AWidth;
bmp.Height := PixPerInchY * AHeight;
Here is a simple tutorial on how to print: Printing Directly from Delphi
Nick D
2009-09-27 20:13:10