С++, Win32 API, need HELP!

1 отговора 171 прегледа
#1

С++, Win32 API, need HELP!

Опитвам се да си напиша една програмка, която разглежда шрифтове. За да се ползва един шрифт трябва да е зареден в Уиндоус, но ако са повече (1000+) машината се товари много. Видях няколко АПИ функции:

int AddFontResource(LPSTR FontFileName);
bool RemoveFontResource(LPSTR FontFileName);
DWORD GetFontData(HDC, DWORD, DWORD, LPVOID, DWORD);


При зареждане на шрифт през AddFontResource се получава едно число, което по никакъв начин не мога да го ползвам, нито да задам число за име на шрифт, нито във GetFontData има нещо, което може да ползвам. Някой да знае как става зареждане на шрифт, ползването му и освобождаването му?

Благодаря предварително.





For blood and honor!
Отговор
#2

Re: С++, Win32 API, need HELP!

Аз го разреших по интересен начин: Оказа се, че ТТФ шрифтовете не трябва да се зареждат директно. Първо се извиквала функция, която извлича информация от ТТФ-то в друг файл и вече извикваш AddFontResource с параметър новия файл. От същия този файл с малко ровене се прихваща и името на шрифта и вече можеш да го зададеш като име. Ето ти важната част:

(Глобални променливи)
int fnt; /* Показва дали вече е бил зареден някой шрифт */
char FileToOpen[0xFF]; /*Файлът, който съдържа информация за шрифта */


(При избиране на шрифт от списък)
if (fnt) /* Ако вече е зареждан някакъв да го изтрие */
RemoveFontResource(FileToOpen);

CreateScalableFontResource(
0,
FileToOpen,
AnsiString(ListBox1->Items->Strings[ListBox1->ItemIndex] + ".ttf").c_str(),
DirectoryListBox1->Directory.c_str()
); /* тук се създава новия файл с информацията за шрифта */

fnt = AddFontResource(FileToOpen); /* Добавя се шрифта */

int OpenedFile = open(FileToOpen, O_RDWR | O_BINARY);

lseek(OpenedFile, 245, SEEK_SET);

int index;

char name[30];

read(OpenedFile, name, 1);

index = 0;

while (name[index++]) /* От тук чете съкратеното име */
read(OpenedFile, name+index, 1);

lseek(OpenedFile, 6, SEEK_CUR);

for (index = 0; index < 30; name[index++]=0);

read(OpenedFile, name, 1);

index = 0;


while (name[index++]) /* Чете още един низ */
read(OpenedFile, name+index, 1);

lseek(OpenedFile, 13, SEEK_CUR);

for (index = 0; index < 30; name[index++]=0);

read(OpenedFile, name, 1);

index = 0;


while (name[index++]) /* Тук вече е името на шрифта */
read(OpenedFile, name+index, 1);

close(OpenedFile);
DeleteFileA(FileToOpen);

FontName->Caption = AnsiString(name); /* Показва името на шрифта */

Viewoffont->Caption = FontName->Caption; /* Показва примерен текст */
Viewoffont->Font->Name = FontName->Caption;
Viewoffont->Font->Size = TrackBar1->Position;





For blood and honor!
Отговор