Конференция "WinAPI" » Как узнат содержит ли шрифт символы определенной кодовой страницы [D7, WinXP]
 
  • Циркуль (28.05.10 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 (29.05.10 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 (29.05.10 00:16) [2]
    ...и если в b по окончании работы GetGlyphIndicesA лежит заветный $FFFF, то можно считать, что символы кириллицы не поддерживаются.
  • Циркуль (29.05.10 22:26) [3]
    Угу, только "GetGlyphIndicesA", судя по отладчику, возвращает "1". И, если верить Писанию, то это количество байт и должна занимать переменная "b". Опять же, судя по отладчику, "b" содержит число "64".

    Все равно спасибо за ответ :)
  • Циркуль (29.05.10 22:33) [4]
    А, хотя, пардон! Ваша трактовка Писания, пожалуй, вернее. :)

    Но все равно результат не тот :(
 
Конференция "WinAPI" » Как узнат содержит ли шрифт символы определенной кодовой страницы [D7, WinXP]
Есть новые Нет новых   [134431   +15][b:0][p:0.001]