delphi - 为什么这些 TShape 看起来如此不同?
问题描述
它们的设计时间属性实际上是相等的:
object ShpRectangle: TShape
Left = 272
Top = 96
Width = 409
Height = 473
Brush.Style = bsClear
Pen.Color = clWhite
Pen.Mode = pmMaskPenNot
Pen.Style = psDash
end
object ShpHorizontal: TShape
Left = 221
Top = 420
Width = 500
Height = 1
Brush.Style = bsClear
Pen.Color = clWhite
Pen.Mode = pmMaskPenNot
Pen.Style = psDash
end
object ShpVertical: TShape
Left = 480
Top = 50
Width = 1
Height = 540
Brush.Style = bsClear
Pen.Color = clWhite
Pen.Mode = pmMaskPenNot
Pen.Style = psDash
end
ShpVertical.Width = 1
和ShpHorizontal.Height = 1
,这可能使它们不同于ShpRectangle
,但它们三者都不同。
我可以让这些 TShapes 看起来相似吗?
请注意,我给出它们pmMaskPenNot/pmDash
是因为它们用作覆盖TImage
.
(在那种情况下,它们仍然看起来像图片中的样子)。
解决方案
在这里,我有一个表单,其中包含两个TShape
带点划线边框的矩形,一个高度为 9 px,另一个高度为 1 px,它们的宽度都具有动画效果:
正如您可能想象的那样,“线”实际上由两条线组成——一条上边界和一条下边界——它的外观取决于它们的相位差,而相位差又取决于宽度。
你真的无能为力。
无论如何,通过组合VCL控件来创建图片并不是一个好主意。(这样做创建动画更糟糕!)相反,使用 GDI、GDI+ 或 Direct2D 手动绘制图片。所有这些 API 都有非常易于使用的方法来绘制线条。使用 GDI+ 和 Direct2D,您甚至可以绘制非实心粗线。
这是一个 GDI 示例:
procedure TForm1.FormPaint(Sender: TObject);
begin
Canvas.Brush.Color := clWhite;
Canvas.FillRect(ClientRect);
Canvas.Pen.Color := clBlack;
Canvas.Pen.Style := psDashDot;
Canvas.MoveTo(10, ClientHeight div 2);
Canvas.LineTo(Round(10 + (ClientWidth - 20) * Abs(Sin(x))), ClientHeight div 2);
Canvas.Pen.Style := psDash;
Canvas.MoveTo(10, ClientHeight div 2 - 5);
Canvas.LineTo(Round(10 + (ClientWidth - 20) * Abs(Sin(x))), ClientHeight div 2 - 5);
Canvas.Pen.Style := psDot;
Canvas.MoveTo(10, ClientHeight div 2 + 5);
Canvas.LineTo(Round(10 + (ClientWidth - 20) * Abs(Sin(x))), ClientHeight div 2 + 5);
x := x + 0.01;
end;
ATTimer
每秒使表单无效 30 次左右。
推荐阅读
- google-chrome-extension - 如何调试加载资源失败:net::ERR_BLOCKED_BY_CLIENT
- android - 是否可以在没有子级的简单寻呼机适配器上使用 viewpager wrap_content
- javascript - 单击时将复选框的值添加到数组
- proxy - 致命:拉代码时无法从重定向更新 url 库
- php - Yii2 使用 curl 通过 WordPress 登录
- python - How to define format in logging.basicConfig() using python's str.format?
- reactjs - 使用 IE 中的 whatwg-fetch 在 react js 中获取 api
- python - 如何在谷歌图表中创建用户定义的图例?
- amazon-web-services - 在 EC2 实例上运行 Python DynamoDB
- java - 在 Spring Boot 应用程序中调用 Apache CXF 客户端时无法创建安全的 XMLInputFactory