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

 
ico в .res файле, Как использовать иконку из своего ресуса
Treumer
Отправлено: 12.02.2004, 16:30


Станционный диспетчер

Группа: Участник
Сообщений: 92



Задача — "добраться" до иконки в ресурсе своей же программы.
Как я пытался это делать:
Занес иконку в .res файл (Проект/Ресурсы)
Присвоил ей уникальное имя.

В программе делал следующее:
m_ProgramImages= new TImageList(Owner);
if (m_ProgramImages->ResourceLoad(rtIcon, "IRICON32", clWhite ))
{
...
}

Но увы, m_ProgramImages->ResourceLoad всегда давала false.

Тогда я попробовал так:
TResourceStream* Res = new TResourceStream((int)HInstance, "IRICON32",RT_ICON);

Теперь она ругается, что ресурс не найден.

Иконку я потом удалил и вставил заново при помощи редактора ресурсов, т.к. Борландовская фигулина для внесения данных в ресурсы работает как-то странно.
Но это не помогло.

Пробовал иконки разных размеров 64, 32 и 16 бит...

Как же это сделать ?!

Заранее благодарен за ответы!


Pirs
Отправлено: 13.02.2004, 11:54


Дежурный стрелочник

Группа: Участник
Сообщений: 39



Я не знаю как с ресурсами, но есть более простой способ управления иконками.
1. Бросаешь на форму TImageList. Называешь напр. IconList
2. Сразу устанавливаешь размеры, так как потом будет поздно.Напр.32х32
3. Дважды на ней щелкаешь-открывается редактор. Добавляешь туда битмапы и иконки.Запоминаешь индексы под которыми они разместились
4. А дальше все просто: если надо поменять на какой-то форме иконку пишешь код:

IconList->GetIcon( IndexInIconList , TForm->Icon) ;

Если напр. нужная иконка под индексом 3, и ее надо поместить в главной форме, то просто:

IconList->GetIcon( 3 , Icon) ;

100% работает

Treumer
Отправлено: 13.02.2004, 14:19


Станционный диспетчер

Группа: Участник
Сообщений: 92



QUOTE (Pirs @ 13/02/2004, 12:56)
Я не знаю как с ресурсами, но есть более простой способ управления иконками.
1. Бросаешь на форму TImageList. Называешь напр. IconList
2. Сразу устанавливаешь размеры, так как потом будет поздно.Напр.32х32
3. Дважды на ней щелкаешь-открывается редактор. Добавляешь туда битмапы и иконки.Запоминаешь индексы под которыми они разместились
4. А дальше все просто: если надо поменять на какой-то форме иконку пишешь код:

IconList->GetIcon( IndexInIconList , TForm->Icon) ;

Если напр. нужная иконка под индексом 3, и ее надо поместить в главной форме, то просто:

IconList->GetIcon( 3 , Icon) ;

100% работает

Огромное спасибо!
Я не знал что ImageList может и иконки содержать!
Но если кто про ресурсы ответит — было бы еще лучше!
Admin
Отправлено: 15.02.2004, 11:29


Владимир

Группа: Администратор
Сообщений: 1190



QUOTE
Но если кто про ресурсы ответит — было бы еще лучше!


HICON LoadIcon(

HINSTANCE hInstance, // handle of application instance
LPCTSTR lpIconName // icon-name string or icon resource identifier
);

http://www.rxlib.ru/faqs/faqd_en/17767.html

CODE

void __fastcall TForm1::Button1Click(TObject *Sender)
{
HICON h;
h = LoadIcon(NULL, IDI_ASTERISK);
Application->Icon->Handle = h;
InvalidateRect(Application->Handle, NULL, true);
}


или для иконки из ресурса "IRICON32":

CODE

void __fastcall TForm1::Button2Click(TObject *Sender)
{
HICON h;
h = LoadIcon(HInstance, "IRICON32");
Application->Icon->Handle = h;
InvalidateRect(Application->Handle, NULL, true);
}



CODE

//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
HICON h;
h = LoadIcon(NULL, IDI_ASTERISK); // или LoadIcon(HInstance, "IRICON32");
HDC hDC  = GetDC(Form1->Handle);
DrawIcon(hDC, 100,100, h);
ReleaseDC(Form1->Handle, hDC);
}
//---------------------------------------------------------------------------



Отредактировано Admin — 15/02/2004, 12:43

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