Главная страница
    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.49 MB
Время: 0.015 c
2-1134458053
Kot
2005-12-13 10:14
2006.01.01
Открыть папку нажатием кнопки


14-1134158403
VirEx
2005-12-09 23:00
2006.01.01
Mail в Php


8-1121459577
ronyn
2005-07-16 00:32
2006.01.01
DS Pack


4-1130518758
Ландграф мобил=)
2005-10-28 20:59
2006.01.01
Динамическое создание процедуры


2-1134663642
_white_
2005-12-15 19:20
2006.01.01
Процессы или как устоена ArtMoney





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский