Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Wie kann ich einen Ausschnitt des Bildschirms ausdrucken, nicht Fenster, nicht Screen (https://www.delphipraxis.net/206508-wie-kann-ich-einen-ausschnitt-des-bildschirms-ausdrucken-nicht-fenster-nicht-screen.html)

Gelmo 29. Dez 2020 18:31

Wie kann ich einen Ausschnitt des Bildschirms ausdrucken, nicht Fenster, nicht Screen
 
Hallo zusammen!
Ich habe jetzt in den letzten zwei Tagen versucht und gesucht, den Inhalt eines Panels mit zahlreichen Labels auszudrucken. Ich hatte es mir einfach vorgestellt, einen beliebigen Ausschnitt des Bildschirms anhand der Punkte links-oben und rechts-unten zu erfassen und in geeigneter Form an den Drucker zu übergeben. Habe aber von Grafik keine Ahnung. Schon bei der Frage ob die Informationen in Canvas, Bitmap oder Picture gehören und wo die Informationen überhaupt stecken – Image hat Canvas, Panel aber nicht und Label ??? –
Kurz: Ohne Hilfe komme ich gar nicht weiter.
Vielleicht möchte mir hier jemand die grundlegenden Zusammenhänge beschreiben.
Jedenfalls vielen Dank,
MfG Gelmo

Der schöne Günther 29. Dez 2020 18:57

AW: Wie kann ich einen Ausschnitt des Bildschirms ausdrucken, nicht Fenster, nicht Sc
 
Liste der Anhänge anzeigen (Anzahl: 2)
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
Anhang 53492

Sage "Mache mir ein Bitmap von Panel1", kommt das hier raus:
Anhang 53491

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.

Gelmo 29. Dez 2020 19:16

AW: Wie kann ich einen Ausschnitt des Bildschirms ausdrucken, nicht Fenster, nicht Sc
 
Super!
Das wäre genau das Ergebnis, das ich gesucht habe. Ich möchte den Code mal in mein Programm einbauen. Das sollte auch funktionieren, wenn nicht die Ecken von Panel1 verwendet werden sondern von einem größeren Bereich?
Ich melde mich wieder, wenn ich den Code ausprobiert habe.
Vielen Dank!

Gelmo 30. Dez 2020 13:50

AW: Wie kann ich einen Ausschnitt des Bildschirms ausdrucken, nicht Fenster, nicht Sc
 
Hallo zusammen!
Ich habe den Code von «Der schöne Günther» in mein Programm eingebaut. Alles bestens! Das Fenster «Struktur» links oben gibt die Fehlermeldung «TPanel enthält kein Element ‚CreateBitmap‘ in Zeile xy», das Programm wird aber vollständig kompiliert. Zudem wird nach «BitmapofPanel :=Panel1. » CreateBitmap als Option eingeblendet!
Die Druckerausgabe gelingt mit StretchDraw recht einfach, sogar ohne das Bitmap vorher zu speichern.
Mein Problem ist offensichtlich gelöst. Nochmals herzlichen Dank für die schnelle und lehrreiche Hilfe!
Mfg Gelmo

TurboMagic 30. Dez 2020 14:38

AW: Wie kann ich einen Ausschnitt des Bildschirms ausdrucken, nicht Fenster, nicht Sc
 
Dass du im Strukturpanel öfters Code als fehlerhaft angezeigt bekommst ist bis 10.3 Rio nichts ungewöhnliches.

In 10.4 Sydney wurde die IDE auf Nutzung von LSP und damit dem wirklichen Compiler als Parser umgestellt.
Der ist von der Syntax her ja "gezwungenermaßen" aktuell udn dadurch gibt's in Sydney jetzt so gut wie
keine falschen Meldungen im Strukturpanel mehr. Vorher hat die IDE einen anderen Parser für dieses ErrorInshight
benutzt gehabt und der war schon länger nicht mehr aktuell bzw. musste immer manuell nachgeführt werden.
Das bekommt man vom Compiler ja nun automatisch, da dieser bei SPracherweiterungen ja selber erweitert wird... ;-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:17 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz