具有相同宽度字符的C#.NET多行文本框

具有相同宽度字符的C#.NET多行文本框,c#,.net,winforms,textbox,C#,.net,Winforms,Textbox,如果您在多行文本框中键入内容,我如何才能做到这一点 abcde & ABCDE 所以大E在小E的正下方 如果它们在同一行,我希望它们垂直排列 另外,使用winforms可以将文本框上的字体设置为1吗 在代码中,保持与默认字体相同的大小: textBox.Font = new Font(FontFamily.GenericMonospace, textBox.Font.Size); 或者只需更改设计器中的Font属性。尝试使用单间距字体或固定宽度字体。您可以使用固定宽度字体。Courier系列字

如果您在多行文本框中键入内容,我如何才能做到这一点

abcde

&

ABCDE

所以大E在小E的正下方

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


另外,使用winforms可以将文本框上的字体设置为1吗

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

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

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

尝试使用单间距字体或固定宽度字体。

您可以使用固定宽度字体。Courier系列字体通常是固定宽度的


可以在属性编辑器中为textbox控件设置字体。例如,您可以将字体属性设置为“Courier New,8.25pt”

某些字体对不同的字符使用不同的字符宽度。在这种字体中,“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;
        }
    }

}
使用系统;
使用系统图;
使用System.Runtime.InteropServices;
命名空间PE.Rendering{
静态类FontHelper{
[StructLayout(LayoutKind.Sequential,CharSet=CharSet.Auto)]
类LOGFONT{
公众身高;
公共宽度;
公共擒纵机构;
公众导向;
公众体重;
公共字节斜体;
公共字节;
公众罢工;
公共字节字符集;
公共字节输出精度;
公共字节lfclipprection;
公共服务质量;
公共家庭;
[Marshallas(UnmanagedType.ByValTStr,SizeConst=32)]
公共字符串名称;
}
静态布尔值(图形g,字体f)
{
浮子w1、w2;
w1=g.测量范围(“i”,f).宽度;
w2=g.测量范围(“W”,f).宽度;
返回w1==w2;
}
静态布尔IsSymbolFont(字体)
{
常量字节符号\u FONT=2;
LOGFONT logicalFont=新的LOGFONT();
字体。ToLogFont(logicalFont);
返回logicalFont.lfCharSet==SYMBOL\u字体;
}
/// 
///告诉我们字体是否适合显示文档。
/// 
///某些符号字体本身不具有这种标识。
/// 
/// 
静态布尔IsSuitableFont(字符串fontName)
{
return!fontName.StartsWith(“ESRI”)和&!fontName.StartsWith(“Oc”);
}
公共静态列表GetMonospacedFontNames()
{
List fontList=新列表();
InstalledFontCollection ifc;
ifc=新安装的FontCollection();
使用(位图bmp=新位图(1,1)){
使用(Graphics g=Graphics.FromImage(bmp)){
foreach(ifc.族中的FontFamily ff){
if(ff.IsStyleAvailable(FontStyle.Regular)和&ff.IsStyleAvailable(FontStyle.Bold)
&&ff.IsStyleAvailable(FontStyle.Italic)和&IsSuitableFont(ff.Name)){
使用(字体f=新字体(ff,10)){
if(ismonospacted(g,f)&&!IsSymbolFont(f)){
fontList.Add(ff.Name);
}
}
}
}
}
}
返回列表;
}
}
}

学了一个新词,什么是等距字体?使用像ConsoleAs这样的字体安全吗?因为我认为是我自己安装的还是所有字体都是VS随.net framework提供的?@Mark:我似乎记得ConsoleAs随Office提供的。。。我不记得如果您指定的字体在部署的系统上不存在会发生什么。你的用户是谁?制作一个吉他和弦和标签的应用程序,有一个看起来不错,但是有没有一种方法可以将字体打包成app@Mark:我怀疑这将是相当多的工作-你需要调查许可证等。如果我是你,我会坚持使用Courier New:)