Скажите, как определить реальную ширину символа в пикселах?
GetCharABCWidths() возвращает ширину, указанную в характеристиках фонта, т.е. как бы "ширину знакоместа". Когда стиль — регуляр, все нормально, но когда стиль болд или особенно италик — символ как-бы залазит на следующее "знакоместо", т.е. он реально шире, чем возвращает GetCharABCWidths().
Здравствуйте, Igorx, Вы писали:
I>Здравствуйте!
I>Скажите, как определить реальную ширину символа в пикселах? I> I>GetCharABCWidths() возвращает ширину, указанную в характеристиках фонта, т.е. как бы "ширину знакоместа". Когда стиль — регуляр, все нормально, но когда стиль болд или особенно италик — символ как-бы залазит на следующее "знакоместо", т.е. он реально шире, чем возвращает GetCharABCWidths().
I>Так вот как определить его настоящую ширину?
I>>Я пробовал, к сожалению эта функция возвращает тоже, что и GetCharABCWidths() A+B+C
SDB>А нужный шрифт (жирный, к примеру) был выбран в соответствующий контекст перед вызовом? Я таких траблов не помню.
Да, конечно. У меня в основном проблема не с жирным, а с италиком.
Мне ширина символа нужна для того, чтобы срендерить весь шрифт на битмап, а потом использовать его для "быстрого" вывода текста. На нормальном шрифте все ок, а на италике правый край символа получается как-бы обрезанным
Здравствуйте, Igorx, Вы писали:
I>Здравствуйте, SchweinDeBurg, Вы писали:
I>Да, конечно. У меня в основном проблема не с жирным, а с италиком.
I>Мне ширина символа нужна для того, чтобы срендерить весь шрифт на битмап, а потом использовать его для "быстрого" вывода текста. На нормальном шрифте все ок, а на италике правый край символа получается как-бы обрезанным
Ежели в система не может найти "настоящий" болд (например arialbd.ttf), то жирный шрифт "симулируется" парой вызовов TextOut со смещением.
Примерно то же и с италиком.
Может твоя проблема в етом?
Здравствуйте, Igorx, Вы писали:
I>Здравствуйте!
I>Скажите, как определить реальную ширину символа в пикселах? I> I>GetCharABCWidths() возвращает ширину, указанную в характеристиках фонта, т.е. как бы "ширину знакоместа". Когда стиль — регуляр, все нормально, но когда стиль болд или особенно италик — символ как-бы залазит на следующее "знакоместо", т.е. он реально шире, чем возвращает GetCharABCWidths().
I>Так вот как определить его настоящую ширину?
Это известная проблема GDI — она не учитывает наклон италик шрифтов при расчете ширины строк тебе нужно вручную добавить зазорчик — получи структуру OUTLINETEXTMETRIC
otmItalicAngle укажет направление и величину наклона (как обычно в 10 долях градуса) или поиграться с
otmsCharSlopeRise otmsCharSlopeRun — готовые коэффициенты.
Я пытался рассчитать ширину и высоту шрифта с помощью DrawText — DT_CALCRECT. Думал, кто-кто, а уж функция, которая реально выводит текст должна знать реальную ширину и высоту выводимых символов. Но это не так! Эта функция ошибается даже на типе фонта Normal! Например ширину буквы "д" она дает меньше, чем на самом деле. И вообще, она ошибается на всех "широких буквах" Такое ощущение, что DrawText — DT_CALCRECT берет ширину фонта из параметров шрифта, и если текст немного "вылазит" за пределы этих параметров — на возвращает ширину и высоту не правильно.
Я подумал — может проблема в том, как я создаю фонт?
Font = CreateFontIndirect(&lfFont);
где
lfFont.lfWidth=0;
lfFont.lfHeight=116;
lfFont.lfCharSet=RUSSIAN_CHARSET;
lfFont.lfQuality=ANTIALIASED_QUALITY;
lfFont.lfFaceName="Arial"
и т.д.
Может быть из-за "нестандартной" высоты шрифта, он создает фонт немного поменьше, все параметры возвращает для шрифта "поменьше", а реально выводит то, что я указал в lfHeight?
Подскажите пожалуйста, неужели в век WinXP у Windows до сих-пор нет функции, которая правильно расчитает размеры каждой буквы шрифта? Очень уж не хочется рисовать по-старинке — выводить букву в центр битмапа, а потом проверять со всех сторон, где у буквы первый пиксел с каждой из сторон...
M>Это известная проблема GDI — она не учитывает наклон италик шрифтов при расчете ширины строк тебе нужно вручную добавить зазорчик — получи структуру OUTLINETEXTMETRIC M>otmItalicAngle укажет направление и величину наклона (как обычно в 10 долях градуса) или поиграться с M>otmsCharSlopeRise otmsCharSlopeRun — готовые коэффициенты.
К сожалению otmItalicAngle и т.д. есть только в майкрософтовских стандартных шрифтах. В остальных эти параметры одинаковы, что для италик, что для нормал шрифтов. otmItalicAngle==0
Здравствуйте, Patalog, Вы писали:
P>Попробуй lfFont.lfHeight = -116;
Да, вчера сам с этим разобрался Но, все равно спасибо. Теперь с фонтом Normal проблем нет. Но так и остались проблемы с Italic Все функции возвращают размер символа, как будто установлен стиль Normal. Соответственно символы "обрезаются" по краям. Может быть все же есть способ определить размер символов в стиле Italic? Или хотя бы определить, сколько максимум по ширине и высоте будет занимать символ данного фонта со стилем Italic?
I>Скажите, как определить реальную ширину символа в пикселах? I> I>GetCharABCWidths() возвращает ширину, указанную в характеристиках фонта, т.е. как бы "ширину знакоместа". Когда стиль — регуляр, все нормально, но когда стиль болд или особенно италик — символ как-бы залазит на следующее "знакоместо", т.е. он реально шире, чем возвращает GetCharABCWidths().
I>Так вот как определить его настоящую ширину?
Здравствуйте, Igorx, Вы писали:
I>К сожалению otmItalicAngle и т.д. есть только в майкрософтовских стандартных шрифтах. В остальных эти параметры одинаковы, что для италик, что для нормал шрифтов. otmItalicAngle==0
Понятно, то-есть ты имееш дело со сгенеренным шрифтом (типа италик тахома) тогда придеться эмпирически взять коэффициенты — примерно 7/26
Здравствуйте, Igorx, Вы писали:
I>Здравствуйте!
I>Скажите, как определить реальную ширину символа в пикселах? I> I>GetCharABCWidths() возвращает ширину, указанную в характеристиках фонта, т.е. как бы "ширину знакоместа". Когда стиль — регуляр, все нормально, но когда стиль болд или особенно италик — символ как-бы залазит на следующее "знакоместо", т.е. он реально шире, чем возвращает GetCharABCWidths().
I>Так вот как определить его настоящую ширину?
Здравствуйте, Igorx, Вы писали:
I>Здравствуйте!
I>Скажите, как определить реальную ширину символа в пикселах? I> I>GetCharABCWidths() возвращает ширину, указанную в характеристиках фонта, т.е. как бы "ширину знакоместа". Когда стиль — регуляр, все нормально, но когда стиль болд или особенно италик — символ как-бы залазит на следующее "знакоместо", т.е. он реально шире, чем возвращает GetCharABCWidths().
I>Так вот как определить его настоящую ширину?