代码之家  ›  专栏  ›  技术社区  ›  smok1

如何打印t面板内容?

  •  3
  • smok1  · 技术社区  · 15 年前

    我有TPAND。在这个面板上有一个Timage子代,很少有其他带有控件的面板,等等。事实上,图片包含一些图表,而带有标签的其他面板是在运行时创建的,以向用户提供附加信息。
    最近有人告诉我,如果能把这个面板打印出来,并像它在纸上出现的那样把它贴在纸上,那就太好了。有什么线索,怎么做?

    2 回复  |  直到 14 年前
        1
  •  4
  •   Birger    15 年前

    我发现了一篇旧的usenet文章,它提供了一个解决方案,将面板的内容复制到一个位图中,该位图可以打印:

    procedure TFormPrintWindows.ButtonPrintPanelClick(Sender: TObject);
      var
        Bitmap       :  TBitmap;
        FromLeft     :  INTEGER;
        FromTop      :  INTEGER;
        PrintedWidth :  INTEGER;
        PrintedHeight:  INTEGER;
    begin
      Printer.BeginDoc;
      TRY
        Bitmap := TBitmap.Create;
        TRY
          Bitmap.Width  := Panel1.Width;
          Bitmap.Height := Panel1.Height;
          Bitmap.PixelFormat := pf24bit;  // avoid palettes
    
          // Copy the Panel area from the Form into a separate Bitmap
          Bitmap.Canvas.CopyRect(Rect(0,0, Bitmap.Width,Bitmap.Height),
                                 FormPrintWindows.Canvas,
                                 Rect(Panel1.Left, Panel1.Top,
                                      Panel1.Left + Panel1.Width-1,
                                      Panel1.Top  + Panel1.Height-1) );
    
          // Assumes 10% left, right and top margin
          // Assumes bitmap aspect ratio > ~0.75 for portrait mode
          PrintedWidth  := MulDiv(Printer.PageWidth, 80,100);  // 80%
          PrintedHeight := MulDiv(PrintedWidth, Bitmap.Height, Bitmap.Width);
          FromLeft      := MulDiv(Printer.PageWidth, 10,100);  // 10%
          FromTop       := MulDiv(Printer.PageHeight,10,100);  // 10%
    
          PrintBitmap(Printer.Canvas,
            Rect(FromLeft, FromTop,
                 FromLeft + PrintedWidth,
                 FromTop  + PrintedHeight),
            Bitmap);
        FINALLY
          Bitmap.Free
        END;
      FINALLY
        Printer.EndDoc
      END
    
    end;
    

    并添加

    //Source of Code: 
    //http://www.swissdelphicenter.ch/torry/showcode.php?id=744
    //Which refers to a posting to borland.public.delphi.winapi by Rodney E Geraghty, 8/8/97.
    
    procedure PrintBitmap(Canvas: TCanvas; DestRect: TRect; Bitmap: TBitmap);
    var
      BitmapHeader: pBitmapInfo;
      BitmapImage: Pointer;
      HeaderSize: DWORD;
      ImageSize: DWORD;
    begin
      GetDIBSizes(Bitmap.Handle, HeaderSize, ImageSize);
      GetMem(BitmapHeader, HeaderSize);
      GetMem(BitmapImage, ImageSize);
      try
        GetDIB(Bitmap.Handle, Bitmap.Palette, BitmapHeader^, BitmapImage^);
        StretchDIBits(Canvas.Handle,
          DestRect.Left, DestRect.Top,    // Destination Origin
          DestRect.Right - DestRect.Left, // Destination Width
          DestRect.Bottom - DestRect.Top, // Destination Height
          0, 0,                           // Source Origin
          Bitmap.Width, Bitmap.Height,    // Source Width & Height
          BitmapImage,
          TBitmapInfo(BitmapHeader^),
          DIB_RGB_COLORS,
          SRCCOPY)
      finally
        FreeMem(BitmapHeader);
        FreeMem(BitmapImage)
      end
    end {PrintBitmap};
    
        2
  •  4
  •   Robert Love    15 年前

    Birger代码示例中的printBitmap丢失,当您添加缺少的方法时,它会起作用。 好。

    //Source of Code: 
    //http://www.swissdelphicenter.ch/torry/showcode.php?id=744
    //Which refers to a posting to borland.public.delphi.winapi by Rodney E Geraghty, 8/8/97.
    
    procedure PrintBitmap(Canvas: TCanvas; DestRect: TRect; Bitmap: TBitmap);
    var
      BitmapHeader: pBitmapInfo;
      BitmapImage: Pointer;
      HeaderSize: DWORD;
      ImageSize: DWORD;
    begin
      GetDIBSizes(Bitmap.Handle, HeaderSize, ImageSize);
      GetMem(BitmapHeader, HeaderSize);
      GetMem(BitmapImage, ImageSize);
      try
        GetDIB(Bitmap.Handle, Bitmap.Palette, BitmapHeader^, BitmapImage^);
        StretchDIBits(Canvas.Handle,
          DestRect.Left, DestRect.Top,    // Destination Origin
          DestRect.Right - DestRect.Left, // Destination Width
          DestRect.Bottom - DestRect.Top, // Destination Height
          0, 0,                           // Source Origin
          Bitmap.Width, Bitmap.Height,    // Source Width & Height
          BitmapImage,
          TBitmapInfo(BitmapHeader^),
          DIB_RGB_COLORS,
          SRCCOPY)
      finally
        FreeMem(BitmapHeader);
        FreeMem(BitmapImage)
      end
    end {PrintBitmap};