【发布时间】:2015-09-27 15:33:36
【问题描述】:
我必须测量一个字符串来确定确切的值,这样我就可以创建一个标签,并在报告上设置以下信息以正确打印出来。
我发布了很多关于使用 Graphics.MeasureString 测量搅拌的帖子 但是当我使用这些时,我没有得到打印输出中的精确毫米。
这是我的代码:
public double getStingWith_mm(string InputText, string Fontname, bool TypeBold, bool TypeItalic, double Fontsize)
{
try
{
if (grU == null)
{
//grU = CreateGraphics();
//grU = Graphics.FromImage(new Bitmap(1, 1));
System.Drawing.Printing.PrintDocument PD = new System.Drawing.Printing.PrintDocument();
grU = PD.PrinterSettings.CreateMeasurementGraphics();
}
FontStyle fStyle = FontStyle.Regular;
try
{
if (TypeBold)
fStyle = FontStyle.Bold;
if (TypeItalic)
fStyle = FontStyle.Italic;
}
catch (Exception ex)
{
logger4net.Error("some error during creating of the fonts.", ex);
}
try
{
currentFont = new System.Drawing.Font(
new FontFamily(Fontname),
(int)Math.Ceiling(Fontsize), //next higher size!
fStyle,
GraphicsUnit.Millimeter);
}
catch (Exception ex)
{
logger4net.Error("some error during creating of the fonts " + Fontname, ex);
try
{
currentFont = new System.Drawing.Font(
new FontFamily("Arial"),
(int)Math.Ceiling(Fontsize), //next higher size!
fStyle,
GraphicsUnit.Millimeter);
}
catch (Exception ex2)
{
logger4net.Error("some error during creating of the fonts: we fall back to Arial!!", ex);
}
}
// Change the page scale.
grU.PageUnit = GraphicsUnit.Millimeter;
grU.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
SizeF size = grU.MeasureString(InputText, currentFont); //string format (zusatzparameter) , 495)
//SizeF result2 = grU.MeasureString(InputText, currentFont, int.MaxValue, StringFormat.GenericTypographic);
SizeF result2 = grU.MeasureString(InputText, currentFont, new PointF(0, 0), new StringFormat(StringFormatFlags.MeasureTrailingSpaces));
SizeF result3 = grU.MeasureString(InputText, currentFont, int.MaxValue, StringFormat.GenericTypographic);
int resultInt = MeasureDisplayStringWidth(grU, InputText, currentFont);
//return Math.Ceiling(size.Width);
return Math.Ceiling(result2.Width);
}
catch (Exception ex)
{
logger4net.Error(ex);
return 0;
}
return 0;
}
static public int MeasureDisplayStringWidth(Graphics graphics, string text, System.Drawing.Font font)
{
System.Drawing.StringFormat format = new System.Drawing.StringFormat();
System.Drawing.RectangleF rect = new System.Drawing.RectangleF(0, 0, 1000, 1000);
CharacterRange ranges = new System.Drawing.CharacterRange(0, text.Length);
List<CharacterRange> RangesArray = new List<CharacterRange>();
RangesArray.Add(ranges);
System.Drawing.Region[] regions = new System.Drawing.Region[1];
format.SetMeasurableCharacterRanges(RangesArray.ToArray());
regions = graphics.MeasureCharacterRanges(text, font, rect, format);
rect = regions[0].GetBounds(graphics);
return (int)(rect.Right + 1.0f);
}
在 getStingWith_mm 函数中,我得到了更多结果值来检查我的一种方法是否可以达到正确的值!
现在,如果我使用文本“test”启动此功能,字体 Arial 12,粗体。我得到了一个介于 21 到 25 毫米之间的返回值。但在打印输出上大约是 10 毫米 我不是我的错误。 stackoverflow 上的所有其他示例都可以与 MeasureString 一起使用,它应该可以工作......
我的大部分代码都是从以下帖子中获得的 how to measure width of a string precisely? How to determine width of a string when printed?
感谢任何建议!
【问题讨论】: