Мы уже встречались с ресурсами и загружали из них строки с помощью функции LoadString. Сегодня я хочу научить тебя загружать иконки, курсоры и картинки. А главное, мы научимся всем этим управлять.
Все ресурсы в С++ хранятся в виде .rc файлов. При компиляции они компилируются в промежуточный файл .res, а при сборке приложения встраиваются в .exe (запускной) файл. В итоге, ресурсы становятся неотъемлемой частью .exe файла.
Начнём мы своё рассмотрение ресурсов с иконок. Иконки используются для дополнительного определения твоей проги среди всего многообразия других программ. Практически любая прога имеет в себ иконки. Если прога ничего не содержит, то Windows будет подставлять свою иконку.
Иконки - это растровый рисунок ограниченый 16-ю цветами и определённого размера. В Windows 9х разрешено уже использовать иконки с 256 цветами. Размеры иконок равны 16х16 или 32х32. Иногда встречаются большие иконки размером 48х48 пикселов. Иконка размером 16х16 используется для отображения в обрамлении окна. Иконка 32х32 используется для отображения проги на рабочем столе.
Давай расмотрим пример работы с иконками. Создай пустой проект "Win32 Application". Перед тобой появится мастер создания, который мы уже сто раз. На первом же шаге выбери пункт "A typical Hello world application" (типичное приложение "Привет всем").
Рис 1. Дерево ресурсов
Visual C++ уже создал для нас необходимые иконки и поместил в них рисунок поумолчанию. Для редактирования иконок, в левой части экрана (в окне workspace) перейди на закладку Resuurces. Здесь все ресурсы представлены в виде дерева (рисунок 1). На вершине дерева находится "Имя проекта recources". Если открыть её, то увидишь папки с именами типов ресурсов (Accelerator, Dialog, Icon ...).
Для редактирования иконок выбери папку Icon. Здесь уже находятся две иконки 16x16 и 32x32. Дважды щёлкни по ним и редактируй как простой рисунок. Для создания нового ресурса щёлкни правой кнопкой по любой папке и в появившемся меню выбери "Insert".
Когда отредактируешь, переходи в исходник примера. Сейчас мы его подредактируем. В разделе Global Variables добавь переменную m_hIcon типа HICON:
// Global Variables:
HINSTANCE hInst; // current instance
TCHAR szTitle[MAX_LOADSTRING]; // The title bar text
TCHAR szWindowClass[MAX_LOADSTRING];// The title bar text
HICON m_hIcon; // Наша иконка 32 x 32
Теперь переходим в функцию WinMain. Здесь мы должны загрузить иконку из ресурсов в переменную m_hIcon. Для этого, после загрузки из ресурсов строк добавь загрузку картинки:
Для загрузки иконки мы используем функцию LoadImage.
Она выглядит так:
HANDLE LoadImage(
HINSTANCE hinst, // дескриптор содержащий изображение
LPCTSTR lpszName, // имя изображения
UINT uType, // тип
int cxDesired, // желаемая ширина
int cyDesired, // желаемая высота
UINT fuLoad // Флаги.
);
Параметр uType может принимать значения:
IMAGE_BITMAP //Загрузить картинку
IMAGE_CURSOR //Загрузить курсор
IMAGE_ICON //Загрузить иконку
Флаги fuLoad могут быть такими:
LR_DEFAULTCOLOR - использовать цвета поумолчанию
LR_CREATEDIBSECTION - когда параметр uType равен IMAGE_BITMAP, функция возвращает DIB компонент растрового изображения. Используется, когда нужно загрузить растр без влияния контекста воспроизведения.
LR_LOADTRANSPARENT - загружать прозрачный растр. Цвет первого пиксела в изображении считается прозрачным.
LR_MONOCHROME - Ззагрузить монохромный растр
LR_SHARED - позволяет разделять загруженый ресурс. Если флаг не установлен, то последующие вызовы заставят загрузить новый вариант изображения.
Теперь отобразим иконку. Для этого переходим в функцию WndProc и ищем обработчик OnPaint:
Рис 2. Пример работы нашей проги
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// TODO: Add any drawing code here...
RECT rt;
GetClientRect(hWnd, &rt);
int cx,cy;
// Fill the client area with icons
for (cx = 0; cx < rt.right; cx += 32)
for (cy = 0; cy < rt.bottom; cy += 32)
DrawIcon(hdc, cx, cy, m_hIcon);
EndPaint(hWnd, &ps);
break;
Здесь мы размножаем системную иконку на весь экран. Для рисования ипользуется функция DrawIcon. На рисунке 2 можно увидеть результат работы программы. Посмотри на иконку программы ( в строке заголовка) и сравни с тем, что размножилось по всей области окна.
Функция DrawIcon достаточно проста и выглядит она так:
BOOL DrawIcon(
HDC hDC, // указатель на контекст рисования
int X, // Х координата от левого верхнего угла
int Y, // Y координата от левого верхнего угла
HICON hIcon // Указатель на иконку
);
Рис 3. Пример курсора.
Теперь давай создадим курсор. и загрузим его в проект. щёлкни правой кнопки на любой папке русурсов и выбери Insert. Дважды щёлкни по пункту Corsor. Visual C++ создаст новый курсор с именем IDC_CURSOR1 и перед тобой появится редактор курсора. Нарисуй что-нибудь. Моё извращение ты можешь увидеть на рис 3.
В разделе Global Variables добавь переменную m_hcur типа HCURSOR:
HCURSOR m_hcur; // Курсор
Загрузка происходит там же где мы загружали иконку:
И наконец добавим обработчик WM_MOUSEMOVE в функции WndProc.
case WM_MOUSEMOVE:
tagPOINT pt;
GetCursorPos(&pt);
if (pt.y<400)
SetCursor(m_hcur);
break;
Здесь происходит проверка. Если вертикальная (Y) позиция мышки меньше 400 (относительно всего экрана, а не твоего окна), то подставить наш курсор. Курсор активизируется с помощью функции SetCursor.