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

如何在Steema TeeChart中单独设置零值水平网格线的宽度与颜色?

实现Steema TeeChart零值水平网格线高亮(Delphi VCL标准版)

由于你使用的是无源码的TeeChart标准版,无法直接修改控件内部的网格线渲染逻辑,推荐通过以下两种方案实现零值水平线的高亮效果:

方案一:通过OnAfterDraw事件手动绘制高亮线

利用Chart的OnAfterDraw事件,在控件完成默认绘制后,手动在零值位置叠加一条高亮线条,这是最直接且轻量的方案。

代码示例

procedure TYourForm.Chart1AfterDraw(Sender: TObject);
var
  ZeroYPixel: Integer;
  ChartRect: TRect;
begin
  // 获取图表的绘图区域
  ChartRect := Chart1.ChartRect;
  // 计算零值对应的Y轴像素坐标
  ZeroYPixel := Chart1.Axes.Left.CalcYPosValue(0);

  // 仅当零值处于当前可见的Y轴范围内时绘制
  if (ZeroYPixel >= ChartRect.Top) and (ZeroYPixel <= ChartRect.Bottom) then
  begin
    Chart1.Canvas.SaveState;
    try
      // 设置高亮线条的样式
      Chart1.Canvas.Pen.Color := clRed;   // 自定义高亮颜色
      Chart1.Canvas.Pen.Width := 2;       // 自定义线宽
      Chart1.Canvas.Pen.Style := psSolid; // 可选:设置线条样式(如虚线psDash)
      // 绘制横跨整个绘图区域的水平线
      Chart1.Canvas.Line(ChartRect.Left, ZeroYPixel, ChartRect.Right, ZeroYPixel);
    finally
      // 恢复Canvas原始状态,避免影响后续绘制
      Chart1.Canvas.RestoreState;
    end;
  end;
end;

方案二:添加隐藏的LineSeries实现高亮线

通过添加一个专门的TLineSeries来绘制零值线,利用控件自带的Series机制自动适配轴的缩放和滚动。

初始化代码(例如在FormCreate中)

procedure TYourForm.FormCreate(Sender: TObject);
var
  ZeroLine: TLineSeries;
begin
  ZeroLine := TLineSeries.Create(Self);
  ZeroLine.ParentChart := Chart1;
  
  // 初始化线条的X范围为当前X轴的最小/最大值
  ZeroLine.AddXY(Chart1.Axes.Bottom.Minimum, 0);
  ZeroLine.AddXY(Chart1.Axes.Bottom.Maximum, 0);
  
  // 设置高亮样式
  ZeroLine.LinePen.Color := clRed;
  ZeroLine.LinePen.Width := 2;
  
  // 隐藏点标记和标签,仅保留线条
  ZeroLine.Pointer.Visible := False;
  ZeroLine.Marks.Visible := False;
  
  // 设置线条在最上层绘制,避免被其他Series遮挡
  ZeroLine.ZOrder := loTop;
end;

适配X轴范围变化的代码

当用户缩放或滚动X轴时,需要更新线条的X范围,确保线条始终横跨整个可见区域:

procedure TYourForm.Chart1AxisZoom(Sender: TChartAxis);
var
  ZeroLine: TLineSeries;
begin
  // 仅处理X轴的缩放事件
  if Sender = Chart1.Axes.Bottom then
  begin
    ZeroLine := Chart1.Series[Chart1.SeriesCount - 1] as TLineSeries;
    ZeroLine.Clear;
    ZeroLine.AddXY(Chart1.Axes.Bottom.Minimum, 0);
    ZeroLine.AddXY(Chart1.Axes.Bottom.Maximum, 0);
  end;
end;

方案对比

  • 方案一:无需额外添加Series,性能开销小,适合静态或轴范围变化不频繁的场景;但需要自行处理绘制逻辑的边界情况。
  • 方案二:利用控件原生机制,自动适配轴的动态变化,代码更易维护;但会增加一个额外的Series对象。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 16:20:11