德尔福XE2的绘画风格(Delphi XE2 styles painting)

2019-07-28 21:25发布

我有画VCL风格的窗口元素时,错误地画弯道的麻烦。 在具有圆角风格,我得到控制的边界矩形和风格的圆形的窗口边缘之间的空间在白色背景。

上图是使用水族光板岩运行,但带有圆角的任何风格会显示此相同的问题。 我在想什么?

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;

Answer 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;

这是结果



文章来源: Delphi XE2 styles painting