Canvas 使用画布功能LineTo和Textout打印多页
如何使用打印画布打印多个页面。使用lineto和textout在画布上生成输出?画布在一页上就可以很好地工作。这是在第一页使用普通打印。然后使用copyrect到打印机画布并发出新页面,但后续页面为空白。我在一个问题中看到他们在谈论一个打印页面,我在Lazarus中没有看到这样的函数或方法。这里有一些代码,我不知道它是否有用Canvas 使用画布功能LineTo和Textout打印多页,canvas,printing,lazarus,Canvas,Printing,Lazarus,如何使用打印画布打印多个页面。使用lineto和textout在画布上生成输出?画布在一页上就可以很好地工作。这是在第一页使用普通打印。然后使用copyrect到打印机画布并发出新页面,但后续页面为空白。我在一个问题中看到他们在谈论一个打印页面,我在Lazarus中没有看到这样的函数或方法。这里有一些代码,我不知道它是否有用 kBracketTree: with TestTableForSpeciesData, Printer.Canvas do begin
kBracketTree: with TestTableForSpeciesData, Printer.Canvas do
begin
intCPLngth := Origin.ttoBracket.Height * 5;
intCPWdth := Origin.ttoBracket.Width * 5;
if imgPrintView.Canvas = nil then
imgPrintView.Canvas.Create;
imgPrintView.Height := intCPLngth; // * 6 div 5;
imgPrintView.Width := intCPWdth; // * 6 div 5;
intVPages := intCPLngth div intHeight + 1;
intHPages := intCPWdth div intWidth + 1;
DrawScale(dblScale);
DrawBracket(HomeVrtcl);
DrawBracketLabel(Species[NodeCount].VrtclPosition, Species[NodeCount].EndSegment);
DrawBracketLabel(Species[NodeCount - 1].VrtclPosition, Species[NodeCount - 1].EndSegment);
intNdLvl := 1;
while boolMoreNodeLevels(intNdLvl) do
begin
for inx := 0 to NodeCount - 2 do
if Species[inx].NodeLevel = intNdLvl then
DrawBracketLabel(Species[inx].VrtclPosition, Species[inx].EndSegment);
inc(intNdLvl);
end;
if boolBootStrap then
for inx := SpeciesCount to NodeCount do
DrawBootStrapLabel(Species[inx].VrtclPosition, BSPercent[inx - SpeciesCount], 5, 5, 55);
if (intVPages > 1) or (intHPages > 1) then
begin
if intVPages > 1 then
if intHPages = 1 then
begin
intVStart := 2;
intHStart := 1;
end
else
begin
intVStart := 1;
intHStart := 2;
end
else
begin
intVStart := 1;
intHStart := 2;
end;
for iny := intVStart to intVPages do
begin
Pen.Color := clBlack;
Brush.Style := bsSolid;
Brush.Color := clWhite;
Clear;
with rctPrnt do
begin
Left := 0;
Top := 0;
if intCPLngth > intHeight * iny then
Bottom := intHeight - 1
else
Bottom := intCPLngth - intHeight * (iny - 1) - 1;
end;
with rctSlctd do
begin
Top := intHeight * (iny - 1);
if intCPLngth > intHeight * iny then
Bottom := intHeight * iny - 1
else
Bottom := intCPLngth;
end;
for inx := intHStart to intHPages do
begin
NewPage;
with rctPrnt do
if intCPWdth > intWidth * inx then
Right := intWidth - 1
else
Right := intCPWdth - intWidth * (inx - 1) - 1;
with rctSlctd do
begin
Left := intWidth * (inx - 1);
if intCPWdth > intWidth * inx then
Right := intWidth * inx - 1
else
Right := intCPWdth - 1;
end;
Canvas.Rectangle(0, 0, intWidth - 1, intHeight - 1);
Canvas.CopyRect(rctPrnt, imgPrintView.Canvas, rctSlctd);
Canvas.Refresh;
end;
intHStart := 1;
end;
end;
在Lazarus中,Tprenter类有一个名为NewPage的方法。在Lazarus ctrl中,单击一个tpinter声明以查看源代码中可用的所有方法。生成一个MCVE,打印一个单词的文本,启动新页面,然后再次执行。我们不想费力地阅读那些代码。简化。我通过在位图上绘制四个矩形来让MCVE工作。我在矩形内放置了一个设计,如直线、正方形和三角形。然后,我可以在一个单独的页面上绘制每个矩形,在打印机的画布上使用copyrect在第一页之后生成一个新页。我改变了原来的程序,发现我创建并投射位图来设置画布的高度和宽度。我现在让它在每一页上打印一个黑色矩形。我得试着换刷子和/或钢笔。但我知道,当它创建图像时,我创建了一个新问题。续…可打印图像的大小是原始图像的5倍。如果它变得非常大,我会得到203个错误。谢谢你对朱斯和大卫·赫弗南的支持