Einzelnen Beitrag anzeigen

Der schöne Günther

Registriert seit: 6. Mär 2013
6.157 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Wie kann ich einen Ausschnitt des Bildschirms ausdrucken, nicht Fenster, nicht Sc

  Alt 29. Dez 2020, 19:57
Es sind im Endeffekt zwei voneinander völlig unabhängige Fragen:
  1. Wie erfasse ich einen Teil des Bildschirminhalts oder den Inhalt eines TWinControl (Form, Panel, Frame, ...)?
  2. Wie drucke ich diese Grafik aus?

Wenn ich das richtig rauslese steckst du an Punkt 1.

Der Bildschirm besteht aus Pixeln. Du kannst also praktisch nur eine Pixeltapete (Bitmap) aufnehmen, keinen glatten Text wie in einem Word-Dokument.

Das einfachste ist ein Ansatz wie "Mach mir ein Bitmap von diesem Panel". Oder Frame. Oder Form. Alles, was unter Windows praktisch ein "Fenster" (TWinControl) ist.

Also wenn ich auf meinem Button1 hier
screenshot-2020-12-29-195556.png

Sage "Mache mir ein Bitmap von Panel1", kommt das hier raus:
mybitmap.png

Ist das, was du willst? Wenn ja, hier ein Minimalbeispiel:

Delphi-Quellcode:
unit Unit1;

interface

uses
   System.SysUtils,
   System.Classes,

   Vcl.Graphics,
   Vcl.Controls,
   Vcl.Forms,
   Vcl.Dialogs,
   Vcl.StdCtrls,
   Vcl.ExtCtrls;

type
   TForm1 = class(TForm)
      Panel1: TPanel;
      Label1: TLabel;
      Label2: TLabel;
      CheckBox1: TCheckBox;
      Button1: TButton;
      procedure Button1Click(Sender: TObject);
   end;

   TWinControlHelper = class helper for TWinControl
      function CreateBitmap(): TBitmap;
   end;


var
   Form1: TForm1;

implementation uses WinApi.Windows;

{$R *.dfm}

{ TWinControlHelper }

function TWinControlHelper.CreateBitmap(): Vcl.Graphics.TBitmap;
var
   DC:    HDC;
begin
   DC := GetWindowDC(Handle);
   try
      Result := Vcl.Graphics.TBitmap.Create();
      try
         Result.SetSize(ClientWidth, ClientHeight);
         BitBlt(
            Result.Canvas.Handle,
            0, 0, Result.Width, Result.Height,
            DC, 0, 0,
            WinApi.Windows.SRCCOPY
         );
      except
         Result.Destroy(); raise;
      end;
   finally
      ReleaseDC(Handle, DC);
   end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
   bitmapOfPanel: Vcl.Graphics.TBitmap;
begin
   bitmapOfPanel := Panel1.CreateBitmap();
   try
      bitmapOfPanel.SaveToFile('c:\users\günther\Desktop\myBitmap.bmp');
   finally
      bitmapOfPanel.Destroy();
   end;
end;

end.
  Mit Zitat antworten Zitat