![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Помогите вытащить переменную из структуры
Энтри © (2005-10-22 12:15:00)Я вызываю функцию 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)
Энтри (2005-10-30 12:15:00) [1]я задумаюсь над вышенаписанном
app (2005-10-29 13:33:00) [2]Раз тему не закрываю, то остальные должны сами решить отвечать ли им в обход запрета на ответ, кроме LVT, а он аналогично тоже сам решит, как быть с персональной поддержкой.
app (2005-10-29 13:28:00) [3]Энтри (29.10.05 12:58) [12]
Это уже персональная поддержка или переписка, плюс нагибание других участников.
Задавай подобное анонимно или пиши на персональный адрес.
Энтри (2005-10-29 12:58:00) [4]2 Leonid Troyanovsky: возникли некоторые вопросы
1) afont должен быть типа HWD, да ?
2) CreateFontIndirect(..) требует в списке параметров указатель на структуру LogFont, так вот как взять указатель с переменной (или как объявить переменную как указатель на структурный тип данных)? (в Си int *a;)
3) Windows.GetClientRect(wnd, arect);
FillRect(hdc, arect, GetStockObject(..));
SetBkMode(hdc, TRANSPARENT); - это действительно нужно для шрифта?
Leonid Troyanovsky (2005-10-27 17:23:00) [5]
> Энтри (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-26 18:32:00) [6]Возник следующий вопрос: как видно выше, пишу программу я в Win32API. Так вот, ф-ия обратного вызова у меня работает и я могу с помощью ее получить список шрифтов, зарегистирированных в системе.
Теперь мне необходимо при выборе шрифта (я делаю это в ListBox`e), текст, который расположен ниже на форме программы был отображен именно этим шрифтом.
Вопрос:
1) Как установить шрифт в программе? (если с помощью CreateFont, то как конкретно)
2) Как вывести текст на форму? (если с помощью TextOut, то как заставить надпись TextOut`ом выводиться в нужном мне форме?)
Энтри (2005-10-25 10:51:00) [7]2 Игорь Шевченко: и дяди Борланду спасибо. ;)
Игорь Шевченко (2005-10-24 21:48:00) [8]Энтри (24.10.05 19:10) [7]
Спасибо, оно, собственно не мне, а Borland :)
Энтри (2005-10-24 19:10:00) [9]2 Игорь Шевченко: Блестяще! Огромное спасибо.
Игорь Шевченко (2005-10-24 11:41:00) [10]Энтри (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 11:34:00) [11]Функцию FontCallBack я объявляю сам, она является функцией обратного вызова для функции EnumFontFamilies(GetDC(Window),nil,@FontCallBack,0)
То есть я хочу в программе последовательно перебирать установленные системные шрифты и вытаскиваеть только их названия.
2 wp2: pLOGFONT^.lfFaceName попробовал - не пашет все равно. А про LF_FACESIZE - откуда я могу знать сколько символов в шрифте, который возвращает функция EnumFontFamilies?
2 Игорь Шевченко: Как это сделать с функцией обратного вызова?
Заранее благодарен.
Игорь Шевченко (2005-10-24 11:08:00) [12]RTFS: TScreen.GetFonts
wp2 (2005-10-22 23:47:00) [13]Что-то я нигде не нашел такой функции как 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-22 23:28:00) [14]Структура определена в 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:21:00) [15]Удалено модератором