Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
15-1431703136
Дмитрий С
2015-05-15 18:18
2016.01.17
Оптимизирует ли СУБД и клиент передачу данных?


1-1308744650
Сергей
2011-06-22 16:10
2016.01.17
QuickReport


2-1404704180
Sw
2014-07-07 07:36
2016.01.17
Cоздать процедуру в базе interbase через delphi


15-1431844499
Pavelnk
2015-05-17 09:34
2016.01.17
Моя поделка)


11-1260264285
Dy1
2009-12-08 12:24
2016.01.17
несколько перегруженных ф-ий новичкам





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский