5.10.1 - Создание курсора

Следующий пример создает два дескриптора курсора: один для стандартного курсора в форме песочных часов и второй для пользовательского курсора, включенного как ресурс в файле определения ресурса прикладной программы.

HINSTANCE hinst;           	 		// дескриптор текущего экземпляра программы
HCURSOR hCurs1, hCurs2;    			// дескрипторы курсоров
					// создание стандартного курсора в форме песочных часов
hCurs1 = LoadCursor(NULL, IDC_WAIT);
					// создание индивидуального курсора, основанного на ресурсе
hCurs2 = LoadCursor(hinst, MAKEINTRESOURCE(240));

Вы должны осуществлять пользовательские курсоры как ресурсы. Лучше всего создавать курсоры во время выполнения программы, используя функцию LoadCursor, LoadCursorFromFile или LoadImage, чтобы избежать зависимости от устройства, упростить определение местонахождения и дать возможность приложениям совместно использовать разработку курсора.

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

HINSTANCE hinst;           			// дескриптор текущего экземпляра
HCURSOR hCurs1, hCurs2;     		// дескрипторы курсора
HCURSOR hCurs3;             		// дескриптор курсора
// битовая маска AND для Yin - курсора
// Примечание переводчика: Термин Инь (Yin) происходит из китайской философии, в которой он 
// обозначает темное, женское начало. В этом примере он означает растровый рисунок курсора, в 
котором его изображение представлено черными пикселями
BYTE ANDmaskCursor[] =
{
	0xFF, 0xFC, 0x3F, 0xFF,   // строка1
	0xFF, 0xC0, 0x1F, 0xFF,   // строка 2
	0xFF, 0x00, 0x3F, 0xFF,   // строка 3
	0xFE, 0x00, 0xFF, 0xFF,   // строка 4

	0xF7, 0x01, 0xFF, 0xFF,   // строка 5
	0xF0, 0x03, 0xFF, 0xFF,   // строка 6
	0xF0, 0x03, 0xFF, 0xFF,   // строка 7
	0xE0, 0x07, 0xFF, 0xFF,   // строка 8

	0xC0, 0x07, 0xFF, 0xFF,   // строка 9
	0xC0, 0x0F, 0xFF, 0xFF,   // строка 10
	0x80, 0x0F, 0xFF, 0xFF,   // строка 11
	0x80, 0x0F, 0xFF, 0xFF,   // строка 12

	0x80, 0x07, 0xFF, 0xFF,   // строка 13
	0x00, 0x07, 0xFF, 0xFF,   // строка 14
	0x00, 0x03, 0xFF, 0xFF,   // строка 15
	0x00, 0x00, 0xFF, 0xFF,   // строка 16

	0x00, 0x00, 0x7F, 0xFF,   // строка 17
	0x00, 0x00, 0x1F, 0xFF,   // строка 18
	0x00, 0x00, 0x0F, 0xFF,   // строка 19
	0x80, 0x00, 0x0F, 0xFF,   // строка 20

	0x80, 0x00, 0x07, 0xFF,   // строка 21
	0x80, 0x00, 0x07, 0xFF,   // строка 22
	0xC0, 0x00, 0x07, 0xFF,   // строка 23
	0xC0, 0x00, 0x0F, 0xFF,   // строка 24

	0xE0, 0x00, 0x0F, 0xFF,   // строка 25
	0xF0, 0x00, 0x1F, 0xFF,   // строка 26
	0xF0, 0x00, 0x1F, 0xFF,   // строка 27
	0xF8, 0x00, 0x3F, 0xFF,   // строка 28

	0xFE, 0x00, 0x7F, 0xFF,   // строка 29
	0xFF, 0x00, 0xFF, 0xFF,   // строка 30
	0xFF, 0xC3, 0xFF, 0xFF,   // строка 31
	0xFF, 0xFF, 0xFF, 0xFF    // строка 32
};

// битовая маска XOR для Yin - курсора

BYTE XORmaskCursor[] =
{
	0x00, 0x00, 0x00, 0x00,   // строка 1
	0x00, 0x03, 0xC0, 0x00,   // строка 2
	0x00, 0x3F, 0x00, 0x00,   // строка 3
	0x00, 0xFE, 0x00, 0x00,   // строка 4

	0x0E, 0xFC, 0x00, 0x00,   // строка 5
	0x07, 0xF8, 0x00, 0x00,   // строка 6
	0x07, 0xF8, 0x00, 0x00,   // строка 7
	0x0F, 0xF0, 0x00, 0x00,   // строка 8

	0x1F, 0xF0, 0x00, 0x00,   // строка 9
	0x1F, 0xE0, 0x00, 0x00,   // строка 10
	0x3F, 0xE0, 0x00, 0x00,   // строка 11
	0x3F, 0xE0, 0x00, 0x00,   // строка 12

	0x3F, 0xF0, 0x00, 0x00,   // строка 13
	0x7F, 0xF0, 0x00, 0x00,   // строка 14
	0x7F, 0xF8, 0x00, 0x00,   // строка 15
	0x7F, 0xFC, 0x00, 0x00,   // строка 16

	0x7F, 0xFF, 0x00, 0x00,   // строка 17
	0x7F, 0xFF, 0x80, 0x00,   // строка 18
	0x7F, 0xFF, 0xE0, 0x00,   // строка 19
	0x3F, 0xFF, 0xE0, 0x00,   // строка 20

	0x3F, 0xC7, 0xF0, 0x00,   // строка 21
	0x3F, 0x83, 0xF0, 0x00,   // строка 22
	0x1F, 0x83, 0xF0, 0x00,   // строка 23
	0x1F, 0x83, 0xE0, 0x00,   // строка 24

	0x0F, 0xC7, 0xE0, 0x00,   // строка 25
	0x07, 0xFF, 0xC0, 0x00,   // строка 26
	0x07, 0xFF, 0xC0, 0x00,   // строка 27
	0x01, 0xFF, 0x80, 0x00,   // строка 28

	0x00, 0xFF, 0x00, 0x00,   // строка 29
	0x00, 0x3C, 0x00, 0x00,   // строка 30
	0x00, 0x00, 0x00, 0x00,   // строка 31
	0x00, 0x00, 0x00, 0x00    // строка 32
};

// создание пользовательского курсора в период выполнения.

hCurs3 = CreateCursor(
	hinst,	// экземпляр приложения
	19,	// горизонтальная позиция острия
	2,	// вертикальная позиция острия
	32,	// ширина курсора
	32,	// высота курсора
	ANDmaskCursor,	// битовая маска AND
	XORmaskCursor );	// битовая маска XOR

Чтобы создать курсор, CreateCursor применяет следующую таблицу истинности для битовых масок AND и XOR.

Битовая маска AND 	Битовая маска XOR 	Отображение 
0			0			Черный цвет
0			1			Белый цвет 
1			0			Цвет экрана 
1			1			Цвет обратный экранному

За более полной информацией обратись к статье Битовые маски.

Перед закрытием, вы должны использовать функцию DestroyCursor, чтобы уничтожить любые курсоры, которые вы создали при помощи CreateCursor. Но нет необходимости уничтожать курсоры, созданные другими функциями.


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