You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Delphi中如何使用*字符在画布上绘制自定义线条

Delphi 绘制由*字符构成的自定义线条实现方案

Windows GDI默认的线型仅支持内置的实线、短划线、点线样式,无法直接生成字符组成的线条,需要通过沿目标路径等距绘制*字符的方式实现,具体方法如下:

核心实现逻辑

  • 提前配置画布使用的字体,优先选择等宽字体(如Consolas、Courier New),计算单个*字符的显示宽度,作为相邻两个*的间隔距离
  • 计算目标线条的总长度,结合单个的宽度算出整条线需要绘制的总数量
  • 沿线条路径按固定间隔计算每个*的绘制坐标,逐个输出字符即可
  • 如果需要绘制折线、圆形、矩形等非直线路径,只需要把路径拆分为连续的点位序列,沿路径按固定步长取点绘制*即可适配

可直接调用的实现代码

procedure DrawAsteriskLine(Canvas: TCanvas; P1, P2: TPoint);
var
  I: Integer;
  StarCount: Integer;
  DeltaX, DeltaY: Single;
  StepRatio, TotalLen: Single;
  PosX, PosY: Single;
  StarW, StarH: Integer;
begin
  // 配置绘制*的字体样式,可按需调整字号、颜色
  Canvas.Font.Name := 'Consolas';
  Canvas.Font.Size := 10;
  Canvas.Font.Color := clBlack;

  // 获取单个*的宽高,步长与字符宽度保持一致
  StarW := Canvas.TextWidth('*');
  StarH := Canvas.TextHeight('*');
  if StarW <= 0 then Exit;

  // 计算两点间横纵差、线条总长度
  DeltaX := P2.X - P1.X;
  DeltaY := P2.Y - P1.Y;
  TotalLen := Sqrt(DeltaX * DeltaX + DeltaY * DeltaY);
  if TotalLen < 1 then Exit;

  // 计算需要绘制的*总数、每一步的坐标偏移比例
  StarCount := Trunc(TotalLen / StarW);
  StepRatio := StarW / TotalLen;

  // 沿路径逐个绘制*,纵向偏移半字高保证字符和线条中心对齐
  for I := 0 to StarCount do
  begin
    PosX := P1.X + DeltaX * I * StepRatio;
    PosY := P1.Y + DeltaY * I * StepRatio - StarH / 2;
    Canvas.TextOut(Round(PosX), Round(PosY), '*');
  end;
end;

调用示例:如果需要在Form的画布上从(10,10)到(200,200)绘制星号线,直接执行DrawAsteriskLine(Self.Canvas, Point(10,10), Point(200,200));即可。如果需要调整线条粗细,直接增大Font.Size属性即可获得更大的*,对应线条会更粗。

内容的提问来源于stack exchange,提问作者Bradley Rice

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 13:33:16