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
|
|