通常针式打印机没有不可打印区域,而激光或喷墨打印机都有不可打印区域,即
左上部分和右下部分有一定区域不可打印
下面该函数功能是将给出的具体长度的边界值转化为打印机左上角和右下交的相应的DPI数
并且考虑了不可对应的边界问题
请试用
//其中Rect给出的是左边界,上边距,右边距,下边距,单位为0.1毫米
procedure GenerateRect(var outRect : PRect);
var
changeTopY,changeleftX,ChangeRightX,ChangeBottomY : Real;
nTotalPixelsY,nTotalm,tmpPageHeight,tmpPageWidth,nTotalPixelsX : longint;
nPerPixels100mm : longint;//每100毫米的象素数
begin
Screen.Cursor := crHourGlass;
try
Printer.begin
Doc;
//设置打印字体
With Printer.Canvasdo
begin
Font.Name:='宋体';
Font.Size:=10;
Font.Style:=[];
end;
////////////////////////////////调节边界
//设置映射方式
SetMapmode(printer.canvas.Handle,mm_Text);
nTotalPixelsY := GetDevicecaps(Printer.Canvas.handle,VERTRES);//打印机垂直象素数
nTotalPixelsX := GetDevicecaps(Printer.Canvas.handle,HORZRES);//打印机水平象素数
nTotalm := GetDevicecaps(Printer.Canvas.handle,VERTSIZE);//打印机可用长度,毫米为单位
nPerPixels100mm := Round(nTotalPixelsY*100/nTotalm);//每100毫米对应的象素数,取100主要是为了增加分辨率
tmpPageWidth := GetDevicecaps(Printer.Canvas.handle,PHYSICALWIDTH);//完全水平长度
tmpPageHeight := GetDevicecaps(Printer.Canvas.handle,PHYSICALHEIGHT);//完全竖直长度
changeTopY := GetDevicecaps(Printer.Canvas.handle,PHYSICALOFFSETY);//不可打印上边界
ChangeleftX := GetDevicecaps(Printer.Canvas.handle,PHYSICALOFFSETX);
//不可打印左边界
ChangeRightX := tmpPageWidth - nTotalPixelsX - ChangeleftX;//不可打印右边界
ChangeBottomY := tmpPageHeight - nTotalPixelsY - changeTopY;//不可打印下边界
//原RECT结构为0.1毫米结构,
//现在将其转化为左上角和右下角的DPI数
outRect^.left := Round((OutRect^.left*nPerPixels100mm/1000-ChangeLeftX));
OutRect^.Top := Round((OutRect^.Top*nPerPixels100mm/1000-ChangeTopY));
OutRect^.Right := Round((tmpPageWidth - OutRect^.Right*nPerPixels100mm/1000 - ChangeRightX));
OutRect^.Bottom := Round((tmpPageHeight-OutRect^.Bottom*nPerPixels100mm/1000 - ChangeBottomY));
//打印TCHART
Chart1.Printpartial(outRect^);
Printer.EndDoc;//打印结束
except
on Exceptiondo
// 如果出错
begin
Printer.Abort;
end;
end;
Screen.Cursor:=crDefault;
end;