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


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

 

Назад в оглавление
На главную страницу

Hosted by uCoz