Использование функций курсора для создания мышеловки
Пример ниже использует функции SetCursorPos, GetCursorPos, CreateCursor, LoadCursor и SetCursor, чтобы создать простую мышеловку. В нем также используются функции курсора и таймера, чтобы контролировать позицию курсора каждые 10 секунд. Если позиция курсора не изменилась за последние 10 секунд, а главное окно приложения свернуто, приложение заменяет курсор и перемещает его в значок мышеловки.
Пример подобной мышеловки включен в главу Значки. Он использует функции LoadCursor и LoadIcon вместо более аппаратно-зависимых функций CreateCursor и CreateIcon.
Пример
HICON hIcon1; // дескрипторы значка
POINT ptOld; // предыдущее место курсора
HCURSOR hCurs1; // cursor handle
// Нижеследующие маски курсора определены в коде
// примера, которые применялись раньше в этой главе.
// Маски AND и XOR Инь-образного (черного) курсора.
BYTE ANDmaskCursor[] = ...
BYTE XORmaskCursor[] = ...
// Маска AND Янь-образного (белого) значка
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 Янь-образного (белого) значка
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 and 4
// являются значениями, определяемыми
// программой, чтобы выровнять
// Инь-образный курсор и Янь-образный
// значок.
}
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;
}
}
|