Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Как определить среднюю ширину символа шрифта?


Автор: Hacker 9.4.2006, 20:27

Подскажите кто знает. Имеется шрифт типа TFont. Надо определить среднюю ширину одного символа. Или хотябы среднее отношение ширины к высоте.

Автор: Matematik 9.4.2006, 21:03
Не знаю.
Но может сойдет Canvas.TextWidth() и Canvas.TextHeight()

Автор: Демо 9.4.2006, 21:11
Среднюю ширину символа можно определить только относительно к конкретной канве. Например, для Form1:

Код

var
  s: String;
  R: TRect;
begin
  s := 'qwertyuiopasdfghjklzxcvbnm'+
       'QWERTYUIOPASDFGHJKLZXCVBNM'+
       'йцукенгшщзхъёфывапролджэячсмитьбю'+
       'ЙЦУКЕНГШЩЗХЪЁФЫВАПРОЛДЖЭЯЧСМИТЬБЮ';
  DrawText(
    Form1.Canvas.Handle,
    PChar(s),
    Length(s),
    R,
    DT_CALCRECT);
  ShowMessage('Средняя ширина символа: '+IntToStr((R.Right-R.Left) div Length(s)));



Для любого окна вместо Form1.Canvas.Handle нужно использовать:

Код

var
  DC: HDC;
begin
  DC := GetDC(HWND);
//Далее точно так же
  ...
  ReleaseDC(HWND,DC)
end;


Добавлено @ 21:14
R.Bottom - R.Top вернет высоту шрифта.

Автор: Hacker 9.4.2006, 21:20
Спасибо за ответы, но боюсь мне это не подойдёт, т.к. нету там канвы, где мне Это применить надо. Но где-то в недрах шрифта должна содержаться информация об отношении ширины к высоте или "сжатие", не знаю как точно называется... Как бы её оттуда выковырять.

Автор: Демо 9.4.2006, 21:34
Цитата(Hacker @ 9.4.2006, 21:20 Найти цитируемый пост)
т.к. нету там канвы, где мне Это применить надо.


Тогда какой смысл говорить об отношении ширины к высоте?
На канве может быть разное количество пикселей по высоте и ширине. Тогда вообще ни о каком соотношении без канвы речи не может быть.

Автор: Snowy 9.4.2006, 22:42
Вообще-то у большинства шрифтов нет фиксированного отношения ширины к высоте.
Высота для всех символов одинаковая, а вот ширина как правило нет.
А то, что канвы нет, так это не проблема.
Создаем битмап, ассоциируем с нашим шрифтом и вычисляем значения для его канвы.
Потом просто его убиваем.

Автор: Girder 10.4.2006, 09:28
GetCharWidth32/GetCharWidth/GetCharABCWidths

Один из примеров использывания: http://forum.vingrad.ru/index.php?showtopic=52406&view=findpost&p=415543

Автор: Hacker 11.4.2006, 06:03
Спасибо Girder, попробую как время появится.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)