![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как узнат содержит ли шрифт символы определенной кодовой страницы [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должна быть двухбайтной.