Canvas 使用画布功能LineTo和Textout打印多页

Canvas 使用画布功能LineTo和Textout打印多页,canvas,printing,lazarus,Canvas,Printing,Lazarus,如何使用打印画布打印多个页面。使用lineto和textout在画布上生成输出?画布在一页上就可以很好地工作。这是在第一页使用普通打印。然后使用copyrect到打印机画布并发出新页面,但后续页面为空白。我在一个问题中看到他们在谈论一个打印页面,我在Lazarus中没有看到这样的函数或方法。这里有一些代码,我不知道它是否有用 kBracketTree: with TestTableForSpeciesData, Printer.Canvas do begin

如何使用打印画布打印多个页面。使用lineto和textout在画布上生成输出?画布在一页上就可以很好地工作。这是在第一页使用普通打印。然后使用copyrect到打印机画布并发出新页面,但后续页面为空白。我在一个问题中看到他们在谈论一个打印页面,我在Lazarus中没有看到这样的函数或方法。这里有一些代码,我不知道它是否有用

          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个错误。谢谢你对朱斯和大卫·赫弗南的支持