C # .NET многострочный TextBox с символами одинаковой ширины - PullRequest
13 голосов
/ 02 сентября 2011

Как мне сделать так, если вы набрали в многострочном текстовом поле

ABCDE

&

ABCDE

Так что большой E прямо ниже маленького e.

Я хочу, чтобы они располагались вертикально, если они находятся в одном ряду.

Также, используя winforms

Ответы [ 4 ]

30 голосов
/ 02 сентября 2011

Вы можете просто установить шрифт в текстовом поле на моноширинный один?

В коде, размер шрифта по умолчанию:

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

Или просто измените свойство Font в конструкторе.

5 голосов
/ 02 сентября 2011

Вы можете сделать это, используя шрифт фиксированной ширины. Семейные шрифты курьера часто имеют фиксированную ширину.

Вы можете установить шрифт в редакторе свойств для элемента управления textbox. Например, вы можете присвоить свойству Font значение Courier New, 8,25pt .

3 голосов
/ 02 сентября 2011

Некоторые шрифты используют разные ширины символов для разных символов.В таких шрифтах «м» будет иметь большую ширину, чем «я».Они называются пропорциональными шрифтами.Эти шрифты выглядят лучше и легче для чтения.

Шрифты, в которых все символы имеют одинаковую ширину, называются моноширинными шрифтами.Они часто используются для исходного кода, так как позволяют выравнивать такие функции, как строчные комментарии справа от кода.

Использовать моноширинный шрифт!

Вот код, который я использую для получения списка всехустановлены моноширинные шрифты:

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;
        }
    }

}
0 голосов
/ 02 сентября 2011

Попробуйте использовать моноширинный или фиксированный шрифт.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...