如何自定义Winforms文本框文本字符分开?

时间:2014-10-22 18:47:27

标签: c# winforms textbox

这里有专家指导我如何实现这种文本框样式,如下图所示。每个字符都是分开的,并且精确可见这是来自Windows应用程序的快照。所以我认为C#.Net winforms可以实现这一点。

1 个答案:

答案 0 :(得分:1)

这实际上取决于你想要做什么。如果您希望用户能够编辑,那么您可能希望编写一个继承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;
        }
    }
}

以下是结果的屏幕截图:

screenshot

请注意,我已将背景颜色设置为黄色,将控件停靠在Panel内以提供边框,并调整Panel高度的大小以便勾选结束我想要的地方。没有太多额外的麻烦,您可以向控件添加自动调整大小的行为,以及直接支持边框。此外,我使用硬编码高度作为刻度线,但如果根据字体大小和/或控制高度缩放刻度,您可能会发现它看起来更好。

我使用了默认的Designer选择字体,但固定空间字体可能看起来更好,更适合您的需求。

如果您最终走了可编辑文本路线,上面的内容仍应该让您对基本技术有所了解。可能需要进行大量的实验才能获得看起来和工作正常的东西&#34;恰到好处的&#34;给你。