Многострочный текстовый тег С#.NET с одинаковыми символами
Как я могу это сделать, если вы ввели многострочное текстовое поле
ABCDE
&
ABCDE
Так что большой E непосредственно ниже маленького e.
Я хочу, чтобы они выравнивались вертикально, если они находятся в одной строке.
Кроме того, используя winforms
Ответы
Ответ 1
Вы можете просто установить шрифт в текстовое поле monospaced один?
В коде, сохраняющем тот же размер, что и шрифт по умолчанию:
textBox.Font = new Font(FontFamily.GenericMonospace, textBox.Font.Size);
Или просто измените свойство Font
в конструкторе.
Ответ 2
Вы можете сделать это, используя шрифт с фиксированной шириной. Курьерские семейные шрифты часто имеют фиксированную ширину.
Вы можете установить шрифт в редакторе свойств для элемента управления текстовым полем. Например, вы можете присвоить свойству Font значение Courier New, 8.25pt.
Ответ 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;
}
}
}
Ответ 4
Попробуйте использовать шрифты с моноширинной или фиксированной шириной.