Функции GetCharWidth и GetCharABSWidths возвращают ширину символа, однако если распечатываешь символы с указанной шириной они иногда наезжают друг на друга, а вот функция TextOut распечатывает последовательности символов нормально. Но мне нужно знать ширину символов. Что посоветуете?
08.01.04 13:05: Перенесено из 'C/C++'
man /dev/hands
Re: Как получить правильную ширину символа для TrueType
Здравствуйте, Balrog, Вы писали:
B>Функции GetCharWidth и GetCharABSWidths возвращают ширину символа, однако если распечатываешь символы с указанной шириной они иногда наезжают друг на друга, а вот функция TextOut распечатывает последовательности символов нормально. Но мне нужно знать ширину символов. Что посоветуете?
Здравствуйте, Balrog, Вы писали:
B>Функции GetCharWidth и GetCharABSWidths возвращают ширину символа, однако если распечатываешь символы с указанной шириной они иногда наезжают друг на друга, а вот функция TextOut распечатывает последовательности символов нормально. Но мне нужно знать ширину символов. Что посоветуете?
У символовов помимо их собственной ширины есть ещё расстояние между ними. причём разное для разных пар символов.
Например AV AA, между AA расстояние положительное, а между AV может быть и отрицательным, то есть V началась (верхний левый кончик) там где A (нижний правый кончик) ещё не закончилась (в смысле по горизонтали)
Называеться это чудо кажется кёрнинг. Как это смотреть не знаю, а вот то что символы нельзя выводить по одному знаю.
Есть исклюшения! Courier New и иже с ними fixed-width шрифты. У них вроде interleaving входит в заявленную ширину символа.
Здравствуйте, Balrog, Вы писали:
B>Функции GetCharWidth и GetCharABSWidths возвращают ширину символа, однако если распечатываешь символы с указанной шириной они иногда наезжают друг на друга, а вот функция TextOut распечатывает последовательности символов нормально. Но мне нужно знать ширину символов. Что посоветуете?
Использовать DrawText с указанием в параметре uFormat флажка DT_CALCRECT — при этом текст не выводится, а модифицируется параметр lpRect (в результате он содержит размеры прямоугольника, достаточного для того, чтобы в него вместился текст).
WBR, Chaka
Re: Как получить правильную ширину символа для TrueType
Здравствуйте, Balrog, Вы писали:
B>Функции GetCharWidth и GetCharABSWidths возвращают ширину символа, однако если распечатываешь символы с указанной шириной они иногда наезжают друг на друга, а вот функция TextOut распечатывает последовательности символов нормально. Но мне нужно знать ширину символов. Что посоветуете?
Считать нужно ширину всей строки.
Попробуй GetTextMetrics (но — _только_ для TrueType).
Лучший дар, который мы получили от природы и который лишает нас всякого права жаловаться – это возможность сбежать. /М.Монтень/
Re: Как получить правильную ширину символа для TrueType
Balrog wrote:
> Функции GetCharWidth и GetCharABSWidths возвращают ширину символа, однако если распечатываешь символы с указанной шириной они иногда наезжают друг на друга, а вот функция TextOut распечатывает последовательности символов нормально. Но мне нужно знать ширину символов. Что посоветуете?
GetCharABCWidths() возвращает значения, которые надо сложить, чтобы получить ширину символа.
Также есть таблица кернинга (у не bitmap шрифтов), в которой записано значение дополнительного интервала (положительный или отрицательный) между определенными парами символов (такими как, например, WA LT ГЛ и т.д.). Этот интервал нужно прибавить к ширине первого символа.
Вот тебе класс — генератор ширин (advance). Сгенерированые им ширины передавай в ф-цию ExtTextOut() в последнем параметре lpDx. Функция GetCharacterPlacement() обеспечивает ту же функциональность, что и данный класс, но содержит ошибки, которые делают ее использование практически невозможным.
Мне не нужен кернинг. Мне не нужно узнавать расстояние между символами. Я пишу небольшую утилитку для себя, которая генерирует наборы символов для скинов к Winamp и QCD. Поэтому там каждый символ должен умещатся строго в прямоугольник. В общем проблему я решил, дело был не в АПИшных функциях: я смещение символа в строке неправильно считал. Возникла другая проблема: если шрифт сделать курсивным, то ширина символов по идее должна увеличиться, но она не увеличивается.
man /dev/hands
Re[3]: Как получить правильную ширину символа для TrueType
Re: Как получить правильную ширину символа для TrueType
От:
Аноним
Дата:
13.01.04 00:00
Оценка:
Здравствуйте, Balrog, Вы писали:
B>Функции GetCharWidth и GetCharABSWidths возвращают ширину символа, однако если распечатываешь символы с указанной шириной они иногда наезжают друг на друга, а вот функция TextOut распечатывает последовательности символов нормально. Но мне нужно знать ширину символов. Что посоветуете?
GetCharABSWidths. abcB — ширина самой картинки символа — то, что нужно.