Использование функций курсора для создания мышеловки
Пример ниже использует функции 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; } } |