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;