Der Fehler ist ganz simpel, hab ich nach 2 Minuten gehabt.
In der RepaintWindow wird GetDC aufgerufen, aber der erzeugte
DC nirgends gespeichert. Im Gegenteil: In der Zeile, die zum Freigeben gedacht war, wird extra ein weiterer erzeugt und der dann freigegeben.
Dadurch kann der SPeicher auch nicht wieder freigegeben werden. Korrekt sieht das so aus:
Delphi-Quellcode:
procedure TZ9Edit.RepaintWindow;
var
DC, MyDC: hDC;
TmpBitmap, Bitmap: hBitmap;
begin
if FTransparent
then
begin
MyDC := GetDC(
Handle);
FPainting := true;
HideCaret(
Handle);
DC := CreateCompatibleDC(MyDC);
TmpBitmap := CreateCompatibleBitmap(MyDC, Succ(ClientWidth), Succ(ClientHeight));
Bitmap := SelectObject(
DC, TmpBitmap);
PaintTo(
DC, 0, 0);
BitBlt(MyDC, BorderRec[BorderStyle] + BorderWidth,
BorderRec[BorderStyle] + BorderWidth, ClientWidth, ClientHeight,
DC, 1, 1, SRCCOPY);
SelectObject(
DC, Bitmap);
DeleteDC(
DC);
ReleaseDC(
Handle, MyDC);
DeleteObject(TmpBitmap);
ShowCaret(
Handle);
FPainting := false;
end;
end;