2008-11-19 2 views
3

Я пытаюсь измерить высоту некоторого текста для цели печати.Высота строки, измеренная с помощью MeasureString в PrintPreviewDialog, отличается от фактической печати

Вот код. В моем случае он печатает разные цифры в предварительном просмотре и на фактической странице. Я не могу попробовать ни на одном принтере, кроме 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); 
    } 

ответ

0

Попробуйте использовать PageUnit, кроме Graphics.Pixel, в своем событии PrintPage. Дюйм, Миллиметр или Точка (в том числе) должны дать вам тот же результат в Preview или распечатать. Pixel Я бы не ожидал, поскольку экран предварительного просмотра и принтер имеют разные разрешения пикселей.

0

Спасибо вам за ответ.

Я пробовал все доступные страницы, но это не имело значения. Отношение высоты изображения к высоте составляет около 1.029336 и оно постоянное.

С уважением, idn.

PS. На самом деле я нашел обходное решение. Я использую MeasureString для подсчета количества строк, а затем умножаю его на высоту символа, полученную из класса Font, для подсчета высоты текстового фрагмента. Он отлично работает с некоторой настройкой.

+0

Просто любопытно: коэффициент предварительного просмотра-высоты-печати-высоты остается ровно в 1.029336, если вы попробуете размер шрифта, отличный от 24? – MusiGenesis 2008-11-19 06:49:28

1

Я предполагаю, что проблема в том, что System.Drawing.Graphics основана на GDI +, где фактическая печать основана на GDI.

Вы могли бы заменить вызов MeasureString использовать метод, основанный GDI:

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

Класс System.Windows.Forms.TextRenderer был разработан, чтобы обеспечить же уровень поддержки для комплексного скрипты в Windows Forms контролируют то, что мы ожидаем от операционной системы Windows . Этот TextRenderer основан на API-интерфейсе визуализации GDI, который использует обработчик сценариев Windows Unicode (Uniscribe). [from MSDN]

Для получения более подробной информации см эту хорошую статью из журнала MSDN по визуализации текста:

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

0

Я думаю, что я мог бы решить вашу проблему ... Я знаю, как это исправить , еще не совсем понял причину этого.

Проблема заключается в расстоянии между символами. Если вы используете, например, слово «VA» при ее печати (или когда вы «Graphics.FromImage») буква «A» начинается сразу после буквы «V» ... В «PrintPreview» буква «A» начинается буквально внутри буквы «V» ... Если вы добавите отдельные буквы в «PrintPreview», вы достигнете того же результата печати!

 Смежные вопросы

  • Нет связанных вопросов^_^