Einzelnen Beitrag anzeigen

Gruber_Hans_12345

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

TBitmap als Buffer nutzen

  Alt 10. Okt 2014, 10: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