Win32 API. Курсоры - Использование функций курсора для создания "мышеловки"

ОГЛАВЛЕНИЕ

Использование функций курсора для создания "мышеловки"

В примере ниже используются функции SetCursorPos, GetCursorPos, CreateCursor, LoadCursor и SetCursor для создания простой "мышеловки". В нем используются также функции курсора и таймера для отслеживания позиции курсора каждые 10 секунд. Если позиция курсора не изменялась за последние 10 секунд, а главное окно прикладной программы свернуто, прикладная программа изменяет курсор и перемещает его в пиктограмму "мышеловки".

Пример для простой "мышеловки" включается в Пиктограммы (Icons). В нем используются функции LoadCursor и LoadIcon вместо более аппаратно-зависимых функций CreateCursor и CreateIcon.

HICON hIcon1;               	// дескрипторы иконки
POINT ptOld; // предыдущее расположение курсора
HCURSOR hCurs1; // дескриптор курсора

// Ниже следующие битовые маски курсора определены в примере кода,
// который появлялся ранее в этом разделе.
// битовая маска AND и XOR для Yin курсора


BYTE ANDmaskCursor[] = ...
BYTE XORmaskCursor[] = ...

// битовая маска AND Yang пиктограммы
//Прим. Переводчика:Термин Янь (Yang) происходит из китайской философии, в которой он обозначает
//светлое, мужское начало. В этом примере он означает растровый рисунок курсора, в котором его
//изображение представлено белыми пикселями.


BYTE ANDmaskIcon[] = {
0xFF, 0xFF, 0xFF, 0xFF, // строка 1
0xFF, 0xFF, 0xC3, 0xFF, // строка 2
0xFF, 0xFF, 0x00, 0xFF, // строка 3
0xFF, 0xFE, 0x00, 0x7F, // строка 4

0xFF, 0xFC, 0x00, 0x1F, // строка 5
0xFF, 0xF8, 0x00, 0x0F, // строка 6
0xFF, 0xF8, 0x00, 0x0F, // строка 7
0xFF, 0xF0, 0x00, 0x07, // строка 8

0xFF, 0xF0, 0x00, 0x03, // строка 9
0xFF, 0xE0, 0x00, 0x03, // строка 10
0xFF, 0xE0, 0x00, 0x01, // строка 11
0xFF, 0xE0, 0x00, 0x01, // строка 12

0xFF, 0xF0, 0x00, 0x01, // строка 13
0xFF, 0xF0, 0x00, 0x00, // строка 14
0xFF, 0xF8, 0x00, 0x00, // строка 15
0xFF, 0xFC, 0x00, 0x00, // строка 16

0xFF, 0xFF, 0x00, 0x00, // строка 17
0xFF, 0xFF, 0x80, 0x00, // строка 18
0xFF, 0xFF, 0xE0, 0x00, // строка 19
0xFF, 0xFF, 0xE0, 0x01, // строка 20

0xFF, 0xFF, 0xF0, 0x01, // строка 21
0xFF, 0xFF, 0xF0, 0x01, // строка 22
0xFF, 0xFF, 0xF0, 0x03, // строка 23
0xFF, 0xFF, 0xE0, 0x03, // строка 24

0xFF, 0xFF, 0xE0, 0x07, // строка 25
0xFF, 0xFF, 0xC0, 0x0F, // строка 26
0xFF, 0xFF, 0xC0, 0x0F, // строка 27
0xFF, 0xFF, 0x80, 0x1F, // строка 28

0xFF, 0xFF, 0x00, 0x7F, // строка 29
0xFF, 0xFC, 0x00, 0xFF, // строка 30
0xFF, 0xF8, 0x03, 0xFF, // строка 31
0xFF, 0xFC, 0x3F, 0xFF}; // строка 32

// битовая маска XOR Yang иконки

