Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.48 MB
Время: 0.011 c
14-1133890435
Хинт
2005-12-06 20:33
2006.01.01
Выбор Delphi


14-1134047962
Kerk
2005-12-08 16:19
2006.01.01
Нашел в папке "Спам"


3-1131459679
syte_ser78
2005-11-08 17:21
2006.01.01
модератор.мудак:=труе


3-1131699925
Zoostal
2005-11-11 12:05
2006.01.01
Проблема с FB 1.5 и IBX


11-1115883363
SkynoSky
2005-05-12 11:36
2006.01.01
Помагите в разработке БД в Delphi и IB





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский