在下正在作一个打印程序,我无从着手。有一设想:
BitBtn1: TBitBtn;
Label1: TLabel;
Image1: TImage;
Button1: TButton;
......
private
procedure poOutText(var X3, Y3, iCount: integer; ImageWrite: TBitmap; pricecount: real);
...............
Image1.Canvas.Draw(0, 0, ImageWrite); //调用函数画表头
............
with ImageWrite.Canvas do
begin
for i := 0 to 7 do
begin
........
反正我这表就是表在Image1里面,然后就要打印image1里面的内容。用A4纸。现在我无从着手。要怎么开始设计,因为我没有测试条件,一切很茫然,各位高手经历知道的了,我这种感觉很烦。请各位帮助我了,最好加我的QQ:52258388
我愿意再给100分,只好带着我走过打印这道坎!!!!!!!
BitBtn1: TBitBtn;
Label1: TLabel;
Image1: TImage;
Button1: TButton;
......
private
procedure poOutText(var X3, Y3, iCount: integer; ImageWrite: TBitmap; pricecount: real);
...............
Image1.Canvas.Draw(0, 0, ImageWrite); //调用函数画表头
............
with ImageWrite.Canvas do
begin
for i := 0 to 7 do
begin
........
反正我这表就是表在Image1里面,然后就要打印image1里面的内容。用A4纸。现在我无从着手。要怎么开始设计,因为我没有测试条件,一切很茫然,各位高手经历知道的了,我这种感觉很烦。请各位帮助我了,最好加我的QQ:52258388
我愿意再给100分,只好带着我走过打印这道坎!!!!!!!
另问:我用Canvas的MOVE TO呀什么的,自己画的表格,算不算报表?哪玩意我画完了。请大虾们帮忙咯!!!!!!!!
QQ:52258388。
查出數據用TEXT.OUT輸出數據在指定位置上也很方便,看看書很方便
A4怎么反映在Image1.cavas 上面。等等,请朋友们帮我呀!
然后根据地个分辨率,如:300*300,则像在Image里面用Canvas一样,利用prints的Canvas的画布将其画出来,然后beginDoc,但是请问的是:具体过程能不能提醒一下?
我的QQ:52258388
E-mail: [email protected]
begin
begindoc;
Canvas.StretchDraw(Rect(0, 0, Printer.PageWidth, Printer.PageHeight),tmpImg.Graphic);
enddoc;end;
一、用GetdeviceCaps得到X、Y的像素值以后。再用TRect来画,Cavas里面作的画是不是原样输出?
二、纸张的大小设置问题。如:A4、横向打印。得到打印的分辨率以后,怎么做才能打出A4的大小?(有没有源码呀!!哥哥些!!)
算法如下:先取得打印机(分母)和屏幕的分辨率(分子)的比值,然后用此比值乘以打印机的PageWidth和PageHeight就得到了屏幕分辨率下的当前打印纸张大小。如果不设置元文件的大小,那么你在StretchDraw的时候可能会得不到正确的结果。
能给我一个大概的源程序吗?
或者metafile_dpix := GetDeviceCaps(Form.Canvas.Handle, LOGPIXELSX);
//因为一般说来元文件是以屏幕分辨率创建的,所以你也可以直接从屏幕获取数据printer_dpix := GetDeviceCaps(Printer.Handle, LOGPIXELSX);
metafile.width := (Printer.PageWidth * metafile_dpix) / printer_dpix;
metafile_dpix, metafile_dpiy, printer_dpix, printer_dpiy;
mf : TMetafile;
mc : TMetafileCanvas;
w, h : Integer;
begin
metafile_dpix := GetDeviceCaps(Form.Canvas.Handle, LOGPIXELSX);
printer_dpix := GetDeviceCaps(Printer.Handle, LOGPIXELSX);
metafile_dpiy := GetDeviceCaps(Form.Canvas.Handle, LOGPIXELSY);
printer_dpiy := GetDeviceCaps(Printer.Handle, LOGPIXELSY); mf := TMetafile.Create;
try
mf.Width := (Printer.PageWidth * metafile_dpix) / printer_dpix;
mf.Height := (Printer.PageHeight * metafile_dpiy) / printer_dpiy;
mc := TMetafileCanvas.Create(mf, 0);
try
w := Round(10{厘米} * metafile_dpix / 2.54{英寸/厘米});
h := Round(15{厘米} * metafile_dpiy / 2.54{英寸/厘米});
mc.MoveTo(0, 0);
mc.LineTo(0, h);
mc.LineTo(w, h);
mc.LineTo(w, 0);
mc.LineTo(0, 0);
finally
mc.Free;
end; Printer.BeginDoc;
Printer.NewPage;
Printer.StretchDraw(Rect(0, 0, Printer.PageWidth, Printer.PageHeight), mf)
Printer.EndDoc; finally
mf.Free;
end;
end;上面的代码画出一个宽10厘米,高15厘米的矩形。同样的功能也可以用Rectangle来画。使用元文件并不是必要的,但是能给你带来莫大的好处。你可以在没有打印机的情况下调试你的程序,只需要加上一段显示元文件的代码就行了。
Printer.StretchDraw(Rect(0, 0, Printer.PageWidth, Printer.PageHeight), mf)
应该是
Printer.Canvas.StretchDraw(Rect(0, 0, Printer.PageWidth, Printer.PageHeight), mf);代码没有测试过。不过应该没问题。
mf.Width := (Printer.PageWidth * metafile_dpix) / printer_dpix;
mf.Height := (Printer.PageHeight * metafile_dpiy) / printer_dpiy;
以上两行代码是不是给出了元文件的总的宽和高。也就是将纸张的实际大小与元文件metafile相联系起来。wf.width与mf.height分别是纸的实际大小。对吗?(迷茫中!!) mc := TMetafileCanvas.Create(mf, 0); //??
w := Round(10{厘米} * metafile_dpix / 2.54{英寸/厘米});
h := Round(15{厘米} * metafile_dpiy / 2.54{英寸/厘米});以上是绘制宽和高的了。2.54是代表了A4与实际大小的转换,但是你能详细讲一下他们的换算关系吗?从屏幕分辨率---打印机分辨率---到无文件----实际的绘图大小。我的天!!谢谢了。十分感谢!!!
屏幕通常为96dpi是指在屏幕上,一英寸包含了96个点。
显然打印机打出来的图像要比屏幕细腻。你要在打印机上绘制长一英寸的线段,那么坐标长度就应该是300个点。
你要在屏幕上绘制长一英寸的线段,那么坐标长度就应该是96个点。
因为默认的情况下,元文件跟屏幕分辨率相同。所以你绘制了一条长为96个点的线段后,再StretchDraw到打印机上,因为自动缩放的缘故,在打印机上也会看到长1英寸的线段。顺便说一说,因为最后是使用StretchDraw,元文件不一定要按照96dpi的分辨率来绘制。在这里只是为了方便预览方便而已。所谓的“没有打印机的情况下调试你的程序”是指你可以通过显示元文件来观察打印成果。因为元文件是矢量图形,所以可以随便缩放而不会产生点阵图片缩放时产生的锯齿效应。不过要注意的是,元文件缩小显示时有可能出现缺线(尤其是横线和竖线)的现象,不要担心,打印时是没有问题的。而且要注意,打印时最好要采用TrueType字体(如Arial, Times New Rome等),否则可能会显示不正常。
[email protected]