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

 
ICO iz EXE v ListBox
** Monster
Отправлено: 17.11.2003, 11:28


Не зарегистрирован







Как правильно взять иконки из ехе файла.
Уменьшить их до 15х15 например.
И засунуть в ListBox?
Admin
Отправлено: 17.11.2003, 19:26


Владимир

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



Бросьте на форму компоненты
Button1, OpenDialog1, ListBox1, ImageList1, Image1
Установите у компонента ListBox1
свойство Style = lbOwnerDrawFixed
и например ItemHeight = 20

CODE

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
int ni;

//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
char buff[1024];
if(OpenDialog1->Execute()){
strcpy(buff,OpenDialog1->FileName.c_str());
TIcon *Icon = new TIcon;
Icon->Handle = ExtractIcon(HInstance, buff ,0);
if(Icon->Handle == NULL){ WORD lpi;
Icon->Handle = ExtractAssociatedIcon(HInstance, buff ,&lpi);
}
ni = ImageList1->AddIcon(Icon);
Image1->Picture->Assign(Icon);
delete Icon; Icon = NULL;
ListBox1->Items->Add(buff);
}
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ListBox1DrawItem(TWinControl *Control, int Index,
TRect &Rect, TOwnerDrawState State)
{
TIcon *Icon = new TIcon;
ImageList1->GetIcon(Index, Icon);
ListBox1->Canvas->Draw(Rect.Left+2, Rect.Top+2, Icon);
ListBox1->Canvas->TextOut(Rect.Left+2+Icon->Width,
                                     Rect.Top+2, ListBox1->Items->Strings[Index]);
delete Icon; Icon = NULL;
}
//---------------------------------


Отредактировано Admin — 17/11/2003, 20:32
** Monster
Отправлено: 18.11.2003, 15:43


Не зарегистрирован







Спасибо. Супер!
** Monster
Отправлено: 18.11.2003, 17:30


Не зарегистрирован







Вот только не пойму она каждый раз вниз добавляет.
А мне надо заново весь листбокс перерисовать.
Как бы это сделать?
Admin
Отправлено: 18.11.2003, 22:40


Владимир

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



Если предварительно очистить, то
CODE

 ListBox1->Items->Clear();
 ListBox1->Items->Add(buff);


если встать на первую запись, то

CODE

ListBox1->ItemIndex = 0; // встать на первую запись


Также можно считать/установить текущую верхнюю
отражаемую строку в ListBox:
CODE

ListBox1->TopIndex = 0;
** Monster
Отправлено: 19.11.2003, 10:04


Не зарегистрирован







Всё получилось.

ListBox1->Items->Clear();
ListBox1->Items->Add(buff);

Это я в курсе.

Нужно ещё и ListBox2->Clear(); чистить было.

smile.gif


Спасибо!!!
** Monster
Отправлено: 19.11.2003, 10:06


Не зарегистрирован







Вернее

ImageList->Clear();

wink.gif))

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