C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Загрузка иконок, Как загрузить из icl файлов?
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

Я использую для этого smile.gif 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( "Ошибка загрузка иконок" );

Вернуться в Вопросы программирования в C++Builder