【问题标题】:Delphi XE2 styles paintingDelphi XE2 风格绘画
【发布时间】:2012-04-10 18:32:00
【问题描述】:

在绘制 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;

【问题讨论】:

  • 顺便说一句,我也试过 ParentBackground := True,没有变化。还尝试确保删除 csOpaque。
  • 您是否尝试过调试StyleServices.DrawElement 方法以查看它是如何在画布中绘制位图的?
  • 坦率地说,我希望避免深入研究主题引擎的内部结构,但如果没有人有更好的想法,那就是我必须做的。
  • 不幸的是,这没有帮助。无论 DC 是离屏位图还是控件的画布,DrawElement 都在绘制白角。我首先用纯色填充屏幕外位图,然后在位图中调用 DrawElement,但使用的矩形不如位图宽且居中,从而证明了这一点。结果是两边都是我的纯色,中间的标题栏,仍然是白色的角。出于某种原因,DrawElement 只是没有绘制透明的角。

标签: delphi delphi-xe2 vcl-styles


【解决方案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;

这就是结果

【讨论】:

  • 这绝对有效,非常感谢您的帮助!这也适用于为标题区域使用屏幕外位图。对于其他做类似事情的人,值得指出的是整个客户端 rect 需要传递给 GetElementRegion。
猜你喜欢
  • 2013-07-15
  • 2013-10-26
  • 2012-01-07
  • 1970-01-01
  • 2012-02-07
  • 2013-05-18
  • 1970-01-01
  • 2012-03-24
相关资源
最近更新 更多