Курсор менять предельно
просто. Так же, как и иконку. Уже давно продаются диски типа: "Укрась свой
Windows!". Огромные библиотеки иконок, курсоров и др. позволят вашей фантазии
разгуляться хорошенько и сделать вашу программу не похожей на другие.
Снова выберем пункт меню Projects->Add Resource, только теперь выбрем
Cursor. Щёлкнем кнопку New, если хотим нарисовать "с нуля"
или Import, если хотим добавить уже существующий файл **.cur.
Теперь, если мы посмотрим в Solution Explorer или вкладку Resource Files содержимое
проекта, то будем приятно удивлены. У нас добавился идентификатор IDC_CURSOR1.
Поменяем его имя в окне Properties на IDC_MYCURSOR.
Теперь объявим переменную, которая будет содержать имя курсора.
char szProgName[]="Имя программы"; //эта строка
уже была
char szIconName[]="IDI_MYICON"; //здесь мы добавляли иконку
char szCursorName[]="IDC_MYCURSOR" //а эту мы добавим сейчас
И в объявлении структуры WNDCLASS мы тоже поменяем строчку:
w.hCursor=LoadCursor(hInstance,
szCursorName); //теперь у нас подключен пользовательский курсор.
Иногда, когда компилятор не понимает по-хорошему, можно написать код RC-файла
вручную. Вот, как он будет выглядеть, если вы сами будете его создавать сами:
//First1.rc
#include "windows.h"
IDI_MYICON ICON "serdechko.ico"
IDC_MYCURSOR "dagger.cur"
Проверьте, добавили ли вы этот файл в проект.
Кроме пользовательского курсора, мы в любой момент можем поменять стандартную
стрелку на любой другой стандартный курсор:
IDC_CROSS - крестик
IDC_HELP - курсор со знаком вопроса
IDC_ARROW - обычная стрелка
IDC_IBEAM - текстовый курсор I
IDC_NO - перечёркнутый круг
IDC_SIZEALL - четырёхсторонняя стрелка
IDC_SIZENESW - двухсторнняя диагональная стрелка (северо-восток и юго-запад)
IDC_SIZENS - ---//---- (на север и на юг)
IDC_SIZENWSE ---//--- (северо-запад и юго-восток)
IDC_SIZEWE (на запад и на восток)
IDC_UPARROW - вертикальная стрелка
IDC_WAIT - песочные часы
Умело используя эти стрелки, можно занять пользователя, пока сохраняется какой-нибудь
громадный файл проекта, выведя на экран песочные часы, а потом их опять заменив
обычной стрелкой.
Несмотря на то, что в наличии огромные библиотеки анимированных и неподвижных
курсоров, производители программных продуктов не спешат украшать свои программы
красивыми курсорами, предпочитая стандартные. А ведь это могло бы приятно выделить
вашу программу из других однотипных.
Вот полный текст программы в добавленными в него иконкой и курсором:
//Файл First1.cpp
#include<windows.h>
//Создаём прототип
функции окна, которая будет определена ниже
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
//объявляем строку-имя программы
char szProgName[]="Имя программы";
char szIconName[]="IDI_MYICON"; //здесь мы добавляли иконку
char szCursorName[]="IDC_MYCURSOR" //курсор
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow)
{
HWND hWnd;
MSG lpMsg;
WNDCLASS w; //создаём экземпляр структуры WNDCLASS
//И начинаем её заполнять
w.lpszClassName=szProgName; //имя программы - объявлено выше
w.hInstance=hInstance; //идентификатор текущего приложения
w.lpfnWndProc=WndProc; //указатель на функцию окна
w.hCursor=LoadCursor(hInstance, szCursorName); //загружаем курсор
w.hIcon=LoadIcon(hInstance, szIconName); //иконка
w.lpszMenuName=0; //и меню пока не будет
w.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH); //цвет фона окна
w.style=CS_HREDRAW|CS_VREDRAW; //стиль - перерисовываемое по х и по у
w.cbClsExtra=0;
w.cbWndExtra=0;
//Если не удалось зарегистрировать класс
окна - выходим
if(!RegisterClass(&w))
return 0;
//Создадим окно в памяти, заполнив аргументы
CreateWindow
hWnd=CreateWindow(szProgName, //Имя программы
"Моя первая программа!", //Заголовок окна
WS_OVERLAPPEDWINDOW, //Стиль окна - перекрывающееся
100, //положение окна на экране по х
100, //положение по у
500, //ширина
400, //высота
(HWND)NULL, //идентификатор родительского окна
(HMENU)NULL, //идентификатор меню
(HINSTANCE)hInstance, //идентификатор экземпляра программы
(HINSTANCE)NULL); //отсутствие дополнительных параметров
//Выводим окно из памяти на экран
ShowWindow(hWnd, nCmdShow);
//Обновим содержимое окна
UpdateWindow(hWnd);
//Цикл обработки сообщений
while(GetMessage(&lpMsg, NULL, 0,
0)) { //Получаем сообщение из очереди
TranslateMessage(&lpMsg); //Преобразует сообщения клавиш в символы
DispatchMessage(&lpMsg); //Передаёт сообщение соответствующей функции окна
}
return(lpMsg.wParam);
}
//Функция окна
LRESULT CALLBACK WndProc(HWND hWnd, UINT messg,
WPARAM wParam, LPARAM lParam)
{
HDC hdc; //создаём контекст устройства
PAINTSTRUCT ps; //создаём экземпляр структуры графического вывода
//Цикл обработки сообщений
switch(messg)
{
//сообщение рисования
case WM_PAINT :
//начинаем рисовать
hdc=BeginPaint(hWnd, &ps);
//здесь вы обычно вставляете свой текст:
TextOut(hdc, 150,150, "Здравствуй, WIN 32 API!!!!", 26);
//закругляемся
//обновляем окно
ValidateRect(hWnd, NULL);
//заканчиваем рисовать
EndPaint(hWnd, &ps);
break;
//сообщение выхода - разрушение окна
case WM_DESTROY:
PostQuitMessage(0); //Посылаем сообщение выхода с кодом 0 - нормальное завершение
break;
default:
return(DefWindowProc(hWnd, messg, wParam, lParam)); //освобождаем очередь приложения
от нераспознаных
}
return 0;
}
//First1.rc
#include "windows.h"
IDI_MYICON ICON "serdechko.ico"
IDC_MYCURSOR "dagger.cur"
Задание:
1. Попробуйте все стандартные курсоры. Для этого используйте функцию LoadCursor.
Первый аргумент с hInstance замените на NULL.
2. Нарисуйте свою иконку в редакторе ресурсов и вставьте в свою программу -
иногда под рукой может не оказаться диска с иконками, а работа ждать не будет.
3. Создайте свой курсор, хоть отдалённо напоминающий стрелочку и поменяйте на
тот, что был до этого.