c6141e49

Файл cursor\wndproc.cpp


// ===================================== // Функция WndProc // =====================================

#define STRICT #include <windows.h>
#include <stdio.h>

extern HINSTANCE hInst;

LRESULT CALLBACK _export WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { HDC hdc; // индекс контекста устройства PAINTSTRUCT ps; // структура для рисования

// Размеры курсора static int xCursor, yCursor;

// Идентификатор курсора HCURSOR hCursor;

switch (msg) { case WM_CREATE: { // Определяем размеры курсора xCursor = GetSystemMetrics(SM_CXCURSOR);
yCursor = GetSystemMetrics(SM_CYCURSOR);
break; }

case WM_PAINT: { hdc = BeginPaint(hwnd, &ps);

// Загружаем и рисуем встроенные курсоры hCursor = LoadCursor(0, IDC_ARROW);
DrawIcon(hdc, xCursor/2, yCursor/2, hCursor);

hCursor = LoadCursor(0, IDC_IBEAM);
DrawIcon(hdc, xCursor/2 + xCursor, yCursor/2, hCursor);

hCursor = LoadCursor(0, IDC_WAIT);
DrawIcon(hdc,xCursor/2 + xCursor*2,yCursor/2, hCursor);

hCursor = LoadCursor(0, IDC_CROSS);
DrawIcon(hdc,xCursor/2 + xCursor*3,yCursor/2, hCursor);

hCursor = LoadCursor(0, IDC_UPARROW);
DrawIcon(hdc,xCursor/2 + xCursor*4,yCursor/2, hCursor);

hCursor = LoadCursor(0, IDC_SIZE);
DrawIcon(hdc,xCursor/2 + xCursor*5,yCursor/2, hCursor);

hCursor = LoadCursor(0, IDC_ICON);
DrawIcon(hdc,xCursor/2 + xCursor*6,yCursor/2, hCursor);

hCursor = LoadCursor(0, IDC_SIZENWSE);
DrawIcon(hdc,xCursor/2 + xCursor*7,yCursor/2, hCursor);

hCursor = LoadCursor(0, IDC_SIZENESW);
DrawIcon(hdc,xCursor/2 + xCursor*8,yCursor/2, hCursor);

hCursor = LoadCursor(0, IDC_SIZEWE);
DrawIcon(hdc,xCursor/2 + xCursor*9,yCursor/2, hCursor);

hCursor = LoadCursor(0, IDC_SIZENS);
DrawIcon(hdc,xCursor/2 + xCursor*10,yCursor/2,hCursor);

// Загружаем и рисуем свой курсор, // указанный в файле описания ресурсов hCursor = LoadCursor(hInst, "AppCursor");
DrawIcon(hdc,xCursor/2, yCursor/2 + yCursor*2,hCursor);

EndPaint(hwnd, &ps);
return 0; }

case WM_DESTROY: { PostQuitMessage(0);
return 0; } } return DefWindowProc(hwnd, msg, wParam, lParam);
}

Обратите внимание на способ, при помощи которого функция окна рисует изображение курсора. Вначале она получает идентификатор курсора, вызывая функцию LoadCursor:

hCursor = LoadCursor(0, IDC_ARROW);

Затем функция окна рисует курсор при помощи функции DrawIcon, передавая ей в качестве второго параметра полученный идентификатор курсора.

DrawIcon(hdc, xCursor/2, yCursor/2, hCursor);

При создании окна функции окна передается сообщение WM_CREATE, которое используется для получения размеров курсора. С этой целью обработчик сообщения вызывает рассмотренную нами ранее функцию GetSystemMetrics:

case WM_CREATE: { xCursor = GetSystemMetrics(SM_CXCURSOR);
yCursor = GetSystemMetrics(SM_CYCURSOR);
break; }

Файл определения модуля для приложения CURSOR представлен в листинге 1.17.



Содержание раздела