Как определить реальную ширину символа?
От: Igorx  
Дата: 15.12.02 11:00
Оценка:
Здравствуйте!

Скажите, как определить реальную ширину символа в пикселах?

GetCharABCWidths() возвращает ширину, указанную в характеристиках фонта, т.е. как бы "ширину знакоместа". Когда стиль — регуляр, все нормально, но когда стиль болд или особенно италик — символ как-бы залазит на следующее "знакоместо", т.е. он реально шире, чем возвращает GetCharABCWidths().

Так вот как определить его настоящую ширину?
Re: Как определить реальную ширину символа?
От: SchweinDeBurg Россия https://zarezky.spb.ru/
Дата: 15.12.02 11:08
Оценка:
Здравствуйте, Igorx, Вы писали:

I>Здравствуйте!


I>Скажите, как определить реальную ширину символа в пикселах?

I>
I>GetCharABCWidths() возвращает ширину, указанную в характеристиках фонта, т.е. как бы "ширину знакоместа". Когда стиль — регуляр, все нормально, но когда стиль болд или особенно италик — символ как-бы залазит на следующее "знакоместо", т.е. он реально шире, чем возвращает GetCharABCWidths().

I>Так вот как определить его настоящую ширину?


GetTextExtentPoint32()
- Искренне ваш, Поросенок Пафнутий
Re[2]: Как определить реальную ширину символа?
От: Igorx  
Дата: 15.12.02 12:39
Оценка:
Здравствуйте, SchweinDeBurg, Вы писали:


I>>Так вот как определить его настоящую ширину?


SDB>GetTextExtentPoint32()


Я пробовал, к сожалению эта функция возвращает тоже, что и GetCharABCWidths() A+B+C
Re[3]: Как определить реальную ширину символа?
От: SchweinDeBurg Россия https://zarezky.spb.ru/
Дата: 15.12.02 12:42
Оценка:
Здравствуйте, Igorx, Вы писали:

I>Я пробовал, к сожалению эта функция возвращает тоже, что и GetCharABCWidths() A+B+C


А нужный шрифт (жирный, к примеру) был выбран в соответствующий контекст перед вызовом? Я таких траблов не помню.
- Искренне ваш, Поросенок Пафнутий
Re[4]: Как определить реальную ширину символа?
От: Igorx  
Дата: 15.12.02 12:54
Оценка:
Здравствуйте, SchweinDeBurg, Вы писали:


I>>Я пробовал, к сожалению эта функция возвращает тоже, что и GetCharABCWidths() A+B+C


SDB>А нужный шрифт (жирный, к примеру) был выбран в соответствующий контекст перед вызовом? Я таких траблов не помню.


Да, конечно. У меня в основном проблема не с жирным, а с италиком.

Мне ширина символа нужна для того, чтобы срендерить весь шрифт на битмап, а потом использовать его для "быстрого" вывода текста. На нормальном шрифте все ок, а на италике правый край символа получается как-бы обрезанным
Re[5]: Как определить реальную ширину символа?
От: SchweinDeBurg Россия https://zarezky.spb.ru/
Дата: 15.12.02 13:54
Оценка:
Здравствуйте, Igorx, Вы писали:

I>Здравствуйте, SchweinDeBurg, Вы писали:


I>Да, конечно. У меня в основном проблема не с жирным, а с италиком.


I>Мне ширина символа нужна для того, чтобы срендерить весь шрифт на битмап, а потом использовать его для "быстрого" вывода текста. На нормальном шрифте все ок, а на италике правый край символа получается как-бы обрезанным


Да, занятная фишка. Если что надумаю — скажу.
- Искренне ваш, Поросенок Пафнутий
Re: Как определить реальную ширину символа?
От: Patalog Россия  
Дата: 15.12.02 14:02
Оценка:
Здравствуйте, Igorx, Вы писали:

Ежели в система не может найти "настоящий" болд (например arialbd.ttf), то жирный шрифт "симулируется" парой вызовов TextOut со смещением.
Примерно то же и с италиком.
Может твоя проблема в етом?
Почетный кавалер ордена Совка.
Re: Как определить реальную ширину символа?
От: migel  
Дата: 15.12.02 14:24
Оценка:
Здравствуйте, Igorx, Вы писали:

I>Здравствуйте!


I>Скажите, как определить реальную ширину символа в пикселах?

I>
I>GetCharABCWidths() возвращает ширину, указанную в характеристиках фонта, т.е. как бы "ширину знакоместа". Когда стиль — регуляр, все нормально, но когда стиль болд или особенно италик — символ как-бы залазит на следующее "знакоместо", т.е. он реально шире, чем возвращает GetCharABCWidths().

I>Так вот как определить его настоящую ширину?


Это известная проблема GDI — она не учитывает наклон италик шрифтов при расчете ширины строк тебе нужно вручную добавить зазорчик — получи структуру OUTLINETEXTMETRIC
otmItalicAngle укажет направление и величину наклона (как обычно в 10 долях градуса) или поиграться с
otmsCharSlopeRise otmsCharSlopeRun — готовые коэффициенты.
Re: Как определить реальную ширину символа?
От: Igorx  
Дата: 16.12.02 08:48
Оценка:
Я пытался рассчитать ширину и высоту шрифта с помощью 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 до сих-пор нет функции, которая правильно расчитает размеры каждой буквы шрифта? Очень уж не хочется рисовать по-старинке — выводить букву в центр битмапа, а потом проверять со всех сторон, где у буквы первый пиксел с каждой из сторон...
Re[2]: Как определить реальную ширину символа?
От: Igorx  
Дата: 16.12.02 08:51
Оценка:
Здравствуйте, migel, Вы писали:


M>Это известная проблема GDI — она не учитывает наклон италик шрифтов при расчете ширины строк тебе нужно вручную добавить зазорчик — получи структуру OUTLINETEXTMETRIC

M>otmItalicAngle укажет направление и величину наклона (как обычно в 10 долях градуса) или поиграться с
M>otmsCharSlopeRise otmsCharSlopeRun — готовые коэффициенты.

К сожалению otmItalicAngle и т.д. есть только в майкрософтовских стандартных шрифтах. В остальных эти параметры одинаковы, что для италик, что для нормал шрифтов. otmItalicAngle==0
Re[2]: Как определить реальную ширину символа?
От: Patalog Россия  
Дата: 16.12.02 16:47
Оценка:
Здравствуйте, Igorx, Вы писали:

[]

Попробуй lfFont.lfHeight = -116;
Почетный кавалер ордена Совка.
Re[3]: Как определить реальную ширину символа?
От: Igorx  
Дата: 17.12.02 06:43
Оценка:
Здравствуйте, Patalog, Вы писали:

P>Попробуй lfFont.lfHeight = -116;


Да, вчера сам с этим разобрался Но, все равно спасибо. Теперь с фонтом Normal проблем нет. Но так и остались проблемы с Italic Все функции возвращают размер символа, как будто установлен стиль Normal. Соответственно символы "обрезаются" по краям. Может быть все же есть способ определить размер символов в стиле Italic? Или хотя бы определить, сколько максимум по ширине и высоте будет занимать символ данного фонта со стилем Italic?
Re: Как определить реальную ширину символа?
От: old->*Plutonia_Experiment() Беларусь http://blogs.rsdn.org/ikemefula
Дата: 17.12.02 08:35
Оценка:
Здравствуйте, Igorx, Вы писали:

Есть способ наверняка.

http://www.rsdn.ru/Forum/Message.aspx?mid=44480&only=1
Автор: Dutchman
Дата: 11.04.02




I>Скажите, как определить реальную ширину символа в пикселах?

I>
I>GetCharABCWidths() возвращает ширину, указанную в характеристиках фонта, т.е. как бы "ширину знакоместа". Когда стиль — регуляр, все нормально, но когда стиль болд или особенно италик — символ как-бы залазит на следующее "знакоместо", т.е. он реально шире, чем возвращает GetCharABCWidths().

I>Так вот как определить его настоящую ширину?
Re[2]: Как определить реальную ширину символа?
От: Igorx  
Дата: 17.12.02 09:20
Оценка:
Здравствуйте, old->*Plutonia_Experiment(), Вы писали:

O>Здравствуйте, Igorx, Вы писали:


O>Есть способ наверняка.


O>http://www.rsdn.ru/Forum/Message.aspx?mid=44480&only=1
Автор: Dutchman
Дата: 11.04.02


О, наверно то, что надо! Спасибо огромное!
Re[3]: Как определить реальную ширину символа?
От: migel  
Дата: 17.12.02 09:21
Оценка:
Здравствуйте, Igorx, Вы писали:

I>К сожалению otmItalicAngle и т.д. есть только в майкрософтовских стандартных шрифтах. В остальных эти параметры одинаковы, что для италик, что для нормал шрифтов. otmItalicAngle==0


Понятно, то-есть ты имееш дело со сгенеренным шрифтом (типа италик тахома) тогда придеться эмпирически взять коэффициенты — примерно 7/26
Re: Как определить реальную ширину символа?
От: kmn Украина  
Дата: 17.12.02 09:23
Оценка:
Здравствуйте, Igorx, Вы писали:

I>Здравствуйте!


I>Скажите, как определить реальную ширину символа в пикселах?

I>
I>GetCharABCWidths() возвращает ширину, указанную в характеристиках фонта, т.е. как бы "ширину знакоместа". Когда стиль — регуляр, все нормально, но когда стиль болд или особенно италик — символ как-бы залазит на следующее "знакоместо", т.е. он реально шире, чем возвращает GetCharABCWidths().

I>Так вот как определить его настоящую ширину?


::GetCharWidth32 пробовал?
Re[2]: Как определить реальную ширину символа?
От: Igorx  
Дата: 17.12.02 09:45
Оценка:
Здравствуйте, kmn, Вы писали:

kmn>Здравствуйте, Igorx, Вы писали:



I>>Так вот как определить его настоящую ширину?


kmn>::GetCharWidth32 пробовал?



Да, для Italic он возвращает ту же ширину, что и для Normal
Re: Как определить реальную ширину символа?
От: VladD2 Российская Империя www.nemerle.org
Дата: 17.12.02 21:01
Оценка:
Здравствуйте, Igorx, Вы писали:

I>Так вот как определить его настоящую ширину?


GetTextExtentExPoint
... << RSDN@Home 1.0 beta 3 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Как определить реальную ширину символа?
От: c-smile Канада http://terrainformatica.com
Дата: 17.12.02 22:32
Оценка:
Здравствуйте, Igorx, Вы писали:

I>Здравствуйте!


I>Скажите, как определить реальную ширину символа в пикселах?

I>
I>GetCharABCWidths() возвращает ширину, указанную в характеристиках фонта, т.е. как бы "ширину знакоместа". Когда стиль — регуляр, все нормально, но когда стиль болд или особенно италик — символ как-бы залазит на следующее "знакоместо", т.е. он реально шире, чем возвращает GetCharABCWidths().

I>Так вот как определить его настоящую ширину?


Может поможет:

1) TEXTMETRIC.tmOverhang;
2) http://support.microsoft.com/default.aspx?scid=kb;en-us;Q200262
3) http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/fontext_8f6t.asp
4) Ну и естественно через BeginPath() EndPath(). Хотя это очень...избыточно.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.