2009-09-27 102 views
1

我会在图像画布上使用lineto函数,然后打印出来。但打印机会创建一个空白页面。我使用printer.canvas.StretchDraw,但如果图像已保存并加载,则图像打印将会成功。有人知道原因吗?(delphi)打印图像问题

+3

能告诉你涉及的代码?如果我们看到你在做什么,它会更容易帮助。 – Argalatyr 2009-09-27 19:46:57

回答

2

这是我使用:

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; 

其中DrawProc是:

type 
    TDrawProc = procedure(ACanvas : TCanvas; 
         Width, Height : longint); 

图像预览是:

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. 
+0

hi wath是Tdrawproc操作? – etoshey 2009-09-28 10:10:02

+0

例如:image.cavas.linto(100,100); // printer.beginDoc; // printer.cavas.streachdraw(Rect(0,0,200,200),image.picture.Graphic); // printer.endDoc;// *但打印机创建空白页面* – etoshey 2009-09-28 10:18:11

1

也许你忽略打印页面有事实与屏幕页面不同的分辨率。
要绘制印刷画布上的问题应该由系数相乘,像Zartog用途在他的例子:

PixPerInchX := GetDeviceCaps(bmp.Canvas.Handle, LOGPIXELSX); 
    PixPerInchY := GetDeviceCaps(bmp.Canvas.Handle, LOGPIXELSY); 
    bmp.Width := PixPerInchX * AWidth; 
    bmp.Height := PixPerInchY * AHeight; 

这里是如何打印一个简单的教程:Printing Directly from Delphi