Стили стиля Delphi XE2

У меня возникают проблемы с неправильно окрашенными углами при рисовании оконных элементов в стиле VCL. В стилях, которые имеют закругленные углы, я получаю белый фон в пространстве между ограничивающим ограничителем элемента управления и углом округления окна стиля.

Вышеуказанное изображение было выполнено с использованием Aqua Light Slate, но любой стиль с закругленными углами покажет эту же проблему. Что мне не хватает?

type
 TSample = class(TCustomControl)
 protected
 procedure Paint; override;
 end;
{ TForm1 }
procedure TForm1.FormCreate(Sender: TObject);
var
 R: TRect;
 S: TSample;
begin
 R := ClientRect;
 InflateRect(R, -20, -20);
 S := TSample.Create(Application);
 S.Parent := Self;
 S.BoundsRect := R;
end;
{ TSample }
procedure TSample.Paint;
var
 Details: TThemedElementDetails;
begin
 Details := StyleServices.GetElementDetails(twCaptionActive);
 StyleServices.DrawParentBackground(Self.Handle, Canvas.Handle, Details, False);
 StyleServices.DrawElement(Canvas.Handle, Details, ClientRect);
end;
1 ответ

Хорошо, я провожу несколько минут в вашем вопросе, и я нашел ответ. Ключ, чтобы нарисовать округленные углы, вызывает функцию StyleServices.GetElementRegion для получения области, а затем используйте SetWindowRgn, чтобы применить область к элементу управления.

проверьте этот образец

procedure TSample.Paint;
var
 Details : TThemedElementDetails;
 Region : HRgn;
 LRect : TRect;
begin
 Details := StyleServices.GetElementDetails(twCaptionActive);
 LRect := Rect(0, 0, Width, Height);
 StyleServices.GetElementRegion(Details, LRect, Region);
 SetWindowRgn(Handle, Region, True);
 StyleServices.DrawParentBackground(Self.Handle, Canvas.Handle, Details, False);
 StyleServices.DrawElement(Canvas.Handle, Details, ClientRect);
end;

И это результат

licensed under cc by-sa 3.0 with attribution.