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

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

Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Владимир Соковиков.