· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› Не создать несуществующего

. 1 . 2 . >>

Посл.отвђт Сообщенiе


Дата: Окт 29, 2003 04:01:17

...фонта? Проблема: не могу узнать, инсталлирован ли фонт в системе? CreateFontIndirect при запросе на несуществующий шрифт просто создает какой ей больше нравится и ничего не сообщает о принятом решении. Вот узнать бы, и если такого шрифта нет, создать по своему усмотрению.


Дата: Окт 29, 2003 04:06:16 · Поправил: Quantum

Вот узнать бы, и если такого шрифта нет, создать по своему усмотрению.
Не создать, а носить с собой, т.е. с инсталлером. Кажись, популярные инсталлеры поддерживают такую фичу. Ещё есть возможность хранить фонт в ресурсах и при каждом старте устанавливать в систему, но это не красиво, IMHO.

ЗЫ: Inno Setup поддерживает установку шрифтов. Уже проверил.


Дата: Окт 29, 2003 04:59:53

Не, я имел в виду создать какой-нибудь другой шрифт. Инсталлировать вместе с прогой - нехорошо. Может, юзер не хочет новых шрифтов, а тут такая пакость :) Надо только принять решение, какой из, к примеру пяти шрифтов, из которых один - Arial(чтобы уж наверняка в системе был) создать. В приоритетном порядке. Первого нет, пробуем второй. Откопал какую-то EnumFontFamilies, но разобраться, как её юзать и подходит ли оно под мою задачу не могу. Там все не по-нашему почему-то пишут. Да в придачу SDK кишит дизайнерскими-фонтовыми дефинициями, так что разобраться в этих мелкософтовых определениях мне не светит.


Дата: Окт 29, 2003 09:45:30

hGoblin
Откопал какую-то EnumFontFamilies
Afaik правильное направление.

По каким критериям определять несуществование?


Дата: Окт 29, 2003 12:44:48

EnumFontFamilies and so on..


Дата: Окт 29, 2003 15:19:35

По каким критериям определять несуществование?
Критерий один - шрифт должен быть инсталлирован в системе. Иначе вся процедура создания проходит на ура, но отображается какая-нибудь Lucida Console(На усмотрение CreateFont). А как использовать EnumFontFamilies?, она вызывает мою процедуру, а я ума не приложу, что она (моя процедура) должна делать. И еще смущают формулировки из SDK:
EnumFontFamilies
If the function succeeds, the return value is the last value returned by the callback function
И
EnumFontFamProc
The return value must be a nonzero value to continue enumeration; to stop enumeration, it must return zero.


Дата: Окт 29, 2003 16:19:41

EnumFontFamiliesEx
The EnumFontFamiliesEx function enumerates all fonts in the system that match the font characteristics specified by the LOGFONT structure. EnumFontFamiliesEx enumerates fonts based on typeface name, character set, or both.
//to enumerate all styles and charsets of all fonts:
lf.lfFaceName[0] = '\0';
lf.lfCharSet = DEFAULT_CHARSET;
HRESULT hr;

//to enumerate all styles and character sets of the Arial font:
hr = StringCchCopy( (LPSTR)&lf.lfFaceName, 6, "Arial" );
if (FAILED(hr))
{
// TODO: write error handler
}

lf.lfCharSet = DEFAULT_CHARSET;

//to enumerate all styles of all fonts for the ANSI character set
lf.lfFaceName[0] = '\0';
lf.lfCharSet = ANSI_CHARSET;

//to enumerate all styles of Arial font that cover the ANSI charset
hr = StringCchCopy( (LPSTR)&lf.lfFaceName, 6, "Arial" );
if (FAILED(hr))
{
// TODO: write error handler
}
lf.lfCharSet = ANSI_CHARSET;


Дата: Окт 30, 2003 04:04:27

hGoblin
Критерий один - шрифт должен быть инсталлирован в системе
imo это не критерий - это требуемый результат.
Под критерием я понимаю, какие характеристики твоего и инсталлированных фонтов надо сравнивать, чтобы определиться с необходимостью инсталляции своего фонта.

If the function succeeds, the return value is the last value returned by the callback function
Как отличить succeeds от fail не знаю. Наверное, надо ориентироваться, на то что, если не ноль, то callback function потребовала прекратить перебор, если ноль, значит ни один из фонтов не удовлетворил callback function.

