Два вопроса по шрифтам
Модератор: Дед Пахом
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Два вопроса по шрифтам
Clarion 6(ABC)
Заранее благодарен за ответ.
У меня два вопроса по шрифтам.
1. На основе Arial cоздал свой шрифт под собственные нужды (заменил неиспользованные символы на всякие спецсимволы).
Все хорошо работает, если по науке добавляю свой шрифт в Винду через панель управления.
Но если из своей программы копирую файл шрифта в папку %RootSystem%/Fonts и добавляю сведения о нем в реестр ([HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts]
"MPC Обычный (TrueType)"="MRC_.ttf") - никакого эффекта. Что Винде еще нужно добавить?, где она еще прописывает или регистрирует фонты?
2.Использую свой шрифт в отчетах без предварительного просмотра. А как бы узнать реальную ширину на бумаге выводимой True Type-ской строки? - я сделал так: снял метрику (Studio 5 от FontLab) со своего фонта размера 10 (каждый символ с 32 до 254 имеет свою условную ширину), создал массив условных ширин символов и с поправкой на размер шрифта и с учетом реальной ширины при печати (100 символов подчеркивания + линейка/100) сформировал массив реальных ширин символов. Этот массив реальных ширин использую в форме при наборе строки.
Процент попадания - примерно 95%.
Вопрос - я делаю через задницу или можно как-то красивее?
Заранее благодарен за ответ.
У меня два вопроса по шрифтам.
1. На основе Arial cоздал свой шрифт под собственные нужды (заменил неиспользованные символы на всякие спецсимволы).
Все хорошо работает, если по науке добавляю свой шрифт в Винду через панель управления.
Но если из своей программы копирую файл шрифта в папку %RootSystem%/Fonts и добавляю сведения о нем в реестр ([HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts]
"MPC Обычный (TrueType)"="MRC_.ttf") - никакого эффекта. Что Винде еще нужно добавить?, где она еще прописывает или регистрирует фонты?
2.Использую свой шрифт в отчетах без предварительного просмотра. А как бы узнать реальную ширину на бумаге выводимой True Type-ской строки? - я сделал так: снял метрику (Studio 5 от FontLab) со своего фонта размера 10 (каждый символ с 32 до 254 имеет свою условную ширину), создал массив условных ширин символов и с поправкой на размер шрифта и с учетом реальной ширины при печати (100 символов подчеркивания + линейка/100) сформировал массив реальных ширин символов. Этот массив реальных ширин использую в форме при наборе строки.
Процент попадания - примерно 95%.
Вопрос - я делаю через задницу или можно как-то красивее?
Всем пралитарское Спасибо и 'Желаю, чтобы ВСЕ !!!'
- StillZero
- Ветеран
- Сообщения: 458
- Зарегистрирован: 06 Июль 2005, 2:17
- Откуда: Хабаровск
- Поблагодарили: 1 раз
- Контактная информация:
Re: Два вопроса по шрифтам
по части вопроса №2...
я измеряю текст, юзая WinAPI, примерно так, код правлен, см. суть
я измеряю текст, юзая WinAPI, примерно так, код правлен, см. суть
Код: Выделить всё
loc:hDC ULONG
mem:hDC ULONG
loc:cstrTmp &CSTRING
loc:hFont ULONG
loc:hPrevFont ULONG
loc:strRect LIKE(CFC_RECT)
loc:strSize GROUP(CFC_SIZESTRUCT).
CODE
! CurrItem.Text - исходный текст
loc:cstrTmp &= NEW CSTRING(LEN(CLIP(CurrItem.Text)) + 1)
loc:cstrTmp = CLIP(CurrItem.Text)
! hWnd - окно куда может быть выведен текст
loc:hDC = CFC_GetDC(hWnd)
mem:hDC = CFC_CreateCompatibleDC(loc:hDC)
IF mem:hDC
loc:hFont = CurrItem.Menu.Comctrl.RetrieveSystemMenuFont() ! получения хэндла шрифта, который надо измерять
loc:hPrevFont = CFC_SelectObject(mem:hDC,loc:hFont)
CFC_SetTextCharacterExtra(mem:hDC,0)
IF CFC_DrawText(mem:hDC,ADDRESS(loc:cstrTmp),LEN(loc:cstrTmp),ADDRESS(loc:strRect),CFC_DT_SINGLELINE + CFC_DT_VCENTER + CFC_DT_EXPANDTABS + CFC_DT_CALCRECT)
loc:strSize.cx = ABS(loc:strRect.right - loc:strRect.left)
loc:strSize.cy = ABS(loc:strRect.bottom - loc:strRect.top)
ELSE
CFC_GetTextExtentPoint32(mem:hDC,ADDRESS(loc:cstrTmp),LEN(CLIP(loc:cstrTmp)),ADDRESS(loc:strSize))
END
Err# = CFC_SelectObject(mem:hDC,loc:hPrevFont)
Err# = CFC_DeleteObject(loc:hFont)
Err# = CFC_DeleteDC(mem:hDC)
END
CFC_ReleaseDC(hWnd,loc:hDC)
DISPOSE(loc:cstrTmp)
по аэродрому...
- Admin
- Администратор
- Сообщения: 4010
- Зарегистрирован: 05 Июль 2005, 15:59
- Откуда: Хабаровск
- Благодарил (а): 53 раза
- Поблагодарили: 33 раза
- Контактная информация:
Re: Два вопроса по шрифтам
Зачем все эти телодвижения если есть Windows API функция AddFontResource - грузит файл со шрифтом с любого места.muskin писал(а): Но если из своей программы копирую файл шрифта в папку %RootSystem%/Fonts и добавляю сведения о нем в реестр ([HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts]
"MPC Обычный (TrueType)"="MRC_.ttf") - никакого эффекта. Что Винде еще нужно добавить?, где она еще прописывает или регистрирует фонты?
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Re: Два вопроса по шрифтам
По первому вопросу помимо API можно просто ставить шрифт во время setup (все инсталлеры имеют такие функции).
По второму вопросу - видимо можно посоветовать использовать равноширинный шрифт (он один кажись Куриер) в остальных вариантах ширина выводимых строка будет разной (это зависит от набора символов в строке).
Может еще кто чего добавит.
По второму вопросу - видимо можно посоветовать использовать равноширинный шрифт (он один кажись Куриер) в остальных вариантах ширина выводимых строка будет разной (это зависит от набора символов в строке).
Может еще кто чего добавит.
- morkovin
- Ветеран
- Сообщения: 935
- Зарегистрирован: 20 Июль 2005, 14:53
- Откуда: Volgograd, Russia
- Благодарил (а): 9 раз
- Поблагодарили: 4 раза
- Контактная информация:
Re: Два вопроса по шрифтам
Загрузка шрифтов была подробно описана в ClaMag (сейчас нет под рукой и не вспомнить) . Вот вырезка из TXAНо если из своей программы копирую файл шрифта в папку %RootSystem%/Fonts и добавляю сведения о нем в реестр ([HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts]
"MPC Обычный (TrueType)"="MRC_.ttf") - никакого эффекта. Что Винде еще нужно добавить?, где она еще прописывает или регистрирует фонты?
EMBED %ProcedureSetup
[DEFINITION]
[SOURCE]
PROPERTY:BEGIN
PRIORITY 4000
PROPERTY:END
FONT_N = 'Vampire_TTF' !LOAD FIRST FONT
if instring('WINDOWS XP',upper(clip(SYSTEM{PROP:WindowsVersion})),1) ! WINDOWS XP?
DO LOAD_FNT !
END
PROPERTY:END
!!! и сама процедура
LOAD_FNT ROUTINE
RES_HANDLE = FINDRESOURCE(SYSTEM{PROP:APPINSTANCE},ADDRESS(FONT_N),ADDRESS(RES_TYPE))
HGLOBALMEM = LOADRESOURCE(SYSTEM{PROP:APPINSTANCE},RES_HANDLE)
FONT_SIZE = SIZEOFRESOURCE(SYSTEM{PROP:APPINSTANCE},RES_HANDLE)
FONT_HANDLE = AddFontMemResourceExHGLOBALMEM,FONT_SIZE,0,ADDRESSFONT_COUNT))
FONT_COUNT += 1
Вобщем все сделано по ClaMag
WBR, morkovin
Re: Два вопроса по шрифтам
Спасибо еще раз.
Анализирую подскаЗки.
AddFontResource(*LPCSTR),SIGNED,PASCAL,RAW,NAME('AddFontResourceA')
А LPCSTR в Clarion-e это CSTRING?
Вызов функции - и тут же ругательства на неправильное использование параметра функции.
А какой ей нужно подсунуть указатель и на что? (подсовывал адрес строковой переменной, содержащей путь фонта - никакого эфекта).
Анализирую подскаЗки.
AddFontResource(*LPCSTR),SIGNED,PASCAL,RAW,NAME('AddFontResourceA')
А LPCSTR в Clarion-e это CSTRING?
Вызов функции - и тут же ругательства на неправильное использование параметра функции.
А какой ей нужно подсунуть указатель и на что? (подсовывал адрес строковой переменной, содержащей путь фонта - никакого эфекта).
Всем пралитарское Спасибо и 'Желаю, чтобы ВСЕ !!!'
- WadimZapara
- Активист
- Сообщения: 181
- Зарегистрирован: 11 Июнь 2008, 12:11
- Откуда: Тамбов
Re: Два вопроса по шрифтам
Из описания в MSDN следует:
1) твоё объявление верное: AddFontResource(*CString FontFileName),SIGNED,PASCAL,RAW,NAME('AddFontResourceA')
2) возвращает 0 при неудаче или зарегистрированный номер шрифта
3) в параметре FontFileName должно содержаться правильное имя файла (с путём) фонта с одим из следующих расширений: .fon, .fnt, .ttf, .ttc, .fot, .otf, .mmm, или (.pfm и .pfb)
4) для последней варианта - пары файлов - строка должна быть типа 'abcxxxxx.pfm|abcxxxxx.pfb'
5) функция AddFontResource регистрирует шрифт только для текущей сессии до перезагрузки (для полной установки - требуется шрифт перечислить в реестре)
6) когда ваш шрифт вам более не нужен - необходимо его выгрузить вызовом RemoveFontResource(FontFileName)
7) ваше приложение после успешного вызова обеих этих функций должно вызывать SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0), чтобы сообщить другим окнам системы о том, что произошли изменения со шрифтами.
прототип: SendMessage(UnSigned hWnd, ULong Msg, Signed wParam, Signed lParam), Long, Pascal, Name('SendMessageA')
HWND_BROADCAST EQUATE(0FFFFh)
WM_FONTCHANGE EQUATE(01Dh)
Примечание: подозреваю, что "правильное имя файла" - означает: либо без пробелов, либо окружённое кавычками.
1) твоё объявление верное: AddFontResource(*CString FontFileName),SIGNED,PASCAL,RAW,NAME('AddFontResourceA')
2) возвращает 0 при неудаче или зарегистрированный номер шрифта
3) в параметре FontFileName должно содержаться правильное имя файла (с путём) фонта с одим из следующих расширений: .fon, .fnt, .ttf, .ttc, .fot, .otf, .mmm, или (.pfm и .pfb)
4) для последней варианта - пары файлов - строка должна быть типа 'abcxxxxx.pfm|abcxxxxx.pfb'
5) функция AddFontResource регистрирует шрифт только для текущей сессии до перезагрузки (для полной установки - требуется шрифт перечислить в реестре)
6) когда ваш шрифт вам более не нужен - необходимо его выгрузить вызовом RemoveFontResource(FontFileName)
7) ваше приложение после успешного вызова обеих этих функций должно вызывать SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0), чтобы сообщить другим окнам системы о том, что произошли изменения со шрифтами.
прототип: SendMessage(UnSigned hWnd, ULong Msg, Signed wParam, Signed lParam), Long, Pascal, Name('SendMessageA')
HWND_BROADCAST EQUATE(0FFFFh)
WM_FONTCHANGE EQUATE(01Dh)
Примечание: подозреваю, что "правильное имя файла" - означает: либо без пробелов, либо окружённое кавычками.
Компьютер имеет то преимущество перед мозгом, что им пользуются...
Re: Два вопроса по шрифтам
Это в начале:
map
module('win32.lib')
GetEnvironmentVar(*CSTRING,*CSTRING,ULONG),ULONG,PASCAL,RAW,NAME('GetEnvironmentVariableA')
AddFontResource(*LPCSTR),SIGNED,PASCAL,RAW,NAME('AddFontResourceA')
. .
Потом объявляю переменную font_path как CSTRING, а при компиляции Clarion указывает ошибку на используемый параметр.
Подскажите, что я не так делаю? - код представлен ниже
font_path='C:\Sertif\Font\MRC_.ttf'
ret#=AddFontResource(*font_path)
P.S. Был вопрос по поводу получения системной переменной из GetEnvironmentVar. Я в своей программе не указываю адресов, а просто подсовываю переменные, а не адреса - GetEnvironmentVar(имя системной переменной, имя переменной-приемника, 1024 на длину) - и все работает.
В мое случае может тоже что-то не так?
map
module('win32.lib')
GetEnvironmentVar(*CSTRING,*CSTRING,ULONG),ULONG,PASCAL,RAW,NAME('GetEnvironmentVariableA')
AddFontResource(*LPCSTR),SIGNED,PASCAL,RAW,NAME('AddFontResourceA')
. .
Потом объявляю переменную font_path как CSTRING, а при компиляции Clarion указывает ошибку на используемый параметр.
Подскажите, что я не так делаю? - код представлен ниже
font_path='C:\Sertif\Font\MRC_.ttf'
ret#=AddFontResource(*font_path)
P.S. Был вопрос по поводу получения системной переменной из GetEnvironmentVar. Я в своей программе не указываю адресов, а просто подсовываю переменные, а не адреса - GetEnvironmentVar(имя системной переменной, имя переменной-приемника, 1024 на длину) - и все работает.
В мое случае может тоже что-то не так?
Всем пралитарское Спасибо и 'Желаю, чтобы ВСЕ !!!'
- Admin
- Администратор
- Сообщения: 4010
- Зарегистрирован: 05 Июль 2005, 15:59
- Откуда: Хабаровск
- Благодарил (а): 53 раза
- Поблагодарили: 33 раза
- Контактная информация:
Re: Два вопроса по шрифтам
Код: Выделить всё
AddFontResource(*CSTRING FontName),RAW,LONG,PASCAL,NAME('AddFontResourceA')
...
FontFileName CSTRING(200)
...
FontFileName = '.\TTF\MONOCD.TTF'
...
IF NOT AddFontResource(FontFileName)
MESSAGE('Не смогли установить шрифт: MonoCondencedDI','Внимание',ICON:Asterisk)
END
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Re: Два вопроса по шрифтам
Но не работает AddFontResource с параметром *CSTRING!!!
Указывает на параметр - неправильное использование параметра, скобок и т.д....
Реально, а не теоретически, кто-нибудь использовал эту функцию?
Указывает на параметр - неправильное использование параметра, скобок и т.д....
Реально, а не теоретически, кто-нибудь использовал эту функцию?
Всем пралитарское Спасибо и 'Желаю, чтобы ВСЕ !!!'
- Дед Пахом
- Старичок
- Сообщения: 3290
- Зарегистрирован: 07 Июль 2005, 16:51
- Откуда: Москва, Россия
- Благодарил (а): 15 раз
- Поблагодарили: 49 раз
- Контактная информация:
Re: Два вопроса по шрифтам
Ну посмотрите на декларацию типа LPCSTR, он же LONG, что же Вы суёте туда CSTRING?
С уважением, ДП
- Admin
- Администратор
- Сообщения: 4010
- Зарегистрирован: 05 Июль 2005, 15:59
- Откуда: Хабаровск
- Благодарил (а): 53 раза
- Поблагодарили: 33 раза
- Контактная информация:
Re: Два вопроса по шрифтам
Да что вы говорите... У меня наверное Windows другойmuskin писал(а):Но не работает AddFontResource с параметром *CSTRING!!!
Указывает на параметр - неправильное использование параметра, скобок и т.д....
Реально, а не теоретически, кто-нибудь использовал эту функцию?

