AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TBitmap als Buffer nutzen

Ein Thema von Gruber_Hans_12345 · begonnen am 10. Okt 2014 · letzter Beitrag vom 10. Okt 2014
Antwort Antwort
Gruber_Hans_12345

Registriert seit: 14. Aug 2004
1.439 Beiträge
 
Delphi 2007 Professional
 
#1

TBitmap als Buffer nutzen

  Alt 10. Okt 2014, 11:52
Hallo

Folgendes Problem ich verwende eine abgeleitet TPaintBox in der ich einmal ein TBitmap erzeuge und das als Buffer benutze.
Nun habe ich das Problem das jede Menge GDI Handles da drauf gehen.
Irgendwie so in der Art wie wenn jedesmal die Handles für PEN und co erzeugt werden

Delphi-Quellcode:
constructor TMyPaintBox.Create(AOwner : TComponent);
begin
    inherited;
    fBuffer := TBitmap.Create;
    fBuffer.Canvas.Lock;
    ControlStyle := ControlStyle + [csOpaque];
end;

destructor TMyPaintBox.Destroy;
begin
    fBuffer.Canvas.UnLock;
    FreeAndNil(fBuffer);
    inherited;
end;

procedure TMyPaintBox.BeginPaint;
begin
    if assigned(fBuffer) then begin
        if fBuffer.Width <> ClientWidth then fBuffer.Width := ClientWidth;
        if fBuffer.Height <> ClientHeight then fBuffer.Height := ClientHeight;
    end;
end;

procedure TMyPaintBox.WMEraseBkgnd(var Message: TWmEraseBkgnd);
begin
    Message.Result := 1;
end;

procedure TMyPaintBox.Invalidate;
begin
    fChanged := TRUE;
    //DoPaint;
    inherited;
end;

procedure TMyPaintBox.DoPaint;
begin
    BeginPaint;
    if assigned(fPainter) then begin
        fPainter.ClientRect := ClientRect;
        fBuffer.Canvas.Brush.Color := clWhite;
        fBuffer.Canvas.FillRect(ClientRect);
        // hier zeichnen
    end;

    fChanged := FALSE;
end;


procedure TMyPaintBox.Paint;
begin
    if (fBuffer.Width <> ClientWidth) or (fBuffer.Height <> ClientHeight) or fChanged then
        DoPaint;
    BitBlt(Canvas.Handle, 0, 0, Width, Height, fBuffer.Canvas.Handle, 0, 0, SRCCOPY);
end;
Die Ressourcen gehen der reihe nach flöten (im Taskmanger sieht mans wies raufegehn) wenn das System in die DoPaint funktion reingeht
Das mit dem Canvas.Lock und so war nur ein Test um zu kontrollieren, ob es was mit dem FreeDviceContext des VCL zu tun hat ....
da ja alle GDI Handle am Ende der Windows Message Freigegeben werden -> und dann jedesmal der State des Canvas wieder [] ist ....
Gruss Hans

2B or not 2B, that is FF
  Mit Zitat antworten Zitat
Gruber_Hans_12345

Registriert seit: 14. Aug 2004
1.439 Beiträge
 
Delphi 2007 Professional
 
#2

AW: TBitmap als Buffer nutzen

  Alt 10. Okt 2014, 12:25
Hat sich erledigt - gefunden es war wo ein CreateRectRgn drinnen ... das nicht mehr freigegeben wurde ...
Gruss Hans

2B or not 2B, that is FF
  Mit Zitat antworten Zitat
Antwort Antwort


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 02:47 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