Форум: "WinAPI";
Текущий архив: 2006.01.01;
Скачать: [xml.tar.bz2];
ВнизПомогите вытащить переменную из структуры Найти похожие ветки
← →
Энтри (2005-10-22 12:15) [0]Я вызываю функцию FontCallBack(lpnlf:pENUMlogfont;...
Насколько я понимаю lpnlf:pENUMlogfont - это структурный тип данных:
{typedef struct tagLOGFONT { // lf
LONG lfHeight;
LONG lfWidth;
LONG lfEscapement;
LONG lfOrientation;
LONG lfWeight;
BYTE lfItalic;
BYTE lfUnderline;
BYTE lfStrikeOut;
BYTE lfCharSet;
BYTE lfOutPrecision;
BYTE lfClipPrecision;
BYTE lfQuality;
BYTE lfPitchAndFamily;
TCHAR lfFaceName[LF_FACESIZE];
}// LOGFONT;
Мне нужно вытащить lfFaceName[LF_FACESIZE], но я не знаю:
1) что такое LF_FACESIZE
2) как вытаскивать lfFaceName из структуры (я пробовал так: pLOGFONT.lfFaceName, но пишет, что [Error]: Object or classs type required)
← →
wp2 (2005-10-22 23:21) [1]Удалено модератором
← →
Джо © (2005-10-22 23:28) [2]Структура определена в Windows.pas:
tagLOGFONTA = packed record
lfHeight: Longint;
lfWidth: Longint;
lfEscapement: Longint;
lfOrientation: Longint;
lfWeight: Longint;
lfItalic: Byte;
lfUnderline: Byte;
lfStrikeOut: Byte;
lfCharSet: Byte;
lfOutPrecision: Byte;
lfClipPrecision: Byte;
lfQuality: Byte;
lfPitchAndFamily: Byte;
lfFaceName: array[0..LF_FACESIZE - 1] of AnsiChar;
end;
← →
wp2 (2005-10-22 23:47) [3]Что-то я нигде не нашел такой функции как FontCallBack :-)
Ни в pas-ах ни в dll-ках...
Ну да ладно...
А ты пробовал так:
pLOGFONT^.lfFaceName
Да и вообще lfFaceName это массив символов.
LF_FACESIZE как раз и показывает размер этого массива.
Если способ приведённый выше не помогает попробуй pLOGFONT^.lfFaceName[i]
То есть:
S := "";
For I := 0 to LF_FACESIZE - 1 do
S := S + pLOGFONT^.lfFaceName[i]
Хотя можно придумать еще кучу всяких способов, если считать, что lfFaceName
это нуль-терминальная строка.
А вообще напиши по-подробнее. Например, ты в чём пишешь? В Delphi? И ты чего исходники содержишь на C++. Не понятно.
ЗЫ. Константа LF_FACESIZE должна быть описана в том же модуле где и описана функция FontCallBack.
← →
Игорь Шевченко © (2005-10-24 11:08) [4]RTFS: TScreen.GetFonts
← →
Энтри (2005-10-24 11:34) [5]Функцию FontCallBack я объявляю сам, она является функцией обратного вызова для функции EnumFontFamilies(GetDC(Window),nil,@FontCallBack,0)
То есть я хочу в программе последовательно перебирать установленные системные шрифты и вытаскиваеть только их названия.
2 wp2: pLOGFONT^.lfFaceName попробовал - не пашет все равно. А про LF_FACESIZE - откуда я могу знать сколько символов в шрифте, который возвращает функция EnumFontFamilies?
2 Игорь Шевченко: Как это сделать с функцией обратного вызова?
Заранее благодарен.
← →
Игорь Шевченко © (2005-10-24 11:41) [6]Энтри (24.10.05 11:34) [5]
> Как это сделать с функцией обратного вызова?function EnumFontsProc(var LogFont: TLogFont; var TextMetric: TTextMetric;
FontType: Integer; Data: Pointer): Integer; stdcall;
var
S: TStrings;
Temp: string;
begin
S := TStrings(Data);
Temp := LogFont.lfFaceName;
if (S.Count = 0) or (AnsiCompareText(S[S.Count-1], Temp) <> 0) then
S.Add(Temp);
Result := 1;
end;
function TScreen.GetFonts: TStrings;
var
DC: HDC;
LFont: TLogFont;
begin
if FFonts = nil then
begin
FFonts := TStringList.Create;
DC := GetDC(0);
try
FFonts.Add("Default");
FillChar(LFont, sizeof(LFont), 0);
LFont.lfCharset := DEFAULT_CHARSET;
EnumFontFamiliesEx(DC, LFont, @EnumFontsProc, LongInt(FFonts), 0);
TStringList(FFonts).Sorted := TRUE;
finally
ReleaseDC(0, DC);
end;
end;
Result := FFonts;
end;
← →
Энтри (2005-10-24 19:10) [7]2 Игорь Шевченко: Блестяще! Огромное спасибо.
← →
Игорь Шевченко © (2005-10-24 21:48) [8]Энтри (24.10.05 19:10) [7]
Спасибо, оно, собственно не мне, а Borland :)
← →
Энтри (2005-10-25 10:51) [9]2 Игорь Шевченко: и дяди Борланду спасибо. ;)
← →
Энтри (2005-10-26 18:32) [10]Возник следующий вопрос: как видно выше, пишу программу я в Win32API. Так вот, ф-ия обратного вызова у меня работает и я могу с помощью ее получить список шрифтов, зарегистирированных в системе.
Теперь мне необходимо при выборе шрифта (я делаю это в ListBox`e), текст, который расположен ниже на форме программы был отображен именно этим шрифтом.
Вопрос:
1) Как установить шрифт в программе? (если с помощью CreateFont, то как конкретно)
2) Как вывести текст на форму? (если с помощью TextOut, то как заставить надпись TextOut`ом выводиться в нужном мне форме?)
← →
Leonid Troyanovsky © (2005-10-27 17:23) [11]
> Энтри (26.10.05 18:32) [10]
> 1) Как установить шрифт в программе? (если с помощью CreateFont,
> то как конкретно)
> 2) Как вывести текст на форму? (если с помощью TextOut,
> то как заставить надпись TextOut`ом выводиться в нужном
> мне форме?)
Приблизительно так:
hdc := GetWindowDC(wnd);
..
afont := CreateFontIndirect(..);
SelectObject(hdc, afont);
Windows.GetClientRect(wnd, arect);
FillRect(hdc, arect, GetStockObject(..));
SetBkMode(hdc, TRANSPARENT);
TextOut(hdc, ..);
Windows.DeleteObject(afont);
..
ReleaseDC(wnd, hdc);
И какая форма? Окна, только окна.
--
Regards, LVT.
← →
Энтри (2005-10-29 12:58) [12]2 Leonid Troyanovsky: возникли некоторые вопросы
1) afont должен быть типа HWD, да ?
2) CreateFontIndirect(..) требует в списке параметров указатель на структуру LogFont, так вот как взять указатель с переменной (или как объявить переменную как указатель на структурный тип данных)? (в Си int *a;)
3) Windows.GetClientRect(wnd, arect);
FillRect(hdc, arect, GetStockObject(..));
SetBkMode(hdc, TRANSPARENT); - это действительно нужно для шрифта?
← →
app © (2005-10-29 13:28) [13]Энтри (29.10.05 12:58) [12]
Это уже персональная поддержка или переписка, плюс нагибание других участников.
Задавай подобное анонимно или пиши на персональный адрес.
← →
app © (2005-10-29 13:33) [14]Раз тему не закрываю, то остальные должны сами решить отвечать ли им в обход запрета на ответ, кроме LVT, а он аналогично тоже сам решит, как быть с персональной поддержкой.
← →
Энтри (2005-10-30 12:15) [15]я задумаюсь над вышенаписанном
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2006.01.01;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.015 c