![]() |
Canvas mit Handle auf Bitmap.Canvas
Hallo,
in meiner 2D Engine habe ich mir selbst eine Klasse von TCanvas abgeleitet:
Delphi-Quellcode:
Nun möchte ich dass alle Zeichenbefehle die auf dem Canvas ausgeführt werden auf dem Bitmap erfolgen.
TSurfaceCanvas = class(TCanvas)
private FBitmap:TBitmap; public constructor Create; end; Also habe ich einfach...
Delphi-Quellcode:
...geschrieben, was aber (wie ihr euch sicherlich denken könnt) nicht geht.
constructor TSurfaceCanvas.Create;
begin inherited Create; Handle := FBitmap.Canvas.Handle; end; Wie bringe ich das zum laufen? Es wäre klasse wenn es mit dem Bitmap gehen würde, damit erspare ich mir nämlich einigen Ärger. Danke, Igel457 |
Re: Canvas mit Handle auf Bitmap.Canvas
Hallo,
so spontan würd' ich mal fragen, setzt Du irgendwo die größe des Bitmaps? Denn das funkt: Kompo:
Delphi-Quellcode:
Ausführen:
constructor TSurfaceCanvas.Create;
begin inherited Create; FBitmap:=TBitmap.Create; FBitmap.Width:=80; FBitmap.Height:=80; Handle:=FBitmap.Canvas.Handle; end; procedure TSurfaceCanvas.Save; begin FBitmap.SaveToFile('Test.bmp'); end;
Delphi-Quellcode:
Grüßle!
procedure TForm1.FormCreate(Sender: TObject);
var sc:TSurfaceCanvas; begin sc:=TSurfaceCanvas.Create; sc.TextOut(0, 0, 'Text'); sc.Save; end; |
Re: Canvas mit Handle auf Bitmap.Canvas
Du hast recht...
Problem ist, dass ich nach einer Größenänderung das Handle neu zuweisen muss... In einer kleinen Konsolenanwendung läuft es bei mir jetzt auch. Aber irgendwo muss ich noch einen Fehler haben. Schonmal Danke! |
Re: Canvas mit Handle auf Bitmap.Canvas
Bitte.
Kannst Dich ja nochmal melden, wenns wo hackt. |
Re: Canvas mit Handle auf Bitmap.Canvas
Ich bin jetz mal einen Schritt weiter:
Es funktioniert nur (warum auch immer), wenn ich mein Canvas innerhalb einer Prozedur erstelle und damit Arbeite. Sobald ich das Canvas z.B. in "Form-Create" erstelle und in "Button1-Click" damit arbeite geht es nicht, die Ausgabe bleibt einfach weiß. Kann ich dieses Problem irgendwie umgehen, ohne jedes mal mein Canvas neu erstellen zu müssen? Woran liegt dies überhaupt? Schonmal Danke, Igel457 |
Re: Canvas mit Handle auf Bitmap.Canvas
Zitat:
|
Re: Canvas mit Handle auf Bitmap.Canvas
OK. Das hört sich logisch an. Kann ich das DC irgendwie sperren? Oder muss ich jedes mal ein neues erzeugen?
|
Re: Canvas mit Handle auf Bitmap.Canvas
Selber eins machen, dann müßts IMHO erhalten bleiben.
Aus genau den von jbg genannten Gründen hab ich mir ne eigene Bitmap Kompo gemacht, weil mir das Handle gewechsle aufn Zeiger ging. |
Re: Canvas mit Handle auf Bitmap.Canvas
Du musst ein neues erzeugen und das Bitmap-Handle dort selektieren, damit in das Bitmap gezeichnet wird
Delphi-Quellcode:
type
TSurfaceCanvas = class(TCanvas) private FBmp: TBitmap; FOldBitmapHandle: HBITMAP; FOldPaletteHandle: HPALETTE; protected procedure CreateHandle; override; public constructor Create(AWidth, AHeight: Integer); destructor Destroy; override; property Bitmap: TBitmap read FBmp; end; { TSurfaceCanvas } constructor TSurfaceCanvas.Create(AWidth, AHeight: Integer); begin Assert(AWidth * AHeight > 0); inherited Create; FBmp := TBitmap.Create; FBmp.Width := AWidth; FBmp.Height := AHeight; end; procedure TSurfaceCanvas.CreateHandle; begin Handle := CreateCompatibleDC(0); FOldBitmapHandle := SelectObject(Handle, FBmp.Handle); if not FBmp.IgnorePalette then begin FOldPaletteHandle := SelectObject(Handle, FBmp.Palette); // RealizePalette(FBmp.Palette); FALSCH RealizePalette(Handle); // RICHTIG end; end; destructor TSurfaceCanvas.Destroy; var DC: HDC; begin if Handle <> 0 then begin SelectObject(Handle, FOldBitmapHandle); if FOldPaletteHandle <> 0 then SelectObject(Handle, FOldPaletteHandle); DC := Handle; Handle := 0; DeleteDC(DC); end; FBmp.Free; inherited Destroy; end; |
Re: Canvas mit Handle auf Bitmap.Canvas
Wie wärs, wenn du gleich auf NonVCL gehst? Unter torry.net gibts ne schöne GDI+-Kapselung...
|
Re: Canvas mit Handle auf Bitmap.Canvas
@jbg
Danke für deine Lösung, ich werde mir das mal anschauen. Guten Rutsch ins neue Jahr, Igel457 |
Re: Canvas mit Handle auf Bitmap.Canvas
Da ist mir gestern Nacht doch glatt ein Tippfehler unterlaufen:
Zitat:
|
Re: Canvas mit Handle auf Bitmap.Canvas
Hab da mal ne Zwischenfrage, wozu ist das nun gut ?
Ich mein, ich würde die Ausgaben gleichch auf ein Bitmap machen etc. |
Re: Canvas mit Handle auf Bitmap.Canvas
Zitat:
|
Re: Canvas mit Handle auf Bitmap.Canvas
Nunja, die Idee ist schon klar aber ein BitmapCanvas ist genausogut wie ein normaler Canvas.
Schlieslich ist TBitmap davon abgeleited. Was ich mal gemacht habe ist eine Art SwapBitmap ala OpenGl bzw. DirectX. Halt eine Miniversion. Und zwar, zwei gleiche Bitmaps erstellt eins wird angezeigt und auf dem anderen gezeichnet. Ist das Zeichnen fertig werden die Bitmaps getauscht. Leider ist mir der Code durch meine eigene Schult verloren gegangen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:48 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-2025 by Thomas Breitkreuz