Шаг 169 - Добавляем элементы в список изображений

Итак, в прошлый раз мы создали с Вами список изображений. Но изображения в этот список надо помещать откуда-то. Выходов много. Например, завести кучу BMP файлов в каталогах или, например, картинок в ресурсах. Мы поступим по другому. Мы добавим в ресурсы иконы ICON три штуки. И потом поместим эти иконы в список изображений. Будем дальше мучать наш прошлый проект. Только если мы посмотрим на иконы, то увидим, что они стандартные, то есть 32X32 поэтому давайте подправим нашу функцию Create. Вот так.

BOOL CTestImageDlg::OnInitDialog()
{
	.......
	// TODO: Add extra initialization here
	if (!cl.Create(32,32,FALSE,3,0)) 
	{
		AfxMessageBox("Error Create ImageList");
		return FALSE;
	}
	return TRUE;  // return TRUE  unless you set the focus to a control
}

Итак, идем в ресурсы и создаем три иконы.

169_1.gif (2955 b)

Ну вот очень хорошо. Теперь нам надо эти иконы поместить в список изображений. Давайте в классе диалога создадим отдельную функцию для помещения изображений в список.

class CTestImageDlg : public CDialog
{
// Construction
public:
	BOOL InsertIcon();
	CImageList cl;
	.....
};

А вот и сам код функции.

BOOL CTestImageDlg::InsertIcon()
{
HICON hIcon;
hIcon=::LoadIcon(AfxGetResourceHandle(),MAKEINTRESOURCE(IDI_ICON1)); 
if (hIcon!=NULL) 
{
     if (cl.Add(hIcon)==-1) return FALSE;
}
else return FALSE;
hIcon=::LoadIcon(AfxGetResourceHandle(),MAKEINTRESOURCE(IDI_ICON2)); 
if (hIcon!=NULL) 
{
     if (cl.Add(hIcon)==-1) return FALSE;
}
else return FALSE;
hIcon=::LoadIcon(AfxGetResourceHandle(),MAKEINTRESOURCE(IDI_ICON3)); 
if (hIcon!=NULL) 
{
     if (cl.Add(hIcon)==-1) return FALSE;
}
else return FALSE;
return TRUE;
}

Ну чего эдесь. Здесь много знакомого. Во-первых мы получаем указатель на икону с использованием LoadIcon. Здесь у нас две альтернативы. Первая воспользоваться методом LoadIcon от класса CWinApp или той же функций из Win 32 API. Вот. Разницы практически нет, так как в классе диалога CWinApp не доступен. Конечно его можно запросить, но по мне все одно, что так что как я сделал. Если у кого есть веские аргументы пишите.

LoadIcon может вернуть NULL, а не какой не указатель. Это мы и проверим. Кроме того функция Add может завершиться неудачей. По разным причинам. Ну не знаю, пусть памяти не хватит, например. В любом случае, если неудача она вернет -1. Это мы тоже проверяем. И так мы делаем три раза. Если наша программа пройдет сквозь все терни она вернет нам TRUE, иначе FALSE ну тут как говорят - "невиноватая я, он сам пришел" :-).

По поводу функции Add она тоже может быть в нескольких вариантах. Вот смотрите.

int Add( CBitmap* pbmImage, CBitmap* pbmMask );
int Add( CBitmap* pbmImage, COLORREF crMask );
int Add( HICON hIcon );

Вот и добавлять изображения мы научились наконец. Скоро научимся пользоваться :-)


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем.