如果我只使用下划线样式绘制文本(仅空格),我就会遇到下划线缺失问题。请在下面参考下面尝试过的代码,让我知道解决此问题的解决方案。
Bitmap bitmap = new Bitmap(400, 200);
Graphics graphics = Graphics.FromImage(bitmap);
Brush brush = new SolidBrush(Color.White);
graphics.FillRectangle(brush, 0, 0, 400, 200);
System.Drawing.Font font = new System.Drawing.Font("Arial", 12, FontStyle.Underline);
brush = new SolidBrush(Color.Black);
StringFormat stringformat = new StringFormat(StringFormat.GenericTypographic);
stringformat.FormatFlags |= StringFormatFlags.MeasureTrailingSpaces;
string text = "Hello";
SizeF sizeF = m_graphics.MeasureString(text, font, new PointF(0, 0), stringformat);
graphics.DrawString(text, font, brush, new RectangleF(0, 0, sizeF.Width, sizeF.Height), stringformat);
text = " ";
float width = sizeF.Width;
sizeF = m_graphics.MeasureString(text, font, new PointF(0, 0), stringformat);
graphics.DrawString(text, font, brush, new RectangleF(width, 0, sizeF.Width, sizeF.Height), stringformat);
text = "World";
width += sizeF.Width;
sizeF = m_graphics.MeasureString(text, font, new PointF(0, 0), stringformat);
graphics.DrawString(text, font, brush, new RectangleF(width, 0, sizeF.Width, sizeF.Height), stringformat);
答案 0 :(得分:2)
据我所知,您有三种选择:
使用等宽字体( Courier New 和 Lucida Sans Typewriter )。有关等宽字体here和here的更多信息。
System.Drawing.Font font =
new System.Drawing.Font("Courier New", 12, FontStyle.Underline);
立即撰写文字。如果只编写空格,那么即使使用TextRenderer
绘制字符串,该方法也不起作用。因此,如果您单独收到字符串,我建议将它们添加到StringBuilder
中并绘制整个文本或句子。
var sb = new StringBuilder();
sb.Append("Hello");
sb.Append(" ");
sb.Append("World!");
var bitmap = new Bitmap(400, 200);
var graphics = Graphics.FromImage(bitmap);
Brush brush = new SolidBrush(Color.White);
graphics.FillRectangle(brush, 0, 0, 400, 200);
var font = new Font("Arial", 12, FontStyle.Underline);
brush = new SolidBrush(Color.Black);
var stringformat = new StringFormat(StringFormat.GenericTypographic);
stringformat.FormatFlags = StringFormatFlags.MeasureTrailingSpaces;
stringformat.Trimming = StringTrimming.None;
var text = sb.ToString();
var sizeF = graphics.MeasureString(text, font, new PointF(0, 0), stringformat);
graphics.DrawString(text, font, brush,
new RectangleF(5, 0, sizeF.Width, sizeF.Height), stringformat);
黑客版本:您可以绘制一个不可见的字符,例如(char)127
,这是删除字符,就像这样(您可以使用第2点的代码并添加此初始化StringBuilder
时的行:
sb.Append(new string ((char)127, 5)); //this will create approx. five spaces.
如果需要,您可以使用其他不可见的字符。
第3个选项是黑客,应该这样考虑,如果你可以改变字体,我建议选项1,否则选项2。