Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   TBitmap als Buffer nutzen (https://www.delphipraxis.net/182225-tbitmap-als-buffer-nutzen.html)

Gruber_Hans_12345 10. Okt 2014 10:52

TBitmap als Buffer nutzen
 
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 ....

Gruber_Hans_12345 10. Okt 2014 11:25

AW: TBitmap als Buffer nutzen
 
Hat sich erledigt - gefunden es war wo ein CreateRectRgn drinnen ... das nicht mehr freigegeben wurde ...


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:03 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