将panel控件上的图文按原样打印到纸张上(100分)

  • 主题发起人 主题发起人 yifeibbs
  • 开始时间 开始时间
Y

yifeibbs

Unregistered / Unconfirmed
GUEST, unregistred user!
我在窗体上放了一个panel控件做出纸张效果。
我希望将panel控件上的东西都按原样画到一张纸上。
 
试试下面的方法
uses
Printers;
Printer.begin
Doc;
Panel1.PaintTo(Printer.Canvas.Handle,Panel1.Width,Panel1.Height);
Printer.EndDoc;
 
用 Printer(TPrinter) 对象直接输出到打印机
 
pihome:这个方法可以打出来一个很精致的小报表(2厘米见方)
我也知道是因为屏幕象素和打印机象素不一样的原因,但是怎么解决哪?
estorm:说的啥?
 
具体的我也没有做过[:)]
你可以看看 procedure TCustomForm.Print;
中的处理过程
 
用这个方法
var
bmp:TBitmap;
begin
bmp:=TBitmap.Create;
bmp.Width:=Panel1.Width;
bmp.Height:=Panel1.Height;
Panel1.PaintTo(bmp.Canvas,0,0);
StretchBlt(Printer.Canvas.Handle,x,y,w,h,bmp.Canvas.Handle,0,0,bmp.Width,bmp.Height,SRCCOPY);
bmp.Free;
end;
 
这里有一些代码,你试一试
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls ,Clipbrd, Grids, jpeg, ComCtrls,Printers;
type
TForm1 = class(TForm)
Panel1: TPanel;
Image1: TImage;
Label1: TLabel;
Image2: TImage;
Image3: TImage;
Image4: TImage;
CheckBox1: TCheckBox;
RadioButton1: TRadioButton;
StatusBar1: TStatusBar;
DisplayButton: TButton;
ExitButton: TButton;
PrintButton: TButton;
procedure DisplayButtonClick(Sender: TObject);
procedure ExitButtonClick(Sender: TObject);
procedure PrintButtonClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
implementation
{$R *.dfm}
function PanelImage(aPanel:TPanel): TBitmap;
var
Ofs: Integer;
begin
Result := TBitmap.Create;
try
Result.Width := aPanel.ClientWidth;
Result.Height := aPanel.ClientHeight;
Result.Canvas.Brush :=aPanel.Brush;
Result.Canvas.FillRect(aPanel.ClientRect);
Result.Canvas.Lock;
try
if GetWindowLong(aPanel.Handle, GWL_STYLE) and WS_BORDER <> 0 then
Ofs := -1 //do
n't Panel form border
else
Ofs := 0;
// There is no border
aPanel.PaintTo(Result.Canvas.Handle, Ofs, Ofs);
finally
Result.Canvas.Unlock;
end;
except
Result.Free;
raise;
end;
end;
procedure TForm1.DisplayButtonClick(Sender: TObject);
var
FormImage: TBitmap;
begin
FormImage := PanelImage(Panel1);
try
//Clipboard.Assign(FormImage);
Image2.Picture.Assign(FormImage);
finally
FormImage.Free;
end;

end;

procedure TForm1.ExitButtonClick(Sender: TObject);
begin
Close;
end;

procedure TForm1.PrintButtonClick(Sender: TObject);
var
FormImage: TBitmap;
begin
FormImage := PanelImage(Panel1);
Printer.begin
Doc;
Printer.Canvas.Draw(20,20,FormImage);
Printer.EndDoc;
end;

end.

 
estorm:好像什么都没有打出来;
kerbcurb:打出来也是一个小小的报表。
 
多谢各位关注。
因为屏幕象素和打印机象素的不一致,使用painto方法和draw方法打印出的报表非常小;
我实验了一下这个方法:
使用一个位图将面板上的内容复制下来,然后copyrect放大到第二个位图上,再画draw到打印纸上。
方法可行,但是内存占用太大,该方法不能使用。
另外,使用一个位图复制面板,然后copyrect到打印纸上,打印纸上什么都没有。这个很奇怪,不知道为什么。estorm朋友的代码也是放大的方法,也是什么都打不出来。
多谢各位继续关心!
 
Printer.Canvas.StretchDraw(20,20,FormImage);
 
我忘记加Printer.begin
Doc了
var
bmp:TBitmap;
begin
bmp:=TBitmap.Create;
bmp.Width:=Panel1.Width;
bmp.Height:=Panel1.Height;
Panel1.PaintTo(bmp.Canvas,0,0);
Printer.begin
Doc;
StretchBlt(Printer.Canvas.Handle,x,y,w,h,bmp.Canvas.Handle,0,0,bmp.Width,bmp.Height,SRCCOPY);
//或用kerbcurb, 的Printer.Canvas.StretchDraw
Printer.EndDoc;
bmp.Free;
end;
 
不用这个方法了,我要一点一点的画!
 
后退
顶部