Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Узнать, присутствуют ли символы в шрифте, Есть ли символ A в выбранном шрифте 
V
    Опции темы
fridkaratel
Дата 21.12.2008, 20:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 221
Регистрация: 22.10.2007
Где: Error connect to MySQL Da...

Репутация: нет
Всего: нет



Необходимо отсеить список системных шрифтов...
Если в шрифте есть введенный пользователем символ, то шрифт заносится в список.

Необходимо, чтобы при выводе на канву текста, не получалось что-то типа ?????????.

Текст вывожу так:
Код

slFonts->Items = Screen->Fonts;

Graphics::TBitmap* bn = new Graphics::TBitmap();
bn->Width = 128;
bn->Height = 128;
bn->Canvas->Brush->Color = clBlack;
bn->Canvas->Font->Name = slFonts->Items->Strings[slFonts->ItemIndex];
bn->Canvas->Font->PixelsPerInch = 72;
bn->Canvas->Font->Size = 14;
bn->Canvas->TextOut(0, 0, "Пример текста");


Это сообщение отредактировал(а) fridkaratel - 21.12.2008, 20:18
PM   Вверх
fridkaratel
Дата 22.12.2008, 21:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 221
Регистрация: 22.10.2007
Где: Error connect to MySQL Da...

Репутация: нет
Всего: нет



Нашел кое-какую информацию по интересующему вопросу, но вот понять не могу, что к чему:
http://www.rsdn.ru/Forum/message/2951858.all.aspx
PM   Вверх
GremlinProg
Дата 23.12.2008, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



fridkaratel, там вроде бы все понятно расписано
GetGlyphIndices - как раз то, что тебе нужно, просто основное обсуждение там вокруг "битых" шрифтов, поэтому суть немного упущена:
Цитата(MSDN GetGlyphIndices)

The GetGlyphIndices function translates a string into an array of glyph indices. The function can be used to determine whether a glyph exists in a font.

DWORD GetGlyphIndices(
  HDC hdc,       // handle to DC
  LPCTSTR lpstr, // string to convert
  int c,         // number of characters in string
  LPWORD pgi,    // array of glyph indices
  DWORD fl       // glyph options
);


Код

WORD glyph;
HDC hdc = ::GetDC(HWND_DESKTOP);
hFont = ::SelectObject(hdc,hFont);
if(!::GetGlyphIndices(hdc,_T("ж"),1,&glyph,GGI_MARK_NONEXISTING_GLYPHS)){
  glyph = 0xffff;
}
hFont = ::SelectObject(hdc,hFont);
::ReleaseDC(HWND_DESKTOP,hdc);
if(glyph != 0xffff){
  // 'ж' - присутствует в шрифте hFont
}else{
  // 'ж' - отсутствует в шрифте hFont
}

вот и все, hFont - дескриптор шрифта, который нужно проверить, проверяется, конечно символ 'ж', можно сразу строки проверять, ну тут все очевидно, думаю, разберешься

PS: интересный наборчик API с глифами, надо будет поковырять на досуге )


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
fridkaratel
Дата 27.12.2008, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 221
Регистрация: 22.10.2007
Где: Error connect to MySQL Da...

Репутация: нет
Всего: нет



//hFont = ::SelectObject(hdc,hFont);

Вот здесь немного не понял...
hFont - это HFONT hFont;
Так?

Назначаю hFont как bn->Canvas->Font, но результата ноль... Что-то я не так делаю...
Что указывать в качестве hFont?
PM   Вверх
GremlinProg
Дата 27.12.2008, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(fridkaratel @  27.12.2008,  12:48 Найти цитируемый пост)
Что указывать в качестве hFont?

любой дескриптор HFONT
Цитата

void check(HFONT my_font_handle){
    WORD glyph;
    HGDIOBJ hFont = (HGDIOBJ)my_font_handle;
    HDC hdc = ::GetDC(HWND_DESKTOP);
    hFont = ::SelectObject(hdc,hFont);
    if(!::GetGlyphIndices(hdc,_T("ж"),1,&glyph,GGI_MARK_NONEXISTING_GLYPHS)){
   glyph = 0xffff;
    }
    hFont = ::SelectObject(hdc,hFont);
    ::ReleaseDC(HWND_DESKTOP,hdc);
    if(glyph != 0xffff){
   // 'ж' - присутствует в шрифте hFont
    }else{
   // 'ж' - отсутствует в шрифте hFont
    }
}

hFont типа HGDIOBJ здесь используется только для того, чтобы уменьшить число преобразований типов, просто для наглядности

если использовать  API, то my_font_handle - любой дескриптор, возвращаемый функциями CreateFont, CreateFontInDirect и т.п.


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
fridkaratel
Дата 27.12.2008, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 221
Регистрация: 22.10.2007
Где: Error connect to MySQL Da...

Репутация: нет
Всего: нет



Почему-то компилятор ругается на _T("ж")...
Откуда _T, для чего оно необходимо и что необходимо подключить?

И еще такой вопросик - как проверить юникод-символ, например тот же "ж", но 0x0416?

Это сообщение отредактировал(а) fridkaratel - 27.12.2008, 17:47
PM   Вверх
GremlinProg
Дата 28.12.2008, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(fridkaratel @  27.12.2008,  18:53 Найти цитируемый пост)
Почему-то компилятор ругается на _T("ж")...

в MSVC - это tchar.h
для поддержки unicode-приложений
Цитата(fridkaratel @  27.12.2008,  18:53 Найти цитируемый пост)
как проверить юникод-символ

подключить tchar.h, использовать _T и _TCHAR и поставить в настройках проекта Unicode Character Set
либо использовать соответствующий юникод-близнец: GetGlyphIndicesW

Модератор: уважаемые участники, просьба найти хорошо читаемые топики в разделе на тему MBS и WCS, чтобы ее можно было закрепить в начале форума, тема должна решать этот вопрос либо в первом посту, либо в первых трех.
Пишите либо мне в PM либо в любым постом в ps



--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0731 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.