Firemonkey使用stylebook隐藏圆角溢出

时间:2017-02-20 13:24:02

标签: delphi firemonkey

在firemonkey中,我正在尝试使用带圆角的矩形制作进度条。最简单的情况是一个矩形(进度条)和其中的第二个矩形(进展到现在)。附上一个简单的例子。

带角落的进度条(绘画): Progressbar with corners (paint)

我尝试了以下方法:

  1. 让第二个矩形也有圆角。这不起作用,因为如果第二个矩形非常短或几乎在最后,这些舍入将会改变。
  2. 使用clipchildren。这与在html / css中隐藏溢出几乎相同,但Delphi在此函数中不包括圆角。
  3. 创建一个应该绘制图像的TPath。我真的很想避免这种解决方案,因为它不使用样式簿。我更喜欢为所有样式使用一个样式,而不是在样式代码的代码中使用多个位置。
  4. 有什么作用:

    • 有一个非常难看的方法来完成这项工作。我现在使用那种方法,但我真的希望你能帮助我找到另一种解决方案。丑陋的方法是: 只需使用一个矩形。用渐变画笔填充它,将两个渐变点设置在同一个地方,并使渐变本身为0度。当我要改变进度条等的状态时,这种方法的结果是很多丑陋的代码。

    这是我们可以避免的,或者这是唯一可行的解​​决方案吗?

    进度条目标(绘画): Progressbar result

    提前谢谢!

5 个答案:

答案 0 :(得分:4)

我不确定你的意思

  

使用clipchildren。这与在html / css中隐藏溢出几乎相同,但Delphi在此函数中不包括圆角。

我通过使用一个Rectangle作为边框来实现这一点;在那个进程的布局之上,其中包含另一个Rectangle。第二个Rectangle总是具有第一个的尺寸(这意味着角看起来相同),Layout ClipChildren设置为true,并且通过设置其{{{}来控制进度1}}。

以下是我实施的方式:

Width

答案 1 :(得分:1)

正是clipchildren无法工作,因为它使用了控件的边界框(所以是一个Rectf)。但你可以做什么:

1)覆盖trectangle的onpaint(非常简单)

2)使用2个Trectangles(称为橙色和白色),在您设置为不绘制左侧(通过Trectangle的Sides属性)的第一个tRectangle(橙色)和您设置为的第二个Trectangle(白色)上不画右侧(也可以通过侧面属性)。将这2个Trectangles放入Tlayout(或任何其他您想要的容器)中,将第二个Trectangle(白色)的对齐设置为all,将第一个Trectangle(橙色)对齐到ALleft。之后你只需要说MyOrangeRect.width:= XX其中xx你的进度相对于容器的进度当然

答案 2 :(得分:1)

我喜欢只用一个TRectangle来填充另一个解决方案:

只需添加一个TRectangle,设置边框,角落并将填充属性设置为TBitmap。

现在,您可以在运行时创建一个颜色(宽度为进度)的TBitmap到fill.bitmap.bitmap(注意双位图)属性。

你的角落仍然受到尊重。

额外:您还可以使用在photoshop中创建的一个垂直线位图,具有漂亮的发光/颜色效果,如IOS电池进度条,并在您的TRectangle中拉伸。

答案 3 :(得分:0)

只需像这样使用形状(圆形):

progress image1

progress image2

procedure TForm4.SpinBox1Change(Sender: TObject);
begin
roundrect2.Width:=strtoint(SpinBox1.Text);
end;

如果想要进一步提高,请更改上部形状的宽度属性;

答案 4 :(得分:0)

当在内部绘制TRectangle时,它实际上会创建一个路径。

最好的解决方案是创建一个自定义组件,其中包含两个TPathData(称为 PathBackground PathFill ),这些组件已重新计算百分比变化时和调整大小时。

在Paint例程中,我会用这种方式绘制

Canvas.FillPath(PathBackground, ...);
Canvas.FillPath(PathFill, ...);
Canvas.DrawPath(PathBackground, ...);

通过绘制边缘作为最后一件事,可以避免渲染错误。