Шаг 173 - Многоликие иконы

Итак, Ваше приложение может использовать иконы. Иконы бывают следующих видов:

32х32 256 цветов
48х48 256 цветов
32х32 монохромный
15х15 16 цветов

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

Создайте приложение MFC AppWizard на базе диалогового окна. Простое приложение без всяких настроек. В результате работы волшебшика в Вашем приложении будет обязательно создана икона IDR_MAINFRAME, посмотрите на нее в ресурсах. Вам кажется, что она одна ??? Обман ! У меня, например, их две (как минимум это 16X16 и 32X32). Не верите ?? Посмотрите на картинку ниже, можете сами переключаться ради интереса. Под одним идентификатором 2 иконы !!!.

173_1.gif (7486 b)

Вывод под одним идентификатором может скрываться нексколько икон. Раз это может волшебник, значит и мы сможем. Создайте свою икону. По умолчанию создастся икона 32Х32. Но мы можем к ней добавить любую, для этого достаточно нажать на кнопку и выбрать нужный режим. Смотрите.

173_2.gif (9165 b)

Видите ??? Нажимаем на кнопку и появляются возможные варианты. Но кроме того есть кнопка Custom, которая позволит Вам сформировать икону любого типа. На Ваш вкус. Я еще раз напоминаю, что Варианты одной иконы будут храниться под одним идентификатором. Извлекаться они будут в зависимости от ситуации.

Вот пример из жизни. Есть иконы размером 32Х32 и 16Х16 под одним идентификатором. Мне надо поместить иконы 16х16 в список изображений. Я создаю список и помещаю туда иконы. И помещаются иконы именно 16Х16.

CLeftView::CLeftView()
{
	cImageList.Create(16,16,FALSE,3,0); 
	InsertImageListIcon();
}

Создал список изображений. И помещаю туда иконы.

void CLeftView::InsertImageListIcon()
{
HICON hIcon;
hIcon=::LoadIcon(AfxGetResourceHandle(),MAKEINTRESOURCE(IDI_ICON_DIR)); 
cImageList.Add(hIcon);
hIcon=::LoadIcon(AfxGetResourceHandle(),MAKEINTRESOURCE(IDI_ICON_DOC)); 
cImageList.Add(hIcon);
hIcon=::LoadIcon(AfxGetResourceHandle(),MAKEINTRESOURCE(IDI_ICON_DIR_OPEN)); 
cImageList.Add(hIcon);
hIcon=::LoadIcon(AfxGetResourceHandle(),MAKEINTRESOURCE(IDI_ICON_DOC_OPEN)); 
cImageList.Add(hIcon);
}

В список изображений поместятся иконы именно 16х16. Не верите, в следующем шаге поверите :-)


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