Главная страница
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.063 c
4-1141045353
Chaser
2006-02-27 16:02
2006.05.21
Сделать аналогично Пуск -> Выполнить


2-1146727388
De
2006-05-04 11:23
2006.05.21
В dll не выставить breakpoint, почему?


11-1126203287
Fanny
2005-09-08 22:14
2006.05.21
Вот баян: обработчик FormShow срабатывает не там !!!


15-1146034567
Харченко
2006-04-26 10:56
2006.05.21
Задачи по взвешиванию монет


15-1145556097
Катерина
2006-04-20 22:01
2006.05.21
Очченно отвлеченная тема: Фото в Аське