具有相同宽度字符的C#.NET多行TextBox

时间:2011-09-02 14:45:49

标签: c# .net winforms textbox

如果您输入多行文本框

,我该怎么做呢?

ABCDE

&安培;

ABCDE

因此,大E在之下直接

如果它们在同一行,我希望它们垂直排列。

另外,使用winforms

4 个答案:

答案 0 :(得分:30)

您可以将文本框中的字体设置为monospaced吗?

在代码中,保持与默认字体相同的大小:

textBox.Font = new Font(FontFamily.GenericMonospace, textBox.Font.Size);

或者只是更改设计器中的Font属性。

答案 1 :(得分:5)

您可以使用固定宽度字体来完成此操作。 Courier系列字体通常是固定宽度。

您可以在属性编辑器中为文本框控件设置字体。例如,您可以将Font属性设置为 Courier New,8.25pt

答案 2 :(得分:3)

某些字体对不同的字符使用不同的字符宽度。在这种字体中,“m”将具有比“i”更大的宽度。它们被称为比例字体。这些字体看起来更漂亮,更易于阅读。

所有字符宽度相同的字体称为等宽字体字体。它们通常用于源代码,因为它们允许将行注释等功能对齐到代码右侧。

使用等宽字体!

以下是我用来获取已安装的所有等宽字体列表的代码:

using System;
using System.Drawing;
using System.Runtime.InteropServices;

namespace PE.Rendering {

    static class FontHelper {

        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
        class LOGFONT {
            public int lfHeight;
            public int lfWidth;
            public int lfEscapement;
            public int lfOrientation;
            public int lfWeight;
            public byte lfItalic;
            public byte lfUnderline;
            public byte lfStrikeOut;
            public byte lfCharSet;
            public byte lfOutPrecision;
            public byte lfClipPrecision;
            public byte lfQuality;
            public byte lfPitchAndFamily;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
            public string lfFaceName;
        }

        static bool IsMonospaced(Graphics g, Font f)
        {
            float w1, w2;

                w1 = g.MeasureString("i", f).Width;
                w2 = g.MeasureString("W", f).Width;
                return w1 == w2;
        }

        static bool IsSymbolFont(Font font)
        {
            const byte SYMBOL_FONT = 2;

            LOGFONT logicalFont = new LOGFONT();
            font.ToLogFont(logicalFont);
            return logicalFont.lfCharSet == SYMBOL_FONT;
        }

        /// <summary>
        /// Tells us, if a font is suitable for displaying document.
        /// </summary>
        /// <remarks>Some symbol fonts do not identify themselves as such.</remarks>
        /// <param name="fontName"></param>
        /// <returns></returns>
        static bool IsSuitableFont(string fontName)
        {
            return !fontName.StartsWith("ESRI") && !fontName.StartsWith("Oc_");
        }

        public static List<string> GetMonospacedFontNames()
        {
            List<string> fontList = new List<string>();
            InstalledFontCollection ifc;

            ifc = new InstalledFontCollection();
            using (Bitmap bmp = new Bitmap(1, 1)) {
                using (Graphics g = Graphics.FromImage(bmp)) {
                    foreach (FontFamily ff in ifc.Families) {
                        if (ff.IsStyleAvailable(FontStyle.Regular) && ff.IsStyleAvailable(FontStyle.Bold) 
                            && ff.IsStyleAvailable(FontStyle.Italic) && IsSuitableFont( ff.Name)) {
                            using (Font f = new Font(ff, 10)) {
                                if (IsMonospaced(g,f) && !IsSymbolFont(f)) {
                                    fontList.Add(ff.Name);
                                }
                            }
                        }
                    }
                }
            }
            return fontList;
        }
    }

}

答案 3 :(得分:0)

尝试使用等宽或固定宽度的字体。