Delphi XE2风格画

时间:2012-04-10 18:32:01

标签: delphi delphi-xe2 vcl-styles

在绘制VCL样式的窗口元素时,我遇到了错误绘制角落的问题。在具有圆角的样式上,我在控件的边界矩形和样式的圆角窗口之间的空白处获得了白色背景。

enter image description here

上面的图像是使用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 个答案:

答案 0 :(得分:4)

好的,我在你的问题上花了一些时间,我找到了答案。绘制圆角的关键是调用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;

这是结果

enter image description here