Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2016.01.17;
Скачать: CL | DM;

Вниз

Как узнат содержит ли шрифт символы определенной кодовой страницы   Найти похожие ветки 

 
Циркуль   (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 вся ветка

Текущий архив: 2016.01.17;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.004 c
15-1431865792
Pavelnk
2015-05-17 15:29
2016.01.17
Интерактивная карта ветров


15-1431703136
Дмитрий С
2015-05-15 18:18
2016.01.17
Оптимизирует ли СУБД и клиент передачу данных?


15-1431933898
Pavia
2015-05-18 10:24
2016.01.17
Зловред в овечей шкере


15-1431625439
кгшзх
2015-05-14 20:43
2016.01.17
зависимость g от широты


15-1431344437
Кто б сомневался
2015-05-11 14:40
2016.01.17
Когда программа бесплатная, но с ограниченным функционалом