具有相同宽度字符的C#.NET多行文本框
如果您在多行文本框中键入内容,我如何才能做到这一点 abcde & ABCDE 所以大E在小E的正下方 如果它们在同一行,我希望它们垂直排列具有相同宽度字符的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系列字
另外,使用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:)