AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Canvas mit Handle auf Bitmap.Canvas
Thema durchsuchen
Ansicht
Themen-Optionen

Canvas mit Handle auf Bitmap.Canvas

Ein Thema von igel457 · begonnen am 30. Dez 2006 · letzter Beitrag vom 31. Dez 2006
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von igel457
igel457

Registriert seit: 31. Aug 2005
1.622 Beiträge
 
FreePascal / Lazarus
 
#1

Canvas mit Handle auf Bitmap.Canvas

  Alt 30. Dez 2006, 19:41
Hallo,

in meiner 2D Engine habe ich mir selbst eine Klasse von TCanvas abgeleitet:

Delphi-Quellcode:
TSurfaceCanvas = class(TCanvas)
  private
    FBitmap:TBitmap;
  public
    constructor Create;
end;
Nun möchte ich dass alle Zeichenbefehle die auf dem Canvas ausgeführt werden auf dem Bitmap erfolgen.
Also habe ich einfach...
Delphi-Quellcode:
constructor TSurfaceCanvas.Create;
begin
  inherited Create;
  Handle := FBitmap.Canvas.Handle;
end;
...geschrieben, was aber (wie ihr euch sicherlich denken könnt) nicht geht.
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
Andreas
"Sollen sich auch alle schämen, die gedankenlos sich der Wunder der Wissenschaft und Technik bedienen, und nicht mehr davon geistig erfasst haben als die Kuh von der Botanik der Pflanzen, die sie mit Wohlbehagen frisst." - Albert Einstein
  Mit Zitat antworten Zitat
Benutzerbild von Sunlight7
Sunlight7

Registriert seit: 17. Sep 2006
Ort: Sonnensystem, Zentral
1.522 Beiträge
 
Delphi 5 Standard
 
#2

Re: Canvas mit Handle auf Bitmap.Canvas

  Alt 30. Dez 2006, 20:07
Hallo,

so spontan würd' ich mal fragen, setzt Du irgendwo die größe des Bitmaps?

Denn das funkt:

Kompo:
Delphi-Quellcode:
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;
Ausführen:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
   var sc:TSurfaceCanvas;
begin
   sc:=TSurfaceCanvas.Create;
   sc.TextOut(0, 0, 'Text');
   sc.Save;
end;
Grüßle!
Windows: Ja - Microsoft: Nein -> www.ReactOS.org
  Mit Zitat antworten Zitat
Benutzerbild von igel457
igel457

Registriert seit: 31. Aug 2005
1.622 Beiträge
 
FreePascal / Lazarus
 
#3

Re: Canvas mit Handle auf Bitmap.Canvas

  Alt 30. Dez 2006, 22:04
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!
Andreas
"Sollen sich auch alle schämen, die gedankenlos sich der Wunder der Wissenschaft und Technik bedienen, und nicht mehr davon geistig erfasst haben als die Kuh von der Botanik der Pflanzen, die sie mit Wohlbehagen frisst." - Albert Einstein
  Mit Zitat antworten Zitat
Benutzerbild von Sunlight7
Sunlight7

Registriert seit: 17. Sep 2006
Ort: Sonnensystem, Zentral
1.522 Beiträge
 
Delphi 5 Standard
 
#4

Re: Canvas mit Handle auf Bitmap.Canvas

  Alt 30. Dez 2006, 22:19
Bitte.

Kannst Dich ja nochmal melden, wenns wo hackt.
Windows: Ja - Microsoft: Nein -> www.ReactOS.org
  Mit Zitat antworten Zitat
Benutzerbild von igel457
igel457

Registriert seit: 31. Aug 2005
1.622 Beiträge
 
FreePascal / Lazarus
 
#5

Re: Canvas mit Handle auf Bitmap.Canvas

  Alt 30. Dez 2006, 22:37
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
Andreas
"Sollen sich auch alle schämen, die gedankenlos sich der Wunder der Wissenschaft und Technik bedienen, und nicht mehr davon geistig erfasst haben als die Kuh von der Botanik der Pflanzen, die sie mit Wohlbehagen frisst." - Albert Einstein
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#6

Re: Canvas mit Handle auf Bitmap.Canvas

  Alt 30. Dez 2006, 22:54
Zitat von igel457:
Woran liegt dies überhaupt?
Die VCL räumt nach jeder Window-Message alle DCs der Controls und alle Bitmap-DCs auf um GDI Resourcen zu sparen. Dem unterliegt natürlich auch dein Bitmap.
  Mit Zitat antworten Zitat
Benutzerbild von igel457
igel457

Registriert seit: 31. Aug 2005
1.622 Beiträge
 
FreePascal / Lazarus
 
#7

Re: Canvas mit Handle auf Bitmap.Canvas

  Alt 30. Dez 2006, 22:56
OK. Das hört sich logisch an. Kann ich das DC irgendwie sperren? Oder muss ich jedes mal ein neues erzeugen?
Andreas
"Sollen sich auch alle schämen, die gedankenlos sich der Wunder der Wissenschaft und Technik bedienen, und nicht mehr davon geistig erfasst haben als die Kuh von der Botanik der Pflanzen, die sie mit Wohlbehagen frisst." - Albert Einstein
  Mit Zitat antworten Zitat
Benutzerbild von Sunlight7
Sunlight7

Registriert seit: 17. Sep 2006
Ort: Sonnensystem, Zentral
1.522 Beiträge
 
Delphi 5 Standard
 
#8

Re: Canvas mit Handle auf Bitmap.Canvas

  Alt 30. Dez 2006, 23:16
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.
Windows: Ja - Microsoft: Nein -> www.ReactOS.org
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#9

Re: Canvas mit Handle auf Bitmap.Canvas

  Alt 30. Dez 2006, 23:17
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;
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#10

Re: Canvas mit Handle auf Bitmap.Canvas

  Alt 30. Dez 2006, 23:19
Wie wärs, wenn du gleich auf NonVCL gehst? Unter torry.net gibts ne schöne GDI+-Kapselung...
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:34 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