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

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

Как узнат содержит ли шрифт символы определенной кодовой страницы [D7, WinXP]


Циркуль ©   (2010-05-28 22:52:00) 

В системе установлен шрифт "EanP36Tt", используется для печати штрихкода. Если поглядеть его свойства в диалоге выбора шрифта то видно, что он содержит только одну кодовую страницу - западноевропейскую. Так вот, как в этом убедиться "программно"?

Нагуглил GDI-ную функцию GetGlyphIndices.

Наваял тест...


 function IsFontHaveRussianGlifs(AFont: TFont): Boolean; overload;
 function IsFontHaveRussianGlifs(AFontName: string): Boolean; overload;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.btn1Click(Sender: TObject);

 function CheckFont(AFontName: string): string;
 const
   Arr: array [Boolean] of string = ('НЕ ', '');
 begin
   Result := Format('Шрифт "%s" %sподдерживает русскую кодировку', [AFontName, Arr[IsFontHaveRussianGlifs(AFontName)]]);
 end;

begin
 Caption := CheckFont('EanP36Tt') + ' ||| ' + CheckFont('Arial')
end;

function IsFontHaveRussianGlifs(AFontName: string): Boolean;
var
 F: TFont;
begin
 F := TFont.Create;
 try
   F.Name := AFontName;
   Result := IsFontHaveRussianGlifs(F);
 finally
   F.Free;
 end;
end;

function IsFontHaveRussianGlifs(AFont: TFont): Boolean;
var
 b: Byte;
 DC: HDC;
 oldFont: HFONT;
 Res: Cardinal;
begin
 DC := GetDC(0);
 oldFont := SelectObject(DC, AFont.Handle);
 try
   Res := GetGlyphIndicesA(DC, 'Ж', 1, @b, GGI_MARK_NONEXISTING_GLYPHS);
   Result := Res <> GDI_ERROR;
   Result := Result and (b <> 255);
 finally
   SelectObject(DC, oldFont);
 end;
end;


И для Arial и для EanP36Tt показывает, что с русским чарсетом у обоих все в порядке, хотя на самом деле это не так. Если создать TFont у которого Name = 'EanP36Tt', Charset = RUSSIAN_CHARSET - рисовать таким шрифтом будет не штрихкод,а сами символы, а если поменять на Charset = DEFAULT_CHARSET - будет рисовать штрихкод.


Циркуль   (2010-05-29 22:33:00) [1]

А, хотя, пардон! Ваша трактовка Писания, пожалуй, вернее. :)

Но все равно результат не тот :(


Циркуль   (2010-05-29 22:26:00) [2]

Угу, только "GetGlyphIndicesA", судя по отладчику, возвращает "1". И, если верить Писанию, то это количество байт и должна занимать переменная "b". Опять же, судя по отладчику, "b" содержит число "64".

Все равно спасибо за ответ :)


0x00FF00   (2010-05-29 00:16:00) [3]

...и если в bпо окончании работы GetGlyphIndicesA лежит заветный $FFFF, то можно считать, что символы кириллицы не поддерживаются.


0x00FF00   (2010-05-29 00:12:00) [4]

Похоже, что
 Result := Res <> GDI_ERROR;
следует заменить на
 Result := Res = 1;

Ибо сказано в Писании:
> If the function succeeds, it returns the number of bytes (for the ANSI function)
> or WORDs (for the Unicode function) converted.
> GGI_MARK_NONEXISTING_GLYPHS Marks unsupported glyphs with the hexadecimal value 0xffff.
http://msdn.microsoft.com/en-us/library/dd144890(VS.85).aspx

И, да, bдолжна быть двухбайтной.


Наверх

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