Södale, gebaut und leider ein Problem festgestellt, welches der Grund war weshalb ich das überhaupt rekursiv gemacht hatte. Ein Bild sagt mehr als 1000 Worte, siehe Anhang.
Ich musste auch noch eine Kleinigkeit anpassen, da ein TControl selbst noch keinen Canvas hat. TButton z.B. hat auch keinen, weshalb das Ganze nicht gegangen wäre, wenn der Parent kein TGraphicControl oder TCustomControl Nachfahre ist. Kommt zwar doch eher selten vor, aber es geht ja auch so (
DC selbst abholen):
Delphi-Quellcode:
var
Dummy: TRect;
MyRgn: HRGN;
Control: TControl;
i: Integer;
DC: HDC;
begin
with item.Boundsrect
do
MyRgn := CreateRectRgn(Left, Top, Right, Bottom);
DC := GetDC(item.Parent.Handle);
try
SelectClipRgn(
DC, MyRgn);
//hier Parent-Hintergrund zeichnen
for i := 0
to item.Parent.ControlCount-1
do
begin
Control := item.Parent.Controls[i];
if (Control
is TGraphicControl)
and Control.Visible
and
IntersectRect(Dummy, item.Boundsrect, Control.Boundsrect)
then
begin
TMyGraphObject(Control).Paint;
end;
end;
finally
SelectClipRgn(
DC, HRGN(
nil));
DeleteObject(MyRgn);
ReleaseDC(item.Parent.Handle,
DC);
end;
end;
Aber wie gesagt, im Anhang sichtbares Problem taucht damit leider wieder auf. Auch machte es den Eindruck etwas langsamer zu sein. (Mein PC "sirrt" seltsam wenn er unter Last ist, und das Sirren ist mit dieser Methode beim Blinken etwas lauter und länger. Nicht grad eine wissenschaftliche Messmethode, aber bisher immer zuverlässig! Mit der ganz alten Repaint-Version hat er z.B. durchgehend gesirrt...
)
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)