The return value must be a nonzero value to continue enumeration; to stop enumeration, it must return zero.
Это означает, что функция, заданная в качестве третьего параметра EnumFontFamilies, должна вернуть ноль если очередной фонт удовлетворяет каким-либо критериям и необходимо прекратить дальнейший перебор фонтов. Если всегда возвращать ноль, то windows, перебрав все фонты, завершит EnumFontFamilies, которая по идее должна вернуть 0 - value returned by the callback function.


Дата: Окт 30, 2003 05:02:52 · Поправил: hGoblin

q_q
Нр я не хочу инсталлировать свой фонт! Я хочу создать существующий. Наверное, я криво выражаюсь, но моя задача - создать GDI объект типа шрифт, причем создать один из своего списка, а CreateFont, если попросить Verdana, создаст Arial, когда в системе нет Verdana, и при этом подло умолчит о принятом решении. Мне же надо пропустить verdan'у и перейти к sans-serif. Вот если и его не окажется, тогда делать нечего, буду рисовать Arial'ом.
надо ориентироваться, на то что, если не ноль, то callback function потребовала прекратить перебор, если ноль, значит ни один из фонтов не удовлетворил callback function
Так EnumFontFamiliesEx когда возвращается? Я так понимаю, когда callback вернет ноль, требуя прекратить засыпать её информацией. Значит, EnumFontFamiliesEx будет всегда возвращать нулевое значение, тогда какой вообще смысл что-либо возвращать?
rst
Так мне будут листать все фонты с этими charset'ами, и callback все их будет посмотреть?!?? Ох, а другого пути нет?, спросить как-нибудь, "А нет ли у вас такого вот фонта?". А то искать свой среди 250 существующих - имхо верх безумия. Тем более что при провале придется повторить процедуру для фонта из моего списка с меньшим приоритетом.


Дата: Окт 30, 2003 05:11:03

hGoblin
Через EnumFontFamilies как раз и получается установить наличие/отсутствие определённого шрифта. rst
уже и пример привёл.

ЗЫ: IMHO, если тонко настроить (подобрать) параметры CreateFont, то можно обойтись и без EnumFontFamilies.


Дата: Окт 30, 2003 05:17:01

Quantum
А как это - "тонко"? Мне нужно определенное семейство, а "тонкая" подборка параметров даст только шрифт, максимально подходящий под требуемый, но не сам требуемый


Дата: Окт 30, 2003 06:51:39 · Поправил: q_q

hGoblin
Нр я не хочу инсталлировать свой фонт!
Разве я где-то упоминал, _надо_ инсталлировать.

В конце-концов скажи четко и ясно, как бы ты не программным путем определил, есть фонт или нет?

... EnumFontFamiliesEx ... Я так понимаю ...
Не правильно понимаешь.
EnumFontFamilies[Ex] может завершится корректно по двум причинам:
1) wind'а вызвала callback function для всех шрифтов и она (cf) возвращала в wind'у не ноль;
2) wind'а передала очередной фонт в callback function и она (cf) вернула в wind'у ноль.


Дата: Окт 30, 2003 14:57:22

q_q
как бы ты не программным путем определил, есть фонт или нет?
Листал бы, наверное... Но ведь и наличие файла я тоже определяю листая каталог. В общем я надеялся на фишку как с CreateFile. То есть при попытке создания фонта получить что-нибудь вроде ERROR_NO_EXIST и радоваться жизни. Но, видно не судьба. Спасибо за помощь, ребята. Буду безумствовать :) По крайней мере как листать фонты я теперь знаю.


Дата: Окт 30, 2003 15:27:58

hGoblin
"тонкая" подборка параметров даст только шрифт, максимально подходящий под требуемый, но не сам требуемый
Значит требуемого и нет, imho
Если же есть, но не дает - значит - еще не тонко :)
Правда,геморрой может быть с разными версиями виндоса

Хотя... иногда проблему проще не создавать, чем решать. НО:
Опыт - это то, что мы чаще всего получаем, ожидая что-либо другое


Дата: Окт 30, 2003 17:51:43

Можно попробовать сделать небольшое исследование. Создаём шрифт какой требуется по имени, например: "Haettenschweiler". Это вызов обычного CreateFontIndirect(). Естественно, получаем назад HFONT. А потом спрашиваем что это за шрифт - вызывая GetObject(). GetObject() API должна заполнить структуру LOGFONT. И там должно находиться реальное имя шрифта для этого HFONT-а.

. 1 . 2 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.156