Использование иконок
Страница 2.


 

битовая маска 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);  
 
« Предыдущая статья   Следующая статья »