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

Вниз

прошу помогите с фонтами. думаю об этом и статьу можна написать   Найти похожие ветки 

 
nika_ufc ©   (2004-08-21 03:49) [0]

Здравствуйте. Подскажите как можно извлечь информацию из фонта ?
очень долго мучился, искал и наконец написал программу которая определяет какие CharSet поддерживает фонт.

вот этот код:

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;

type
 TForm1 = class(TForm)
   Memo1: TMemo;
   ComboBox1: TComboBox;
   procedure ComboBox1Change(Sender: TObject);
   procedure FormCreate(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

 type
 TNewTextMetricEx = packed record
   NewTextMetric: TNewTextMetric;
   FontSignature: TFontSignature
 end;

 TCharSetRec = packed record
   Name: string;
   ID: Integer
 end;
const
 NumCharSets = 19;

 CharSets: array[0..NumCharSets - 1] of TCharSetRec = ((Name: "ANSI_CHARSET"; ID: 0),
   (Name: "DEFAULT_CHARSET"; ID: 1),
   (Name: "SYMBOL_CHARSET"; ID: 2),
   (Name: "SHIFTJIS_CHARSET"; ID: $80),
   (Name: "HANGEUL_CHARSET"; ID: 129),
   (Name: "GB2312_CHARSET"; ID: 134),
   (Name: "CHINESEBIG5_CHARSET"; ID: 136),
   (Name: "OEM_CHARSET"; ID: 255),
   (Name: "JOHAB_CHARSET"; ID: 130),
   (Name: "HEBREW_CHARSET"; ID: 177),
   (Name: "ARABIC_CHARSET"; ID: 178),
   (Name: "GREEK_CHARSET"; ID: 161),
   (Name: "TURKISH_CHARSET"; ID: 162),
   (Name: "VIETNAMESE_CHARSET"; ID: 163),
   (Name: "THAI_CHARSET"; ID: 222),
   (Name: "EASTEUROPE_CHARSET"; ID: 238),
   (Name: "RUSSIAN_CHARSET"; ID: 204),
   (Name: "MAC_CHARSET"; ID: 77),
   (Name: "BALTIC_CHARSET"; ID: 186));

var
 Form1: TForm1;

implementation

{$R *.dfm}

function EnumProc(const EnumLogFontEx: TEnumLogFontEx;
 const NewTextMetricEx: TNewTextMetricEx;
 FontType: Integer;
 Strings: TStrings): Integer; stdcall;
var
 I: Integer;
 ID: Integer;
 S: string;
begin
 ID := EnumLogFontEx.elfLogFont.lfCharSet;
 S  := Format("Unknown charset %d", [ID]);
 for I := 0 to NumCharSets - 1 do
   if CharSets[I].ID = ID then
   begin
     S := CharSets[I].Name;
     Break;
   end;
 Strings.Add(S);
 Result := 1
end;

procedure GetAvailableCharSets(const FaceName: string; CharSets: TStrings);
var
 DC: THandle;
 LogFont: TLogFont;
begin
 DC := GetDC(GetDesktopWindow);
 if DC <> 0 then
   try
     FillChar(LogFont, SizeOf(LogFont), 0);
     Move(FaceName[1], LogFont.lfFaceName, Length(FaceName));
     LogFont.lfCharSet := DEFAULT_CHARSET;
     EnumFontFamiliesEx(DC, LogFont, @EnumProc, lParam(CharSets), 0);
   finally
     ReleaseDC(GetDesktopWindow, DC)
   end
end;

procedure TForm1.ComboBox1Change(Sender: TObject);
begin
 Memo1.Clear;
 GetAvailableCharSets(ComboBox1.Text, Memo1.Lines);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
    ComboBox1.Items.Assign(Screen.Fonts);
end;

end.


сейчас я хочу:
1. узнать число символов в фонте.
2. является ли этот фонт Unicode или что то другое (ДОС, Unicode, ANSI ...)
3. и получить все Code Pages которые поддерживает указанный фонт.


Думаю, первую проблему можно легко решить если воспользуюсь GetFontUnicodeRanges это будет в полне

достатачно для определения числа символов в фонте. структура второго параметра GetFontUnicodeRanges:
typedef struct tagGLYPHSET {
DWORD cbThis;
DWORD flAccel;
DWORD cGlyphsSupported;
DWORD cRanges;
WCRANGE ranges[1];
} GLYPHSET, *PGLYPH
Вот об flAccel написано :Flags describing the maximum size of the glyph indices. и по моему это то что мне надо.
но из за того что ранше часто не работал с АПИ и тем более с фонтамы, я никак не могу написать правильный код.

Пишу вот так но не работает:

procedure TForm1.ListBox1Click(Sender: TObject);
var
 idx: integer;
 strFont: string;
 glp: PGLYPHSET;
begin
 idx := ListBox1.ItemIndex;
 if idx < 0 then exit;
 new(glp);
 getmem(glp, sizeof(PGLYPHSET));
 strFont := Listbox1.Canvas.font.Name;
 Listbox1.Canvas.font.Name := listbox1.Items[idx];
 GetFontUnicodeRanges(listbox1.Canvas.Handle, glp);
 Listbox1.Canvas.font.Name := strFont;
 Showmessage(intToStr(glp.cGlyphsSupported)+inttostr(glp.flAccel));
 dispose(glp); //выдает ACCESS VIOLATION
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
    ListBox1.Items.Assign(Screen.Fonts);
end;


допустим я исправил ошибку, вернет ли glp.flAccel или glp.cGlyphsSupported (про glp.cGlyphsSupported сказана -

"Total number of Unicode code points supported in the font.") число символов в фонте. не только Unicode но и все

остальные. если я ошибаюсь пожалуйста скажите как сделать.

Вторая прблема. Как решать не знаю и на ум толко GetFontUnicodeRanges приходит. А как использовать его не знаю.

помагите и здесь ПЛЗ.

на третем и закончим. Как узнать (програмно, разумеется) поддерживает *.ttf кириллицу или нет? но не толка

кириллицу но и все остальные Code Pages в зависимости от того этот фоннт являеться Unicode или АНСИ. см. Code

Pages:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/intl/unicode_63ub.asp

Знаю что на эту тему можна написать большую книгу, но будьте милосердны и помогите меня, объясните

пожалуйста досканалньо что делать, как решить каждую из проблем. Буду очень благодарен. а может и получиться

из этого отличная статья.

спасибо за помощ заранее.


 
TUser ©   (2004-08-21 08:22) [1]

См. в архиве.


 
nika_ufc ©   (2004-08-21 10:16) [2]

>>TUser ©
>>>См. в архиве
Уже сматрел, ничего интересного, ответы тем более. Здесь у меня конкретные проблемы и я прошу дать конкретные решения.
Спасибо за отклик.



Страницы: 1 вся ветка

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

Наверх




Память: 0.48 MB
Время: 0.034 c
1-1092842718
Relaxxx
2004-08-18 19:25
2004.09.05
Зависит ли скорость экспорта в Excel c Delphi от версии оффиса


4-1090315529
maguk
2004-07-20 13:25
2004.09.05
Вопрос по RichEdit 2.0


3-1092210206
Lika
2004-08-11 11:43
2004.09.05
Как составить оптимальный запрос?


4-1090677469
Керик
2004-07-24 17:57
2004.09.05
Права админа


14-1092804735
guest_Dmitry
2004-08-18 08:52
2004.09.05
Как реализовать вывод "р.", "$", в гриде?