这真的取决于你想做什么。如果您希望用户能够进行编辑,那么您可能需要编写一个继承 TextBoxBase 并正确覆盖该类中所有适当功能的类。这是不平凡的。
不过,如果你只是想显示文字,代码其实很简单:
using System.Drawing;
using System.Windows.Forms;
namespace <YourNameSpaceHere>
{
class TickLabel : Control
{
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
int x = 0;
int[] widths = _MeasureWidths(Text);
using (Pen pen = new Pen(ForeColor))
{
for (int i = 0; i < Text.Length; i++)
{
TextRenderer.DrawText(e.Graphics, Text.Substring(i, 1), Font, new Point(x, 0), ForeColor);
x += widths[i];
e.Graphics.DrawLine(pen, x, ClientSize.Height, x, ClientSize.Height - 10);
}
}
}
private int[] _MeasureWidths(string text)
{
int[] widths = new int[text.Length];
for (int i = 0; i < text.Length; i++)
{
widths[i] = TextRenderer.MeasureText(text.Substring(i, 1), Font, ClientSize, TextFormatFlags.NoPadding).Width;
}
return widths;
}
}
}
这是结果的截图:
请注意,我已将背景颜色设置为黄色,将控件停靠在 Panel 内以提供边框,并调整了 Panel 的高度,以便刻度在我想要的位置结束。没有太多额外的麻烦,您可以向控件添加自动调整大小的行为,并使其直接支持边框。此外,我为刻度使用了硬编码的高度,但如果根据字体大小和/或控件高度缩放刻度,您可能会发现它看起来更好。
我使用了默认的设计器选择字体,但固定间距字体可能看起来更好,更适合您的需求。
如果您最终选择了可编辑文本路线,那么以上内容仍应让您对基本技术有所了解。可能需要进行大量实验才能获得对您来说“恰到好处”的外观和工作方式。