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


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

В примере ниже используются функции 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;
}
}

 
« Предыдущая статья   Следующая статья »