Использование иконок

Создание иконки

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

Пример

HICON hIcon1;   // дескриптор иконки
HICON hIcon2; // дескриптор иконки

// Создание стандартной иконки с вопросом.

hIcon1 = LoadIcon(NULL, IDI_QUESTION);

// Создание иконки из ресурса.

hIcon2 = LoadIcon(hinst, MAKEINTRESOURCE(460));

// Создание собственной иконки в процессе работы приложения.

Обычно, для создания собственной иконки из ресурса, приложение должно использовать функции LoadIcon или LoadImage, вместо того, чтобы создавать эти иконки в процессе работы приложения. Этот подход позволяет сделать приложение устройство-независимым, упростить локализацию. Однако следующий пример использует функцию CreateIcon для создания собственной иконки в процессе работы приложения, основанный на битовых масках.

Пример

HICON hIcon3;      // дескриптор иконки

// битовая маска AND

BYTE ANDmaskIcon[] = {0xFF, 0xFF, 0xFF, 0xFF, // строка 1
0xFF, 0xFF, 0xC3, 0xFF, // строка 2
0xFF, 0xFF, 0x00, 0xFF, // строка 3
0xFF, 0xFE, 0x00, 0x7F, // строка 4

0xFF, 0xFC, 0x00, 0x1F, // строка 5
0xFF, 0xF8, 0x00, 0x0F, // строка 6
0xFF, 0xF8, 0x00, 0x0F, // строка 7
0xFF, 0xF0, 0x00, 0x07, // строка 8

0xFF, 0xF0, 0x00, 0x03, // строка 9
0xFF, 0xE0, 0x00, 0x03, // строка 10
0xFF, 0xE0, 0x00, 0x01, // строка 11
0xFF, 0xE0, 0x00, 0x01, // строка 12

0xFF, 0xF0, 0x00, 0x01, // строка 13
0xFF, 0xF0, 0x00, 0x00, // строка 14
0xFF, 0xF8, 0x00, 0x00, // строка 15
0xFF, 0xFC, 0x00, 0x00, // строка 16

0xFF, 0xFF, 0x00, 0x00, // строка 17
0xFF, 0xFF, 0x80, 0x00, // строка 18
0xFF, 0xFF, 0xE0, 0x00, // строка 19
0xFF, 0xFF, 0xE0, 0x01, // строка 20

0xFF, 0xFF, 0xF0, 0x01, // строка 21
0xFF, 0xFF, 0xF0, 0x01, // строка 22
0xFF, 0xFF, 0xF0, 0x03, // строка 23
0xFF, 0xFF, 0xE0, 0x03, // строка 24

0xFF, 0xFF, 0xE0, 0x07, // строка 25
0xFF, 0xFF, 0xC0, 0x0F, // строка 26
0xFF, 0xFF, 0xC0, 0x0F, // строка 27
0xFF, 0xFF, 0x80, 0x1F, // строка 28

0xFF, 0xFF, 0x00, 0x7F, // строка 29
0xFF, 0xFC, 0x00, 0xFF, // строка 30
0xFF, 0xF8, 0x03, 0xFF, // строка 31
0xFF, 0xFC, 0x3F, 0xFF}; // строка 32

// битовая маска XOR

BYTE XORmaskIcon[] = {0x00, 0x00, 0x00, 0x00, // строка 1
0x00, 0x00, 0x00, 0x00, // строка 2
0x00, 0x00, 0x00, 0x00, // строка 3
0x00, 0x00, 0x00, 0x00, // строка 4

0x00, 0x00, 0x00, 0x00, // строка 5
0x00, 0x00, 0x00, 0x00, // строка 6
0x00, 0x00, 0x00, 0x00, // строка 7
0x00, 0x00, 0x38, 0x00, // строка 8

0x00, 0x00, 0x7C, 0x00, // строка 9
0x00, 0x00, 0x7C, 0x00, // строка 10
0x00, 0x00, 0x7C, 0x00, // строка 11
0x00, 0x00, 0x38, 0x00, // строка 12

0x00, 0x00, 0x00, 0x00, // строка 13
0x00, 0x00, 0x00, 0x00, // строка 14
0x00, 0x00, 0x00, 0x00, // строка 15
0x00, 0x00, 0x00, 0x00, // строка 16

0x00, 0x00, 0x00, 0x00, // строка 17
0x00, 0x00, 0x00, 0x00, // строка 18
0x00, 0x00, 0x00, 0x00, // строка 19
0x00, 0x00, 0x00, 0x00, // строка 20

0x00, 0x00, 0x00, 0x00, // строка 21
0x00, 0x00, 0x00, 0x00, // строка 22
0x00, 0x00, 0x00, 0x00, // строка 23
0x00, 0x00, 0x00, 0x00, // строка 24

0x00, 0x00, 0x00, 0x00, // строка 25
0x00, 0x00, 0x00, 0x00, // строка 26
0x00, 0x00, 0x00, 0x00, // строка 27
0x00, 0x00, 0x00, 0x00, // строка 28

0x00, 0x00, 0x00, 0x00, // строка 29
0x00, 0x00, 0x00, 0x00, // строка 30
0x00, 0x00, 0x00, 0x00, // строка 31
0x00, 0x00, 0x00, 0x00}; // строка 32

