В этой главе объясняется, как можно задать вид двух важных элементов, связанных со всеми приложениями Windows: иконки приложения и курсора мыши. В этой главе также показано, как выводить на экран растровые графические изображения.
Иконки, курсоры и растровые изображения являются ресурсами, содержащими графическую информацию. Эти ресурсы создаются с помощью специального графического редактора (чаще всего такой редактор поставляется вместе с компилятором, который может строить программы для Windows). Когда иконка, курсор или растровое изображение созданы в редакторе, соответствующий ресурс должен быть определен в файле ресурсов, связанном с Вашей программой. Наконец, перед использованием этих ресурсов они должны быть загружены программой. Ниже подробно рассматривается, как это сделать.
6.1. Иконка и курсор
Рис. 6.1. Создание иконки Win-приложения в среде Visual C++
Уже отмечалась, что для создания иконки или курсора мыши требуется графический редактор. На рис. 6.1 представлена иконка, создаваемая в среде программирования Visual C++ (оболочка Visual Studio или Developer Studio). Чтобы создать новую иконку, нужно в Visual Studio, через главное меню сделать следующее:
File→New→Files→Icon File.
Соответственно, для создания нового курсора необходимо выполнить:
File→New→Files→Cursor File.
С помощью графического редактора можно увеличивать изображение иконки или курсора мыши, что позволяет легко создавать или редактировать изображение на экране.
Перед использованием в программе и иконку, и курсор необходимо нарисовать. Каждое изображение, созданное при помощи графического редактора, поставляемого с компилятором, должно быть сохранено в отдельном файле.
Когда Вы определите изображения иконки и курсора, понадобится добавить в файл ресурсов операторы ICON и CURSOR. Эти операторы имеют следующий вид:
<ИмяИконки> ICON <имя_файла>
<ИмяКурсора> CURSOR <имя_файла>
Здесь ИмяИконки и ИмяКурсора – имена, идентифицирующие иконку и курсор. Они будут использоваться в программе для обращения к этим ресурсам. Имя_файла задает файл с изображением иконки или курсора. В примерах этой главы пользовательская иконка имеет имя MYICON, а курсор – имя MYCURSOR. Их изображения будут сохраняться в файлах Newicon.ico (иконка) и Newcursor.cur (курсор). Для этого в файл ресурсов необходимо добавить следующие строки:
MYCURSOR CURSOR Newcursor.cur
MYICON ICON Newicon.ico
Изменение иконки и курсора. Как Вы знаете, все приложения Windows прежде всего создают класс окна, определяющий многие атрибуты окна, включая вид иконки приложения и форму курсора мыши. Дескрипторы иконки и курсора записываются в поля hIcon и hCursor структуры WNDCLASS. До сих пор мы использовали только одну из встроенных иконок и курсор, определенные в системе. Чтобы использовать собственные иконку и курсор, Вам необходимо загрузить их перед регистрацией класса окна с помощью функций API LoadIcon() и LoadCursor(), о которых шла речь в гл. 2. Следующий фрагмент программы загружает иконку с именем MYICON, курсор с именем MYCURSOR и запоминает их дескрипторы в соответствующих полях переменной wcl типа WNDCLASS:
wcl.hIcon =Loadlcon (hThisInst, "MYICON"); // Иконка
wcl.hCursor=LoadCursor(hThisInst,"MYCURSOR");// Курсор
Здесь hThisInst является дескриптором именно этой программы. В предыдущих программах книги эти функции применялись для загрузки стандартных иконки и курсора. В данном случае они используются для загрузки иконки и курсора, созданных Вами.
Пример 6-1. Приведенная ниже программа иллюстрирует работу с пользовательскими иконками и курсором. Иконка отображается на месте кнопки системного меню главного окна программы и на панели Списка Задач. Пользовательский курсор используется, когда указатель мыши устанавливается внутри главного окна, то есть стандартный курсор мыши автоматически изменяется на пользовательский при его попадании в область главного окна программы. При перемещении курсора мыши за пределы главного окна программы курсор принимает исходный вид.
Перед компиляцией этой программы не забудьте создать собственные иконку и курсор, используя графический редактор, и затем поместить их описание в файл ресурсов программы.
// Демонстрация пользовательской иконки и курсора мыши
#include <Windows.h>
LRESULT CALLBACK WindowFunc(HWND, UINT, WPARAM,
LPARAM);
char szWinName[]="МоеОкно"; // Имя класса окна
int WINAPI WinMain(HINSTANCE hThisInst,
HINSTANCE hPrevInst,
LPSTR lpszArgs,
int nWinMode)
{
HWND hwnd;
MSG msg;
WNDCLASS wcl; // Определить класс окна
wcl.hInstance=hThisInst; // Дескриптор приложения
wcl.lpszClassName=szWinName;// Имя класса окна
wcl.lpfnWndProc=WindowFunc; // Функция окна
wcl.style=0; // Стиль по умолчанию
wcl.hIcon=LoadIcon(hThisInst,"MYICON"); // Иконка
wcl.hCursor=LoadCursor(hThisInst,"MYCURSOR");//Курс.
wcl.lpszMenuName=NULL; // Без меню
wcl.cbClsExtra=0; // Без дополнительной информации
wcl.cbWndExtra=0;
wcl.hbrBackground=
(HBRUSH)GetStockObject(WHITE_BRUSH); //Белый фон
if(!RegisterClass(&wcl)) // Регистрируем класс окна
return 0;
hwnd=CreateWindow(szWinName, // Создать окно
"Каркас программы для Windows",
WS_OVERLAPPEDWINDOW, // Стиль окна
CW_USEDEFAULT, // x-координата
CW_USEDEFAULT, // y-координата
CW_USEDEFAULT, // Ширина
CW_USEDEFAULT, // Высота
HWND_DESKTOP, // Нет родител. окна
NULL, // Нет меню
hThisInst,// Дескриптор приложения
NULL); // Нет дополнит. аргументов
ShowWindow (hwnd, nWinMode); // Показать окно
UpdateWindow (hwnd); // и перерисовать
while(GetMessage(&msg,NULL,0,0)) // Запустить цикл
{ // обработки сообщений
TranslateMessage(&msg); // Разреш. исп. клавиатуры
DispatchMessage (&msg); // Вернуть управл. Windows
}
return msg.wParam;
}
// Следующая функция вызывается операционной
// системой Windows и получает в качестве
// параметров сообщения из очереди сообщений
// данного приложения
LRESULT CALLBACK WindowFunc(HWND hwnd,
UINT message,
WPARAM wParam,
LPARAM lParam)
{
switch(message)
{
case WM_DESTROY: // Завершение программы
PostQuitMessage (0);
break;
default:
// Все сообщения, не обрабатываемые в
// данной функции, направляются на обработку
// по умолчанию
return DefWindowProc(hwnd,message,
wParam,lParam);
}
return 0;
}
Рис. 6.2. Окно с пользовательской иконкой и курсором
Пользовательская иконка показана на рис. 6.2 (возможно, иконка, созданная Вами, будет выглядеть лучше). Пользовательский курсор будет виден при перемещении мыши внутри главного окна; убедитесь в этом, прежде чем продолжить чтение.