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