Einzelnen Beitrag anzeigen

Medium

Registriert seit: 23. Jan 2008
3.679 Beiträge
 
Delphi 2007 Enterprise
 
#7

Re: Invalidate, Repaint, Refresh, Update, Paint... ?

  Alt 16. Sep 2009, 09:05
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... )
Miniaturansicht angehängter Grafiken
blink_883.gif  
"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)
  Mit Zitat antworten Zitat