КАК заменить курсор-стрелку своим курсором?

Курсор менять предельно просто. Так же, как и иконку. Уже давно продаются диски типа: "Укрась свой 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. Создайте свой курсор, хоть отдалённо напоминающий стрелочку и поменяйте на тот, что был до этого.

Назад Главная Вперёд