Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi BitBlt-Komponente (https://www.delphipraxis.net/97035-bitblt-komponente.html)

Bomberbb 3. Aug 2007 10:34


BitBlt-Komponente
 
Hallo, ich mochte eine neue Komponente erstellen, sie BitBlt von haus aus unterstützt.

Ich habe die Komponente nun von TCustomPanel abgeleitet und habe mir nun gedacht, ich könnte einen neuen Canvas erstellen, dan ich dann als Hauptzeichenfläche der Komponente registriere und dann am Ende der Procedure paint den origianl Canvas per BitBlt auf den neuen werfe. Aber ich bekomme es nicht hin, dass ich den neuen Canvas als Hauptcanvas registriere. Hat da jemeand eine Idee oder schon mal ws ähnliches gemacht???

Gruß
Bomber

SirThornberry 3. Aug 2007 10:56

Re: BitBlt-Komponente
 
ich glaub du hast einen Denkfehler. Wenn du von TCustomPanel ableitest erstellst du mit dem instanzieren ein neues Fenster (was sich wie ein Panel zeichnet). Das Fenster hat eine Zeischenfläche und die kannst du nicht einfach austauschen.

EWeiss 3. Aug 2007 11:17

Re: BitBlt-Komponente
 
Zitat:

Zitat von SirThornberry
ich glaub du hast einen Denkfehler. Wenn du von TCustomPanel ableitest erstellst du mit dem instanzieren ein neues Fenster (was sich wie ein Panel zeichnet). Das Fenster hat eine Zeischenfläche und die kannst du nicht einfach austauschen.

Nein .. aber man kann auf ihr zeichen mit BitBlt.

gruss

SirThornberry 3. Aug 2007 11:22

Re: BitBlt-Komponente
 
Genau, BitBlt kann man auf jedem HDC (unter anderem Canvas.Handle) verwenden

Bomberbb 3. Aug 2007 11:27

Re: BitBlt-Komponente
 
Nun ich habe es momentan so:
Delphi-Quellcode:
var
  Zeichenflaeche:TCanvas;
  BitBltBitMap:BBitmap;

Procedure TPaintPanel.Paint;
Begin //----- Paint -----
  BitBltBitmap.width := Self.Width;
  BitBltBitmap.height := Self.Height;
  Zeichenflaeche := BitBltBitmap.canvas;
 
  If Assigned(fOnPaint) then
    fOnPaint(Self);

  BitBlt(Self.Canvas.Handle, 0, 0, Self.width, Self.height, BitBltBitmap.Canvas.Handle, 0, 0, SRCCOPY);
  Zeichenflaeche := Self.canvas;
End; //----- Paint -----
funktioniert so weit auch ganz gut. Finde nur das ist nicht ganz konsequent, da ich ja nun im Prog alle Aufrufe von Paintpanel1.canvas durch Paintpanel1.Zeichenflaeche ersetzen muss(und das sind einige)...

EWeiss 3. Aug 2007 12:20

Re: BitBlt-Komponente
 
Zitat:

Zitat von Bomberbb
Nun ich habe es momentan so:
Delphi-Quellcode:
var
  Zeichenflaeche:TCanvas;
  BitBltBitMap:BBitmap;

Procedure TPaintPanel.Paint;
Begin //----- Paint -----
  BitBltBitmap.width := Self.Width;
  BitBltBitmap.height := Self.Height;
  Zeichenflaeche := BitBltBitmap.canvas;
 
  If Assigned(fOnPaint) then
    fOnPaint(Self);

  BitBlt(Self.Canvas.Handle, 0, 0, Self.width, Self.height, BitBltBitmap.Canvas.Handle, 0, 0, SRCCOPY);
  Zeichenflaeche := Self.canvas;
End; //----- Paint -----
funktioniert so weit auch ganz gut. Finde nur das ist nicht ganz konsequent, da ich ja nun im Prog alle Aufrufe von Paintpanel1.canvas durch Paintpanel1.Zeichenflaeche ersetzen muss(und das sind einige)...

Ich weiss nicht was du damit bezwecken willst.
Denke aber das es sinnvoller wäre wenn du dich ganz von canvas verabschiedest.

Sinnvoll wäre es wenn du unter verwendung von BITMAPINFO , CreateDIBSection, CreateCompatibleDC
ein temporäres Bitmap erstellst und dieses auf die komponente welche über ein reales Handle verfügt( Image kannst nicht verwenden)
mit BitBlt auf die komponente zeichnest.

Was du dann nur benötigst ist ein handle und ein DC welches du an BitBlt übergibst.
Das Handle mußt du natürlich über GetDC in ein DC konvertieren.

Delphi-Quellcode:
BitBlt(SourceDC, x, y, w, h,DestDC, 0, 0, SRCCOPY)
gruss Emil

Bomberbb 3. Aug 2007 13:22

Re: BitBlt-Komponente
 
Auf den Canvas möchte ich eigendlich nich verzichten, da ich mit der neuen Klasse meine momentan im Programm befindlichen Paintboxen ersetzen will. Und da hatte ich einen riesigen Aufwand an Anpassungen...


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:15 Uhr.

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