【问题标题】:How to customize Winforms textbox text characters separated?如何自定义 Winforms 文本框文本字符分隔?
【发布时间】:2014-10-22 18:47:27
【问题描述】:

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

【问题讨论】:

  • 请务必注意,在 .NET WinForms 中子类化 TextBox 或 RichTextBox 类是不切实际的。它们只是原生 Windows 文本编辑控件的包装器,因此您将无法执行您通常期望能够执行的操作,例如覆盖 OnPaint 和拦截输入,至少在没有一些复杂的 p/ 的情况下不会调用和 WndProc 覆盖。就个人而言,我宁愿从头开始编写一个新的 TextBox,也不愿尝试继承现有的 TextBox。

标签: c# winforms textbox


【解决方案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;
        }
    }
}

这是结果的截图:

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

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

如果您最终选择了可编辑文本路线,那么以上内容仍应让您对基本技术有所了解。可能需要进行大量实验才能获得对您来说“恰到好处”的外观和工作方式。

【讨论】:

    猜你喜欢
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    • 2021-10-04
    • 2021-12-13
    • 1970-01-01
    • 2021-04-13
    • 2018-03-10
    • 2014-11-08
    相关资源
    最近更新 更多