Форум: "WinAPI";
Текущий архив: 2016.01.17;
Скачать: [xml.tar.bz2];
ВнизКак узнат содержит ли шрифт символы определенной кодовой страницы Найти похожие ветки
← →
Циркуль (2010-05-28 22:52) [0]В системе установлен шрифт "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 - будет рисовать штрихкод.
← →
0x00FF00 (2010-05-29 00:12) [1]Похоже, что
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 должна быть двухбайтной.
← →
0x00FF00 (2010-05-29 00:16) [2]...и если в b по окончании работы GetGlyphIndicesA лежит заветный $FFFF, то можно считать, что символы кириллицы не поддерживаются.
← →
Циркуль (2010-05-29 22:26) [3]Угу, только "GetGlyphIndicesA", судя по отладчику, возвращает "1". И, если верить Писанию, то это количество байт и должна занимать переменная "b". Опять же, судя по отладчику, "b" содержит число "64".
Все равно спасибо за ответ :)
← →
Циркуль (2010-05-29 22:33) [4]А, хотя, пардон! Ваша трактовка Писания, пожалуй, вернее. :)
Но все равно результат не тот :(
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2016.01.17;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.001 c