急, 急,打印问题,在先!(50分)

  • 主题发起人 主题发起人 qddmh
  • 开始时间 开始时间
Q

qddmh

Unregistered / Unconfirmed
GUEST, unregistred user!
我将打印机设置为A4纸,测试结果如下,是否有问题?
{
这一段是在论坛中找的, 就是获得纸张大小
function GetPixelsPerInchX: Integer;
begin
Result := GetDeviceCaps(Printer.Handle, LOGPIXELSX)
end;
function GetPixelsPerInchY: Integer;
begin
Result := GetDeviceCaps(Printer.Handle, LOGPIXELSY)
end;
function GetPageWidth: Integer;
begin
Result := Screen.PixelsPerInch*GetDeviceCaps(Printer.Handle, PHYSICALWIDTH) div GetPixelsPerInchX;
end;
function GetPageHeight: Integer;
begin
Result := Screen.PixelsPerInch*GetDeviceCaps(Printer.Handle, PHYSICALHEIGHT) div GetPixelsPerInchY;
end;
}
1,我用Showmessage(inttostr(GetPageWidth)+ '///' + inttostr(GetPageHeight));
结果为:793, 1122
2,Showmessage(inttostr(Printer.PageWidth) + '///' + inttostr(Printer.PageHeight));
结果为:4661, 6716
3,Showmessage(inttostr(GetDeviceCaps(Printer.Handle, PHYSICALWIDTH)) + '///' + inttostr(GetDeviceCaps(Printer.Handle, PHYSICALHEIGHT)));
结果为:4961, 7016
我是把纸设成A4怎会出现这些数字呢?
还有这几个不都是求得纸张大小码, 为何数值不同???
望速解答,谢谢!
 
英雄们, Come on!
 
就是帮忙看一下, 好不好
 
Printer.PageWidth
GetDeviceCaps(Printer.Handle, PHYSICALWIDTH)
两者有什么区别?
 
function GetPixelsPerInchX: Integer;//打印机精度X方向
function GetPixelsPerInchY: Integer;
//打印机精度Y方向

function GetPageWidth: Integer;//在上面的精度下,纸张的点数相当于屏幕分辩率
那样用1024X768个点来表示,并不用单位长度来表示
function GetPageHeight: Integer;
//同上;
改变一下观念就是了。想自己控制打印机,上面几个函数少不了!!
 
谢谢redsky
我想想
还有个问题劳驾你
procedure TForm1.Button4Click(Sender: TObject);
var
i: Integer;
xdpi, ydpi: Integer;
begin
xdpi := Floor(GetDeviceCaps(Printer.Handle,LOGPIXELSX)/2.54);
ydpi := Floor(GetDeviceCaps(Printer.Handle,LOGPIXELSY)/2.54);
Printer.Title := 'Printer Test';
Printer.begin
Doc;
with Printer.Canvasdo
begin
for i := 1 to 5do
begin
MoveTo(xdpi*5,ydpi*i + 5*ydpi);
LineTo(xdpi*10,ydpi*i + 5*ydpi);
MoveTo(xdpi*i + 5*xdpi,ydpi*5);
LineTo(xdpi*i + 5*xdpi,ydpi*10);
Rectangle(xdpi, ydpi, xdpi*2, ydpi*2);//这一句
end;
end;
Printer.EndDoc;
end;

在上面程序中为什么要最后加上Rectangle(xdpi, ydpi, xdpi*2, ydpi*2);这一句
显示结果才对, 否则部队???
 
因为不同的型号的打印机的打印精度不一样,同一台打印机可以用不同的精度进行打印。
所以,你要找一个参数如你上所说的:Xdpi, Ydpi(没细看可能是这样的),只有这样,
才能适合所有不同精度的打印机。看看我的程序再认真想想就知道了。
procedure TForm2.Button1Click(Sender: TObject);
var
I : Integer;
x,y:integer;
PointsX,PointsY:integer;//打印分辩率
MisX,MisY:Double;//偏移量
PostX:Integer = 0;//打印起始位置
PageW:integer = 0;//纸宽;
PageH:integer = 0;//纸长;
LineNum:integer = 0;//每行个数;
k:integer;
begin
k:=1;
Printer.begin
Doc;
PointsX:=GetDeviceCaps(Printer.Canvas.Handle,LogPixElsX);
//打印机精度
PointsY:=GetDeviceCaps(Printer.Canvas.Handle,LogPixElsY);
//打印机精度
MisX:=PointsX/180;
//我用180精度的打印做调试
MisY:=PointsY/180;
Printer.Canvas.Font.Name:='宋体';
Printer.Canvas.Font.Size:=16;
Printer.Canvas.Font.Height:=trunc(40*MisY);
//取字体高度
PageW:=printer.PageWidth;
//打印机纸宽
PageH:=Printer.PageHeight;
//纸长
LineNum:=trunc(PageW/(180*Misx);
//计算每行能打几个表格中的数字
//每个数字在180度精度下长度为180
// (注表格中数字为4位数字)
PostX:=(PageW-trunc(180*Misx*(LineNum-1)) div 2;
//计算打印起始位置,使之自动居中
X:=PostX;
Y:=160*trunc(int(MisY);
……
Printer.Canvas.TextOut(X,Y, Grid1.cells[1,i]);
……
Printer.EndDoc;
end;

 
结贴,谢谢!
 
后退
顶部