Форум: "Начинающим";
Текущий архив: 2006.05.21;
Скачать: [xml.tar.bz2];
Вниз
Как получить 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;
Скачать: [xml.tar.bz2];
Память: 0.44 MB
Время: 0.014 c