Einzelnen Beitrag anzeigen

Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.464 Beiträge
 
Delphi 12 Athens
 
#4

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

  Alt 15. Sep 2009, 12:47
procedure TMyGraphObject.RepaintOverlapping(item: TControl);

Der Hintergrund (Parent) wird nicht gezeichnet.
Steuerelemente die einen ItemIndex kleiner dem eigenen ItemIndex haben, werden überhaupt nicht gezeichnet.
Diese beiden Sachen sind schlecht, wenn das eigene Control zum Teil transparent ist.
Der rekursiven Aufruf kann dazu führen, daß Steuerelemente, mit einem ItemIndex größer als eigener ItemIndex + 1, mehrfach gezeichnet werden.
Besser ist es, ein ClipRect(TCanvas.ClipRect) zu setzen und wirklich nur die Steuerelemente zu zeichnen, die das ClipRect überschneiden. Damit entfällt die Rekursion.
Delphi-Quellcode:
procedure TMyGraphObject.RepaintOverlapping(AItem: TControl);
var
  Dummy: TRect;
  MyRgn: HRGN;
  Control: TControl;
  i: Integer;
begin
  with AItem.Boundsrect do
    MyRgn := CreateRectRgn(Left, Top, Right, Bottom);

  try
    SelectClipRgn(AItem.Parent.Canvas.Handle, MyRgn);
    {hier Parent-Hintergrund zeichnen}

    for i := 0 to AItem.Parent.ControlCount-1 do
    begin
      Control := AItem.Parent.Controls[i];
      if (Control is TGraphicControl) and Control.Visible and
         IntersectRect(Dummy, AItem.Boundsrect, Control.Boundsrect) then
      begin
        TMyGraphObject(Control).Paint;
      end;
    end;
  finally
    SelectClipRgn(AItem.Parent.Canvas.Handle, HRGN(nil));
    DeleteObject(MyRgn);
  end;
end;
200-400 Timer ?
Mal so richtig bei den Resourcen aus dem Vollen schöpfen...

Erstell dir besser eine zusätzliche Klasse mit einem Timer(im Prinzip ein Singleton) und realisiere ein Observer-Model.
Jede registrierte Komponente kann als Observer innerhalb des Events InvalidateRect aufrufen.
Dadurch sollte das Formular bei jedem Event nur einmal neu gezeichnet werden.
  Mit Zitat antworten Zitat