如何打印窗口上的内容 ?(50分)

  • 主题发起人 主题发起人 icegirl914
  • 开始时间 开始时间
I

icegirl914

Unregistered / Unconfirmed
GUEST, unregistred user!
现在客户提出要求,希望能打印界面上的接线图?我试了用Form.Print但是没反应?不知道是什么原因?
 
做个程序把当前界面图像保存一下,再调用fastreport 来打印这个图像。
 
我的界面上是很多控件,不是一整张的图片,我的界面保存为一种自定义的格式,这种格式可以在fastreport上打印吗?我以前只做过报表,没有做过把图片放在fastreport的.
 
Form.Print是可以的,但是会将整个窗体都按照设计的样子全部打印出来。
当然,你可以考虑自己编写程序来进行打印,但是会比较罗嗦。
对于你的问题,我暂时还真的没有想到特别好的办法。
使用报表打印工具一般来说是不现时的,因为那些基本都是数据库报表打印的。
如果你要求个性化打印,很有可能需要自己去操作Printer,直接写Printer的Canvas
 
我用Pinter来控制打印,当我用MainFrm.ActiveMDIChild.GetFormImage取界面上的图片时,提示出错,是AccessViolation错误,为什么取这个图片会出错?
 
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;
Button1: TButton;
Button2: 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(aForm:TForm): TBitmap;
var
Ofs: Integer;
begin
Result := TBitmap.Create;
try
Result.Width := aForm.ClientWidth;
Result.Height := aForm.ClientHeight;
Result.Canvas.Brush :=aForm.Brush;
Result.Canvas.FillRect(aForm.ClientRect);
Result.Canvas.Lock;
try
if GetWindowLong(aForm.Handle, GWL_STYLE) and WS_BORDER <> 0 then
Ofs := -1 //do
n't Panel form border
else
Ofs := 0;
// There is no border
aForm.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(Form1);
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(Form1);
Printer.begin
Doc;
Printer.Canvas.Draw(20,20,FormImage);
Printer.EndDoc;
end;

end.
本来Form有一个函数是用来打印上面的图形的,我记不清了,有一位朋友问如何打印Panel上的东西,我按照Delphi提供的那个函数写了一个,这个程序可以打印Form上的内容,如果保留Clipboard.Assign(FormImage);这个时候粘贴板里有Form的图形,你可以试一试
 
我想起来了是这个 function GetFormImage: TBitmap;
Returns a bitmap of the form.
Delphi syntax:
function GetFormImage: TBitmap;
C++ syntax:
Graphics::TBitmap* __fastcall GetFormImage(void);
Description
Use the GetFormImage method to obtain a bitmap of the form.
Delphi带的例子
procedure TForm1.Button1Click(Sender: TObject);
var
FormImage: TBitmap;
begin
FormImage := GetFormImage;
try
Clipboard.Assign(FormImage);
Image1.Picture.Assign(Clipboard);
finally
FormImage.Free;
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Shape1.Shape := stEllipse;
Shape1.Brush.Color := clLime;
Image1.Stretch := True;
end;
 
谢谢kerbcurb,我试了,但是窗口不可见的那部份还是打印不出来。
我现在用了一种很笨的方法,就是把界面上的控件重新在Image上画一次,但是程序执行完后Image上还是空的,语句也没有出错,我也是Image.Canvas来画的,不知道是怎么回事?
 
过程如下把桌面想要的地方COPY下来,我有时不想做报表就是这样搞掂的。
procedure CopyBackImg(BKCanvas :TCanvas;sp_w:integer;sp_h :integer ;nx:integer;ny:integer);
Var Sc:TCanvas;
begin
Sc:=TCanvas.Create;
Try
sc.Handle:=GetDC(0);
bkCanvas.CopyRect(Rect(0,0,sp_w, sp_h), Sc,Rect(nx, ny, nx+sp_w, ny+sp_h));
ReleaseDC(0, sc.handle);
Finally
Sc.Free;
end;
end;
 
检查一下关于打印机的设置,我试过,把Form的界面Copy到粘贴板里,粘贴到Word或其他什么的,如果你粘贴到Word,设置一下关于图片的打印选项,填充色不能是“无填充色”
 
现在的问题不是在这里了,我可以把窗口copy到另外一个窗口,只是Copy过去的窗口也就屏幕上可以看见的部分而已了,这样其实跟直接用Form.Print直接打印没有什么区别的。
 
问题已经解决,多谢各位。
 
接受答案了.
 
使用的方法:首先将窗体的图像画在一个临时的TBitmap上面,然后将TBitmap保存的图像输出到打印机上面即可。
 

Similar threads

后退
顶部