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

Вниз

Как получить CharSet шрифта   Найти похожие ветки 

 
Alex_C ©   (2006-05-03 12:02) [0]

Допустим Courier"а. Нашел следующее:

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;

Все прекрасно работает, с одной проблемой: если в системе есть Courier и допустим Courier New, то в CharSets будет занесены charset для обохих шрифтов (в меня в сис-ме просто 2 раза пишет RUSSIAN_CHARSET, RUSSIAN_CHARSET). Как этого избежать? Т.е. чтобы было только для Courier"а?


 
TUser ©   (2006-05-03 13:00) [1]

Например

var EnumFlag: boolean;

function EnumProc(const EnumLogFontEx: TEnumLogFontEx;
...
begin
 if Flag then Exit;
 Flag := true;

...

Flag := false;
EnumFontFamiliesEx(DC, LogFont, @EnumProc, lParam(CharSets), 0);

Прим. Этот код потоконебезопасен, в многопоточных приложения следует использовать Critical Sections.


 
Alex_C ©   (2006-05-03 13:49) [2]

Ок! Идею понял , спасибо!



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

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

Наверх




Память: 0.47 MB
Время: 0.051 c
15-1145946765
Карелин Артем
2006-04-25 10:32
2006.05.21
Хорошо знаете английский?


2-1146853003
I like it
2006-05-05 22:16
2006.05.21
азы


2-1146747026
RomanH
2006-05-04 16:50
2006.05.21
Корректный выход из программы


15-1145630756
dimodim
2006-04-21 18:45
2006.05.21
Как установить PHP под FreeBsd [последний]?


15-1146151811
pasha_golub
2006-04-27 19:30
2006.05.21
Бильярдные симуляторы