在PrintPreviewDialog中使用MeasureString测量的字符串高度与实际打印中的高度不同

时间:2008-11-19 05:21:51

标签: c# .net printing gdi+

我正在尝试测量某些文本的高度以用于打印目的。

这是代码。在我的情况下,它在预览和实际页面上打印不同的数字。 我现在不能尝试除Microsoft Office Document Image Writer以外的任何打印机,但我很确定它不是打印机问题。

也许有人找到了解决此问题的方法?

    private void button1_Click(object sender, EventArgs e)
    {
        Print();
    }

    public void Print()
    {
        PrintDocument my_doc = new PrintDocument();
        my_doc.PrintPage += new PrintPageEventHandler(this.PrintPage);

        PrintPreviewDialog my_preview = new PrintPreviewDialog();
        my_preview.Document = my_doc;

        my_preview.ShowDialog();

        my_doc.Dispose();
        my_preview.Dispose();
    }

    private void PrintPage(object sender, 
       System.Drawing.Printing.PrintPageEventArgs e)
    {
        e.Graphics.PageUnit = GraphicsUnit.Pixel;

        string s = "String height is ";

        SizeF h = e.Graphics.MeasureString(s, new Font("Arial", 24));

        e.Graphics.DrawString(s + Convert.ToString(h.Height), 
           new Font("Arial", 24), new SolidBrush(Color.Black), 1, 1);
    }

4 个答案:

答案 0 :(得分:1)

我猜问题是System.Drawing.Graphics基于GDI +,实际打印基于GDI。

您可以替换对MeasureString的调用以使用基于GDI的方法:

SizeF hT = TextRenderer.MeasureText(s, new Font("Arial", 24));
  

System.Windows.Forms.TextRenderer   开发课程是为了提供   对复杂的支持水平相同   Windows窗体中的脚本控制它   我们期望从Windows操作   系统。此TextRenderer基于   GDI文本呈现API,它使用   Windows Unicode脚本处理器   (的Uniscribe)。 [from MSDN]

有关详细信息,请参阅MSDN杂志关于文本呈现的这篇好文章:

  

Text Rendering: Build World-Ready Apps Using Complex Scripts In Windows Forms Controls

答案 1 :(得分:0)

在PrintPage事件中尝试除Graphics.Pixel之外的PageUnit。英寸,毫米或点(以及其他)应该在预览或打印出来时给你相同的结果。由于预览屏幕和打印机具有不同的像素分辨率,因此我不希望使用像素。

答案 2 :(得分:0)

我已经尝试了所有可用的PageUnits,但它没有任何区别。预览高度与打印高度比约为1.029336并且它是恒定的。

PS。其实我找到了解决方法。我使用MeasureString来计算行数,然后将它乘以从Font类派生的字符高度,以计算文本块的高度。它适用于一些调整。

答案 3 :(得分:0)

我想我可以解决你的问题...我知道如何解决它,更多的人不太了解它的原因。

问题是字符之间的间距。例如,如果您使用“" VA"在她的印刷上(或者你在' Graphics.FromImage')的字母' A'在字母' V'之后开始。 ...在' PrintPreview'这封信' A'就在字母“#39; V' ...如果你将单个字母加在' PrintPreview',您将达到相同的打印结果!