Ниже в треде я привел пример реального кода.
В данный пост вставил пример. Все работает.
- Вложения
-
- addfontresource_demo.zip
- AddFontResource Demo source
- (12.09 КБ) 245 скачиваний
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
- Admin
- Администратор
- Сообщения: 4010
- Зарегистрирован: 05 Июль 2005, 15:59
- Откуда: Хабаровск
- Благодарил (а): 53 раза
- Поблагодарили: 33 раза
- Контактная информация:
Re: Два вопроса по шрифтам
Заблуждение... Все зависит от декларации функции.Дед Пахом писал(а):Ну посмотрите на декларацию типа LPCSTR, он же LONG, что же Вы суёте туда CSTRING?
Код: Выделить всё
AddFontResource(*CSTRING FontName),RAW,LONG,PASCAL,NAME('AddFontResourceA')
...
FontFileName CSTRING(200)
...
AddFontResource(FontFileName)
Код: Выделить всё
AddFontResource(LONG FontName),RAW,LONG,PASCAL,NAME('AddFontResourceA')
...
FontFileName CSTRING(200)
...
AddFontResource(ADDRESS(FontFileName))
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
- Admin
- Администратор
- Сообщения: 4010
- Зарегистрирован: 05 Июль 2005, 15:59
- Откуда: Хабаровск
- Благодарил (а): 53 раза
- Поблагодарили: 33 раза
- Контактная информация:
Re: Два вопроса по шрифтам
Предыдущий ответ больше относится к юзеру muskin а не к тебеДед Пахом писал(а):Ну посмотрите на декларацию типа LPCSTR, он же LONG, что же Вы суёте туда CSTRING?

Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Re: Два вопроса по шрифтам
Спасибо Админу за вразумление.
При описании прототипа AddFontResource(*LPSTRING),SIGNED,PASCAL,RAW,NAME('AddFontResourceA')(откуда я взял это описание - не знаю) заменил *LPString на *CString - все заработало, шрифт загружается только на время загрузки программы. Это меня полностью устраивает.
Спасибо всем.
При описании прототипа AddFontResource(*LPSTRING),SIGNED,PASCAL,RAW,NAME('AddFontResourceA')(откуда я взял это описание - не знаю) заменил *LPString на *CString - все заработало, шрифт загружается только на время загрузки программы. Это меня полностью устраивает.
Спасибо всем.
Всем пралитарское Спасибо и 'Желаю, чтобы ВСЕ !!!'