[.NET] Как рисовать текст на принтере?
на самом деле требуется получить PDF, но если мы можем печатать на принтре, то PDF получить не проблема
а size3 вроде и не должен равнятся сумме первых двух
как узнать ширину одного символа?
Ширина строки может не равняться сумме ширин символов этой строки.
Чтобы правильно нарисовать строку символов надо проделать следующее:
1. Нарисовать символ. (Если нужна именно длина, то только определить размеры)
2. Получить смещение до следующего символа.
3. Скорректировать смещение для пары символов.
Первые два шага делает функция GetGlyphOutline в win32 (в .net аналогов я не нашел). Она возвращает GLYPHMETRICS с параметрами смещения, размерами символа и смещение относительно "центра" символа. Плюс эта же функция может нарисовать символ в каком-нибудь виде.
Третий шаг делается функцией GetKernigPairs в win32 (в .net аналогов я не нашел которая возвпащает массив символов, которые следует смещать, если они печатаются рядом.
Собственно, это все, если нужна одна строка символов, если больше одной, тогда ещё две проблемы возникнут: пробелы между словами и расстояние между строками.
ЗЫ: Почему ты не хочешь делать сразу MeasureString?
![](/images/graemlins/smile.gif)
Почему ты не хочешь делать сразу MeasureString?как быть, если в строке текст разного формата?
![](/user/upload/file118638.jpg)
Возможно даже часть слова другого формата.
как быть, если в строке текст разного формата?Измерить одну часть, затем другую. И добавить расстояние между ними. В чём проблема-то?
типа, вот (статья Obtain Font Metrics из мсдн):
![](/user/upload/file3526.png)
В чём проблема-то?Два символа будут занимать расстояние раное сумме расстояний, занимаемых каждым из символов?
Как через MeasureString сделать второй и третий шаг, описанный выше.
Как через MeasureString сделать второй и третий шаг, описанный выше.Ты хоть какие-то усилия к решению проблемы прилагаешь? Например, было бы неплохо почитать MSDN. В частности, про функции, о которых тебе написали. MeasureString тебе вернёт СРАЗУ ВЕСЬ прямоугольник, в котором рисуется строка.
Чтобы отобразить две строки разными шрифтами (кеглем, стилем) общего рецепта нет, нужно какое-то выравнивание по вертикали и по горизонтали. Попробуй в ворде по-разному повыравнивать: увидишь, что он пробелы изменяет. Да и если строка разным кеглем, то расстояние до другой строки тоже хз какое. Но все это к MeasureString уже отношения не имеет.
Кернинг тоже для разных кеглей не делается, как ты себе представляешь слово символами с разным кеглем?
Кстати, в GDI есть ещё пачка функций для форматирования символов и текста (GetCharWidth32 GetCharWidthFloat GetCharABCWidths GetCharABCWidthsFloat)
В Ворде если посмотришь можно кернингом управлять.
Оставить комментарий
6yrop
Требуется печатать на принтере текст сложного формата. Поэтому нужно знать размеры текста, которые он будет занимать после печати. Но у класса Font нет метода, чтобы узнать ширину символаМетод TextRenderer.MeasureText не совсем то, что нужно. Он не дает полного информации о размерах текста, например,
size3 не равен сумме size1 + size2, что вполне ожидаемо.
Какие еще есть способы рисования шрифтов на принтере?