RProg |
Отправлено: 24.06.2005, 20:14 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 11
|
Добрый день.
Смотрю что все посетители форума спокойно грузят иконки из dll файлов. Хотел тоже загрузить, но не получается. Вообще мне нужно грузить из icl файлов, так как я незнаю чем зашить нужные мне иконки в dll (да и нужно ли их в dll держать?). Может поделитесь опытом. Поискал в форуме "Icon" и ахнул, ну его, если даже есть ответ (наверное есть), его искать с неделю.
Если не лень с примерчиком на TImage. |
|
radiofun |
Отправлено: 24.06.2005, 20:33 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 20
|
CODE | void createicon(AnsiString name)
{
int numIcons;
phIcon pTheLargeIcons, pTheSmallIcons;
int LargeIconWidth;
int SmallIconWidth;
int SmallIconHeight;
TPicture *ico;
numIcons = ExtractIconEx(tools->path[col+1].c_str(),-1,NULL,NULL,0 );
if ( numIcons > 0 )
{
try
{
pTheLargeIcons = new HICON[ numIcons ];
pTheSmallIcons = new HICON[ numIcons ];
ZeroMemory( pTheLargeIcons, numIcons * sizeof( HICON ) );
ZeroMemory( pTheSmallIcons, numIcons * sizeof( HICON ) );
ExtractIconEx(tools->path[col+1].c_str(), 0,pTheLargeIcons, pTheSmallIcons, numIcons );
Form1->Image1->Canvas->Pen->Color=clBtnFace;
Form1->Image1->Canvas->Pen->Width=100;
Form1->Image1->Canvas->Rectangle(0,0,30,30);
ico=new TPicture;
ico->Icon->Handle=pTheSmallIcons[0];
Form1->Image1->Canvas->Draw(1,1,ico->Icon);
Form1->Image1->Picture->Bitmap->SaveToFile(ExtractFilePath(Application->ExeName)+name);
}
__finally
{
delete [] pTheLargeIcons;
delete [] pTheSmallIcons;
ico->Free();
}
}
else
ShowMessage( "Не могу создать иконку к инструменту" );
delete *ico;
} |
вот
выдрал из рабочей программы
tools->path[col+1]-название файла из которого надо извлеч иконку |
|
AVC |
Отправлено: 25.06.2005, 09:05 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
QUOTE |
незнаю чем зашить нужные мне иконки в dll
|
Я поступаю так
В ImageEditor'е создаю файл ресурсов в том числе и из иконок и сохраняю его НЕ под именем проекта res (например Icons.res)
CODE |
В проекте
в .h
private:
TIcon *FIco_Tray_Idle;
TIcon *FIco_Tray_PingOn;
в .cpp
#pragma resource "Icons.res" // файл ресурсов с иконками
В конструкторе
FIco_Tray_Idle = new TIcon(); FIco_Tray_Idle ->Handle = LoadIcon(HInstance, "IDLE" );
FIco_Tray_PingOn = new TIcon(); FIco_Tray_PingOn->Handle = LoadIcon(HInstance, "PING_ON");
Пример использования
Application->Icon = FIco_Tray_Idle;
Image1->Picture->Icon = FIco_IPPanel_PingOn;
И не забывайте delete
|
|
|
Gedeon |
Отправлено: 25.06.2005, 13:11 |
|
Ветеран
Группа: Модератор
Сообщений: 1742
|
QUOTE (RProg @ 24/06/2005, 20:14) | я незнаю чем зашить нужные мне иконки в dll |
Я использую для этого MS Visual Studio
Create resource dll и вперед.
|
|
** Rprog |
Отправлено: 02.07.2005, 21:42 |
|
Не зарегистрирован
|
Посмотрел примеры. Привожу немного доработаный вариант radiofunа с загрузкой из *.icl библиотек.
delete *ico; применять не нужно! Это выполняет метод Free() и если применять delete то без *
int numIcons;
HICON *pTheLargeIcons, *pTheSmallIcons;
TPicture *ico;
ico = new TPicture;
numIcons = ExtractIconEx("Nega.icl",-1,pTheLargeIcons, pTheSmallIcons, numIcons );
if ( numIcons> 0 )
{
try
{
updownIcon -> Max = numIcons;
pTheLargeIcons = new HICON[ numIcons ];
pTheSmallIcons = new HICON[ numIcons ];
ZeroMemory( pTheLargeIcons, numIcons * sizeof( HICON ) );
ZeroMemory( pTheSmallIcons, numIcons * sizeof( HICON ) );
ExtractIconEx("Nega.icl", updownIcon -> Position,pTheLargeIcons, pTheSmallIcons, 1 );
picRomIcon -> Canvas -> Pen -> Color = clBtnFace;
picRomIcon -> Canvas -> Pen -> Width = 100;
picRomIcon -> Canvas -> Rectangle(0, 0, 32, 32);
ico -> Icon -> Handle = pTheLargeIcons[0];
/*
...
Здесь загрузка pTheSmallIcons если нужно
...
*/
picRomIcon -> Canvas -> Draw(1, 1, ico->Icon);
}
__finally
{
delete [] pTheLargeIcons;
delete [] pTheSmallIcons;
ico->Free();
}
}
else
ShowMessage( "Ошибка загрузка иконок" );
|
|
|