hIcon3 = CreateIcon(hinst, // экземпляр приложения
32, // ширина иконки
32, // высота иконки
1, // количество слоёв XOR
1, // количество битов на пиксель
ANDmaskIcon, // битовая маска AND
XORmaskIcon); // битовая маска XOR

Для создания иконки CreateIcon применяет следующую таблицу истинности для битовых масок AND и XOR.

{mospagebreak} 

битовая маска AND битовая маска XOR Дисплей
0 0 Чёрный
0 1 Белый
1 0 Экран
1 1 инвертированный экран

Если создание иконки осуществлялось при помощи функции CreateIconIndirect, то перед закрытием, приложение должно воспользоваться функцией DestroyIcon, чтобы удалить иконки. Однако, если иконки создавались другими функциями, то в уничтожении иконок нет необходимости.

Отображение иконки

Следующий пример демонстрирует, как нарисовать иконку в клиентской области окна, контекст устройства которого (DC) указан в параметре hdc.

HICON hIcon1;   // дескриптор иконки 
HDC hdc; // дескриптор констекста устройства

DrawIcon(hdc, 10, 20, hIcon1);

Каждому окну в системе присваивается класс иконок. Приложение может на стадии регистрации присвоить окну определённый класс иконок. Так же приложение может заменить иконку присвоенную окна при помощи функции SetClassLong. Следующий пример заменяет класс иконок на иконку с идентификатором ресурса 480.

HINSTANCE hinst;            // дескриптор текущего экземпляра
HWND hwnd; // дескриптор главного окна


SetClassLong(hwnd, // дескриптор окна
GCL_HICON, // изменяем иконку
(LONG) LoadIcon(hinst, MAKEINTRESOURCE(480))
);

 

Использование ресурсов иконок из других модулей

Ниже приведён пример, который создаёт дескриптор иконки, основанный на иконке из другого исполняемого файла. Для этого используются функции CreateIconFromResourceEx, DrawIcon, и LookupIconIdFromDirectoryEx, а так же некторые функции для работы с ресурсами. В конце иконка отображается в окне.

Пример

HICON hIcon1;       // дескриптор иконки
HINSTANCE hExe; // дескриптор закгруженного файла .EXE
HRSRC hResource; // дескриптор для FindResource
HRSRC hMem; // дескриптор для LoadResource
BYTE *lpResource; // указатель на данные ресурса
int nID; // ID ресурса, который лучше всего удовлетворяет
// текущему экрану

HDC hdc; // дескриптор констекста устройства

// Загружаем файл, из которого будет скопирована иконка.
// LoadLibrary должна иметь явный путь.
//
hExe = LoadLibrary("myapp.exe");
if (hExe == NULL)
{
//Ошибка загрузки модуля
return;
}


// Находим группу иконки, идентификатор которой 440.

hResource = FindResource(hExe,
MAKEINTRESOURCE(440),
RT_GROUP_ICON);

// Загружаем и блокируем группу иконки.

hMem = LoadResource(hExe, hResource);

lpResource = LockResource(hMem);

// Get the identifier of the icon that is most appropriate
// for the video display.

nID = LookupIconIdFromDirectoryEx((PBYTE) lpResource, TRUE,
CXICON, CYICON, LR_DEFAULTCOLOR);

// Ищем биты для nID иконки.

hResource = FindResource(hExe,
MAKEINTRESOURCE(nID),
MAKEINTRESOURCE(RT_ICON));

// Загружаем и блокируем иконку.

hMem = LoadResource(hExe, hResource);

lpResource = LockResource(hMem);

// Создаём дескриптор иконки.

hIcon1 = CreateIconFromResourceEx((PBYTE) lpResource,
SizeofResource(hExe, hResource), TRUE, 0x00030000,
CXICON, CYICON, LR_DEFAULTCOLOR);

// Рисуем иконку в клиентской области.

DrawIcon(hdc, 10, 20, hIcon1);