Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Panel drucken


dTrace - Mo 23.06.03 22:52
Titel: Panel drucken
Hmm... ich habe versucht den Inhalt eines Panels zu drucken...aber irgendwie klappt dass nicht so richtig... Einige sagen, man soll es über den Canvas von Tpanel tun...aber irgendwie sehe ich keine Canvas Funktion von TPanel


Delphi-Quelltext
1:
Panel1.canvas    // ?????? gibt es nicht                    


dTrace :?:


AndyB - Mo 23.06.03 22:59

Dann musst du dir die Canvas selbst erstellen.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
var Canvas: TCanvas;
begin
  Canvas := TCanvas.Create;
  try
    Canvas.Handle := GetDC(Panel1.Handle);

    // hier hast du die Canvas
    
  finally
    ReleaseDC(Panel1.Handle, Canvas.Handle);
    Canvas.Handle := 0;
    Canvas.Free;
  end;
end;


dTrace - Mo 23.06.03 23:08
Titel: panel drucken
Ok...danke :D

aber wie kann ich den Panel jetzt z.B. als BMP speichern...

ich habe folgenden Code der leider eine Fehlermeldung auslöst :(

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
procedure speichern;
var Canvas: Tcanvas;
      bmp: Tbitmap;
begin
 canvas := Tcanvas.Create;
 bmp    :=  Tbitmap.Create;
  try
   canvas.handle := Getdc(panel1.handle);
   bmp := canvas.brush.bitmap; //hier ist glaube ich der Fehler
   bmp.savetofile('c:\bild.bmp');

  finally
   ReleaseDC(panel1.handle, canvas.handle);
   canvas.handle := 0
   canvas.free;
   bmp.free;
 end;
end;

Gruss: dTrace

Moderiert von user profile iconTino: Code- durch Delphi-Tags ersetzt.


AndyB - Di 24.06.03 00:27

Zitat:
bmp := canvas.brush.bitmap;

Was willst du denn mit dem Brush-Bitmap, das sowieso nirgends gesetzt wurde und somit auf nil zeigt?

Hast du schon mal was von Canvas.CopyRect() gehört? Wenn nicht: F1.


dTrace - Di 24.06.03 16:11

I :D
Problem teilweise gelöst:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
procedure screensh;
var canvas: Tcanvas;
      rec:      Trect;
begin
 canvas := Tcanvas.Create;

 try
  canvas.handle := GetDc(panel1.handle);
  rec := Rect(panel1.width, panel1.height, 0,0);
  form1.canvas.copyrect(rec, canvas,rec);

 finally
  canvas.free;
 end;
end;

weiteres Problem: Wie kann ich ein Screenshot vom Panel erzeugen, wenn das Panel so gross ist und außerhalb des Formulars befindet...ich kann im Formular hin und her scrollen und das Panel betrachten ... aber leider wird nur ein Screenshot von der sichtbaren Fläche erstellt :?:

Gruss: dTrace


AndyB - Di 24.06.03 16:21

Dann musst du dem Benutzer eben den unschönen Effekt des "automatischen Scrollens" zeigen.


dTrace - Di 24.06.03 16:25

AndyB hat folgendes geschrieben:
Dann musst du dem Benutzer eben den unschönen Effekt des "automatischen Scrollens" zeigen.


hmm... :?

naja...dieser Lösungsweg ist nicht gerade der beste...
ich habe eine andere Idee:

1. Ich werde aus dem Bereich mehrere Screenshots erstellen indem ich die Positionen angebe
2. danach wird das zerstückelte Formular zu einer Grafik zusammengefügt
3. danach speichern und drucken 8)

dTrace


AndyB - Di 24.06.03 17:08

Das meinte ich.