Документ взят из кэша поисковой машины. Адрес оригинального документа : http://www.fds-net.ru/showflat.php?Number=4684054&src=arc&showlite=
Дата изменения: Unknown
Дата индексирования: Wed Apr 13 10:21:45 2016
Кодировка: Windows-1251
[.NET] Как рисовать текст на принтере? - Public forum of MSU united student networks
Root | Google | Yandex | Mail.ru | Kommersant | Afisha | LAN Support
  
Technical >> Development (Archive)

Страницы: 1
Shurik

Рег.: 27.09.2003
Сообщений: 13646
Рейтинг: 787
  [.NET] Как рисовать текст на принтере?
      03.06.2006 15:45
 

Требуется печатать на принтере текст сложного формата. Поэтому нужно знать размеры текста, которые он будет занимать после печати. Но у класса Font нет метода, чтобы узнать ширину символа
Метод TextRenderer.MeasureText не совсем то, что нужно. Он не дает полного информации о размерах текста, например,
 
code:

Size size1 = TextRenderer.MeasureText("Q", new Font("Arial", 12.0F));
Size size2 = TextRenderer.MeasureText("W", new Font("Arial", 12.0F));
Size size3 = TextRenderer.MeasureText("QW", new Font("Arial", 12.0F));
  

size3 не равен сумме size1 + size2, что вполне ожидаемо.

Какие еще есть способы рисования шрифтов на принтере?



not fluffing up the experience with features that will ultimately cause you a headache
Shurik

Рег.: 27.09.2003
Сообщений: 13646
Рейтинг: 787
  Re: [.NET] Как рисовать текст на принтере? [re: Shurik]
      03.06.2006 15:56
 

на самом деле требуется получить PDF, но если мы можем печатать на принтре, то PDF получить не проблема



not fluffing up the experience with features that will ultimately cause you a headache
bacrcraft

Рег.: 14.04.2004
Сообщений: 2304
Рейтинг: 48
  Re: [.NET] Как рисовать текст на принтере? [re: Shurik]
      04.06.2006 01:23
 

а size3 вроде и не должен равнятся сумме первых двух

Shurik

Рег.: 27.09.2003
Сообщений: 13646
Рейтинг: 787
  Re: [.NET] Как рисовать текст на принтере? [re: bacrcraft]
      04.06.2006 02:55
 

как узнать ширину одного символа?



not fluffing up the experience with features that will ultimately cause you a headache
nu3geTC
делу венеТС

Рег.: 03.03.2005
Сообщений: 357
Из: meth (Б 459)
Рейтинг: 0
  Re: [.NET] Как рисовать текст на принтере? [re: Shurik]
      05.06.2006 05:40
 

Ширину символа в каких единицах?
Ширина строки может не равняться сумме ширин символов этой строки.

Чтобы правильно нарисовать строку символов надо проделать следующее:
1. Нарисовать символ. (Если нужна именно длина, то только определить размеры)
2. Получить смещение до следующего символа.
3. Скорректировать смещение для пары символов.

Первые два шага делает функция GetGlyphOutline в win32 (в .net аналогов я не нашел). Она возвращает GLYPHMETRICS с параметрами смещения, размерами символа и смещение относительно "центра" символа. Плюс эта же функция может нарисовать символ в каком-нибудь виде.

Третий шаг делается функцией GetKernigPairs в win32 (в .net аналогов я не нашел), которая возвпащает массив символов, которые следует смещать, если они печатаются рядом.

Собственно, это все, если нужна одна строка символов, если больше одной, тогда еще две проблемы возникнут: пробелы между словами и расстояние между строками.

ЗЫ: Почему ты не хочешь делать сразу MeasureString?





Редактировал nu3geTC (05.06.2006 05:48)
8(926)2858974
Shurik

Рег.: 27.09.2003
Сообщений: 13646
Рейтинг: 787
  Re: [.NET] Как рисовать текст на принтере? [re: nu3geTC]
      05.06.2006 14:55
 

Спасибо, за ответ

Quote:

Почему ты не хочешь делать сразу MeasureString?



как быть, если в строке текст разного формата?

Возможно даже часть слова другого формата.





not fluffing up the experience with features that will ultimately cause you a headache
Mike
Ызарг

Рег.: 02.11.2002
Сообщений: 8098
Рейтинг: 2147
  Re: [.NET] Как рисовать текст на принтере? [re: Shurik]
      05.06.2006 15:24
 

Quote:

как быть, если в строке текст разного формата?



Измерить одну часть, затем другую. И добавить расстояние между ними. В чем проблема-то?

nu3geTC
делу венеТС

Рег.: 03.03.2005
Сообщений: 357
Из: meth (Б 459)
Рейтинг: 0
  Re: [.NET] Как рисовать текст на принтере? [re: Mike]
      05.06.2006 15:50
 

Ага, еще надо правильно по вертикали выровнять. Поюзав GetEmHeight, GetCellAscent, GetCellDescent, GetLineSpacing.

типа, вот (статья Obtain Font Metrics из мсдн):




8(926)2858974
Shurik

Рег.: 27.09.2003
Сообщений: 13646
Рейтинг: 787
  Re: [.NET] Как рисовать текст на принтере? [re: Mike]
      05.06.2006 16:27
 

Quote:

В чем проблема-то?



Два символа будут занимать расстояние раное сумме расстояний, занимаемых каждым из символов?
Как через MeasureString сделать второй и третий шаг, описанный выше.





Редактировал Shurik (05.06.2006 16:30)
not fluffing up the experience with features that will ultimately cause you a headache
Mike
Ызарг

Рег.: 02.11.2002
Сообщений: 8098
Рейтинг: 2147
  Re: [.NET] Как рисовать текст на принтере? [re: Shurik]
      05.06.2006 16:36
 

Quote:

Как через MeasureString сделать второй и третий шаг, описанный выше.



Ты хоть какие-то усилия к решению проблемы прилагаешь? Например, было бы неплохо почитать MSDN. В частности, про функции, о которых тебе написали. MeasureString тебе вернет СРАЗУ ВЕСЬ прямоугольник, в котором рисуется строка.

nu3geTC
делу венеТС

Рег.: 03.03.2005
Сообщений: 357
Из: meth (Б 459)
Рейтинг: 0
  Re: [.NET] Как рисовать текст на принтере? [re: Shurik]
      05.06.2006 18:41
 

Ты не понял. Этот пост именно про рисование строки символов одним шрифтом, одним кеглем и одним стилем. В случае, если ты решил руками сам строку рисовать, в OpenGL, например.
Чтобы отобразить две строки разными шрифтами (кеглем, стилем) общего рецепта нет, нужно какое-то выравнивание по вертикали и по горизонтали. Попробуй в ворде по-разному повыравнивать: увидишь, что он пробелы изменяет. Да и если строка разным кеглем, то расстояние до другой строки тоже хз какое. Но все это к MeasureString уже отношения не имеет.

Кернинг тоже для разных кеглей не делается, как ты себе представляешь слово символами с разным кеглем?

Кстати, в GDI есть еще пачка функций для форматирования символов и текста (GetCharWidth32 GetCharWidthFloat GetCharABCWidths GetCharABCWidthsFloat)

В Ворде если посмотришь можно кернингом управлять.




8(926)2858974
Страницы: 1

Technical >> Development (Archive)

Дополнительная информация
1 зарегистрированных и 1 анонимных пользователей просматривают этот форум.

Модераторы:  DarkGray 

Печать темы

Права
      Вы можете создавать новые темы
      Вы можете отвечать на сообщения
      HTML отключен
      UBBCode включен

Рейтинг:
Просмотров темы:

Переход в