Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблема со шрифтами


Lirrk ©   (2010-02-06 18:41:00) 

Немного ниже было написано
В KOL размер шрифта указывается в пикселах, в VCL - в пунктах.
Не совсем так. Размер шрифта и высота шрифта, параметры абсолютно разные. И не надо со мной спорить, потому что я столкнулся с этой проблемой. Если вы уверены в своей правоте, то обьясните пожалуйста, как выйти из такой ситуации.
В Delphi есть такой параметр как Font.Size (В KOL нет)
Задавая ему значения я масштабирую шрифт. Но дело в том, что у каждого шрифта своя высота. И меняется она прпорционально масштабированию. Взяли, скажем, Arial у него одна высота. Взяли Тahoma высота при том же размере шрифта стала больше.
Теперь... Мне нужно вывести текст в графическом режиме.
Причём разными шрифтами в одной строке.
Но в силу того что при одном размере высота шрифтов разная, а вывод в горафике ведётся сверху вниз.. То Шрифты "Прыгают" Их надо опустить на общую линию
В Delphi это делаю так
Задаю размер шрифта.
Читаю символ
Получаю его высоту.
На основе высоты текущего шрифта и ранее вычесленной
высотой строки (по высоте самого высокого шрифта) я получаю разницу, которую добавляю к координате Y. Всё строка ровная.
В KOL ничего подобного я не обнаружил. Есть только высота текста и высота фонта. Всё... задав высоту фонта ту же высоту получает весь текст...
Как в КОL выводить шрифты разного размера, и получать при этом реальную высоту каждого шрифта?


MTsv DN   (2010-02-07 22:17:00) [1]

1. KOL - это object-обертка для WinAPI. Либо работайте с шрифтами как Вам посоветовал Ruzzz (в смысле через WinAPI), либо, если в KOL ошибка, исправляйте и, при желании, информируйте коммунити, либо используйте VCL, раз там все работает.

2. Я уже говорил ранее. Если хотите конкретной помощи, то делайте тестовый проект с указанием ошибки, давайте здесь ссылку. У кого будет время, тот посмотрит.

3. Как можно заметить, к KOL дельфи сообщество охладело (вернее та его часть, что была заинтересована). Сейчас никто не рвется править код, оптимизировать его, сохраняя при этом идею минимизации.

4. Лично я использую KOL для создания GUI и все больше перехожу на чистый WinAPI. Из KOL.PAS чаще всего беру те функи, что прописаны были в SysUtils.


Lirrk   (2010-02-07 17:30:00) [2]

2 Ruzzz ©
Спасибо, конечно... Но меня интерисует как это сделать на Паскале и именно в KOL.
С фонтами я умею работать... Но вот в КОL столько изменено, что добратся до нужного результата подчас бывает очень трудно. Разница в результатах написаного в VCL и KOL при одном и том же коде - значительная.
Вот с размером... Задав размер шрифта в VCL я могу получить размер шрифта по вертикали. В КOL этим параметром масштабируется сам шрифт.
При этом символ оказывается крупнее.  И вот к чему это приводит. Я готовлю в Ворде текст, чтобы вывести его потом в графическом режиме. Форматирую его там. А при переносе в КОL я обнаруживаю, что форматирование сбивается... И дело не в пунктах и в пикселях, а в том что пропорции текста изменились...
И нет, или очень трудно добратся до управления рисованием самого символа.  Приходится обратится к функции WinApi SetTextAlign. Но в КОL она  работает несколько иначе...
В VCL  при примениии флага TA_Bootom прыжок символа при мзменении фонта малозаметен.... В  KOL - ноль эмоций... Спас флаг TA_BaseLine
И таких мелочей много...


Ruzzz   (2010-02-07 05:46:00) [3]

Не знаю понял ли я вас, но вот код на си из одной моей проги:
    LOGFONT font = {0,};
    ::GetObject(GetCurrentObject(hdcMem, OBJ_FONT), sizeof(font), &font);
    font.lfUnderline = skinSettings.textFontItalic;
    font.lfWeight = (skinSettings.textFontBold) ? FW_BOLD : FW_NORMAL;
    font.lfHeight = -MulDiv(skinSettings.textFontSize, GetDeviceCaps(hdcMem, LOGPIXELSY), 72);
    font.lfWidth = 0;
    StringCchCopy(font.lfFaceName, 32, skinSettings.textFontName);
    HFONT oldFont = (HFONT)::SelectObject(hdcMem, ::CreateFontIndirect(&font));

Может он как-то поможет разобраться с размерами шрифтов. Попробуйте поиск по font.lfHeight = -MulDiv(, GetDeviceCaps(hdcMem, LOGPIXELSY), 72)


Lirrk   (2010-02-06 21:12:00) [4]

И ещё один момент...
не работает функция SetTextAlign
То есть я опять же не могу выравнить текст... по нижне линии.
В VCL работает. Проверил.


Наверх

Титульная страница Поиск, карта сайта Написать письмо