Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.01.01;
Скачать: CL | DM;

Вниз

Помогите вытащить переменную из структуры   Найти похожие ветки 

 
Энтри   (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 вся ветка

Текущий архив: 2006.01.01;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.025 c
2-1134733361
Mishenka
2005-12-16 14:42
2006.01.01
Как удалить параметра из ini файла?


4-1130407361
G-h-o-s-t
2005-10-27 14:02
2006.01.01
Как сделать видимым элемент управления


8-1122036614
vladgul
2005-07-22 16:50
2006.01.01
Picture Transfer Protocol (PTP). Получение изображения с камеры.


2-1134576874
Змей
2005-12-14 19:14
2006.01.01
отлавливание sc_minimize


2-1134421386
Pupsiks
2005-12-13 00:03
2006.01.01
Сообщение