Einzelnen Beitrag anzeigen

jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#2

Re: Extremes flimmern (auch mit Doublebuffered) bei PageCont

  Alt 20. Dez 2007, 18:29
In der VCL wird einfach zu viel über einen Kamm geschert. Das TTabSheet besitzt keine eigenen WM_ERASEBKGND Message-Handler. Somit wird der von TWinControl aufgerufen, der über die Funktion DrawParentBackground zu erst mal ein FillRect(clBtnFace) durchführt und dieses dann mit dem TabBody-Theme übermalt. Dieses doppelte Malen kostet nicht nur Zeit sondern präsentiert sich dem Benutzer als Flackern.

Folgendes ist eine mögliche Implementierung, wie ich sie auch in meinen QualityCentral-Report eingetragen habe.
Delphi-Quellcode:
procedure TTabSheet.WMEraseBkgnd(var Message: TWMEraseBkgnd);
var
  R: TRect;
begin
  if (PageControl.Style = tsTabs) and ThemeServices.ThemesEnabled and
     (csParentBackground in ControlStyle) then
  begin
    GetWindowRect(Handle, R);
    OffsetRect(R, -R.Left, -R.Top);
    ThemeServices.DrawElement(Message.DC, ThemeServices.GetElementDetails(ttBody), R);
    Message.Result := 1;
  end
  else
    inherited;
end;
  Mit Zitat antworten Zitat