Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как получить CharSet шрифта [D7, XP]


Alex_C ©   (2006-05-03 12:02:00) 

Допустим 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'а?


Alex_C   (2006-05-03 13:49:00) [1]

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


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

Например

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.


Наверх

Титульная страница Поиск, карта сайта Написать письмо