BYTE XORmaskIcon[] = {
0x00, 0x00, 0x00, 0x00, // строка 1
0x00, 0x00, 0x00, 0x00, // строка 2
0x00, 0x00, 0x00, 0x00, // строка 3
0x00, 0x00, 0x00, 0x00, // строка 4

0x00, 0x00, 0x00, 0x00, // строка 5
0x00, 0x00, 0x00, 0x00, // строка 6
0x00, 0x00, 0x00, 0x00, // строка 7
0x00, 0x00, 0x38, 0x00, // строка 8

0x00, 0x00, 0x7C, 0x00, // строка 9
0x00, 0x00, 0x7C, 0x00, // строка 10
0x00, 0x00, 0x7C, 0x00, // строка 11
0x00, 0x00, 0x38, 0x00, // строка 12

0x00, 0x00, 0x00, 0x00, // строка 13
0x00, 0x00, 0x00, 0x00, // строка 14
0x00, 0x00, 0x00, 0x00, // строка 15
0x00, 0x00, 0x00, 0x00, // строка 16

0x00, 0x00, 0x00, 0x00, // строка 17
0x00, 0x00, 0x00, 0x00, // строка 18
0x00, 0x00, 0x00, 0x00, // строка 19
0x00, 0x00, 0x00, 0x00, // строка 20

0x00, 0x00, 0x00, 0x00, // строка 21
0x00, 0x00, 0x00, 0x00, // строка 22
0x00, 0x00, 0x00, 0x00, // строка 23
0x00, 0x00, 0x00, 0x00, // строка 24

0x00, 0x00, 0x00, 0x00, // строка 25
0x00, 0x00, 0x00, 0x00, // строка 26
0x00, 0x00, 0x00, 0x00, // строка 27
0x00, 0x00, 0x00, 0x00, // строка 28

0x00, 0x00, 0x00, 0x00, // строка 29
0x00, 0x00, 0x00, 0x00, // строка 30
0x00, 0x00, 0x00, 0x00, // строка 31
0x00, 0x00, 0x00, 0x00}; // строка 32

hIcon1 = CreateIcon(
hinst, // дескриптор экземпляра приложения
32, // ширина иконки
32, // высота иконки
1, // число плоскостей XOR
1, // число битов на пиксель
ANDmaskIcon, // битовая маска AND
XORmaskIcon); // битовая маска XOR

hCurs1 = CreateCursor(
hinst, // дескриптор экземпляра приложения
19, // горизонтальная позиция острия
2, // вертикальная позиция острия
32, // ширина курсора
32, // высота курсора
ANDmaskCursor, // битовая маска AND
XORmaskCursor); // битовая маска XOR

// Заполнение полей структуры класса окна

WNDCLASS wc;

wc.hIcon = hIcon1; // иконка класса
wc.hCursor = LoadCursor(NULL, IDC_ARROW); // курсор класса

//
// регистрация класса окна и выполнение других инициализаций программы
//
//
// установка таймера для "мышеловки".


GetCursorPos(&ptOld);

SetTimer(hwnd, IDT_CURSOR, 10000, (TIMERPROC) NULL);

LONG APIENTRY MainWndProc(
HWND hwnd, // дескриптор окна
UINT message, // тип сообщения
UINT wParam, // дополнительная информация
LONG lParam) // дополнительная информация
{
HDC hdc; // дескриптор контекста устройства
POINT pt; // текущее расположение курсора
RECT rc; // превращенное в иконку расположение окна

switch (message)
{
//
// обработка других сообщений.
//


case WM_TIMER:

// если окно свернуто, сравниваем
// текущее положение курсора за 10 секунд до этого
// момента. Если позиция курсора не изменялась,
// перемещаем курсор в иконку.

if (IsIconic(hwnd))
{
GetCursorPos(&pt);
if ((pt.x == ptOld.x) && (pt.y == ptOld.y))
{
GetWindowRect(hwnd, &rc);
SetCursorPos(rc.left + 20, rc.top + 4);

// заметьте, что дополнительные константы
// (20 и 4) значения, определяемые программой
// для выравнивания yin-образного курсора
// и yang-образной иконки.


}
else
{
ptOld.x = pt.x;
ptOld.y = pt.y;
}
}
return 0;

case WM_SETCURSOR:
// если окно свернуто, рисуется hCurs1.
// если окно не свернуто, рисуется курсор по умолчанию
// (курсор класса).


if (IsIconic(hwnd))
{
SetCursor(hCurs1);
break;
}

case WM_DESTROY:
// разрушаем таймер

KillTimer(hwnd, IDT_CURSOR);
PostQuitMessage(0);
break;
}
}