Win32 API. Курсоры

ОГЛАВЛЕНИЕ

Windows предоставляет набор стандартных курсоров, которые являются доступными для любой прикладной программы, чтобы использовать в любое время. Заголовочные файлы Windows содержат идентификаторы для стандартных курсоров - идентификаторы начинаются с префикса "IDC_". Каждый стандартный курсор имеет соответствующее заданное по умолчанию изображение, связанное с ним. Пользователь или прикладная программа могут заменять заданное по умолчанию изображение, связанное с любым стандартным курсором в любое время. Прикладная программа заменяет заданное по умолчанию изображение, используя функцию SetSystemCursor. Прикладная программа может использовать функцию GetIconInfo, чтобы изъять информацию о текущем изображении курсора и может рисовать курсор на экране, используя функцию DrawIconEx. Чтобы нарисовать заданное по умолчанию изображение стандартного курсора при обращении к функции DrawIconEx определите флажок DI_COMPAT. Если вы не определите флажок DI_COMPAT, DrawIconEx рисует стандартный курсор, использующий изображение, которое определил пользователь.

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

Курсоры могут быть или одноцветными или цветными, и или статическими или "живыми". Тип курсора, используемого в отдельной компьютерной системе, зависит от системного дисплея. Старые дисплеи типа VGA не поддерживают цветные или "живые" указатели, однако новые дисплеи (чьи драйверы изображения используют механизм DIB (ФОРМАТ РАСТРОВОГО ИЗОБРАЖЕНИЯ)) поддерживают их.

Курсоры и иконки похожи и могут использоваться для взаимозаменяемости во многих ситуациях. Единственное различие между ними то, что изображение, заданное как курсор должно быть в формате, который дисплей может поддерживать. Например, курсор должен быть одноцветным для дисплея VGA

Острие (Hot Spot)

В курсоре, пиксель называемый острием (hot spot), отмечает точное экранное расположение, на которое воздействует событие мыши, типа щелчка ее кнопки. Как правило, острие - фокус курсора. Система устанавливает и распознает эту отметку как позицию курсора. Например, типичные острия - пиксель на кончике курсора имеющего форму стрелки и пиксель в середине курсора имеющего форму креста.

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

Мышь и курсор

Windows отражает движение мыши, перемещая соответственно курсор на экране. Когда курсор перемешается над различными частями окон или в различных окнах, Windows (или прикладная программа) изменяет вид курсора. Например, когда курсор пересекает границу окна, Windows изменяет курсор в двунаправленную стрелку.

Если система не имеет мыши, Windows показывает на экране и перемещает курсор только тогда, когда пользователь выбирает некоторые системные команды, типа тех, которые используются для установки размера или перемещения окна. Чтобы обеспечить пользователя способом отображения и перемещения курсора, когда мышь не доступна, прикладная программа, может использовать функции курсора, чтобы моделировать движение мыши. Получив эту возможность моделирования, пользователь может использовать клавиши со стрелками на клавиатуре, чтобы перемещать курсор.

 

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

Поскольку стандартные курсоры предопределены, нет необходимости в их создании. Чтобы использовать стандартный курсор, прикладная программа извлекает информацию о дескрипторе курсора, используя функцию LoadCursor или LoadImage. Дескриптор курсора (cursor handle) - уникальное значение типа HCURSOR, которое идентифицирует стандартный или пользовательский курсор.

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

Вы можете также создать пользовательский курсор во время выполнения программы, используя функцию CreateIconIndirect, которая создает курсор, основанный на содержании структуры ICONINFO. Функция GetIconInfo заполняет эту структуру координатами острия и информацией относительно взаимодействия битовой маски (bitmask) и цвета.

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

Функция CreateIconFromResourceEx дает возможность прикладной программе создать пиктограммы и курсоры, основанные на данных ресурса. CreateIconFromResourceEx создает курсор, основанный на двоичных данных ресурса из других исполняемых (.EXE) файлов или динамически подключаемых библиотек (DLLs). Этому должны предшествовать обращения к функции LookupIconIdFromDirectoryEx, также как и к нескольким функциям ресурса. Функция LookupIconIdFromDirectoryEx идентифицирует наиболее соответствующие данные курсора для текущего устройства отображения. Для получения дополнительной информации относительно функций ресурса, см. статью Ресурсы.

 

Расположение и вид курсора

Windows автоматически отображает курсор мыши и модифицирует его позицию на экране. Вы можете получать текущие экранные координаты курсора и перемещать курсор в любое местоположение на экране, используя, соответственно, функции GetCursorPos и SetCursorPos.

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

Когда пользователь перемещает мышь, система перерисовывает курсор в новом местоположении. Система автоматически перерисовывает курсор, на курсор связанный с окном, в котором он является указателем.

Вы можете скрыть и восстановить изображение курсора, без изменения рисунка курсора, используя функцию ShowCursor. Эта функция использует внутренний счетчик для определения, когда скрыть или отобразить курсор. Попытка показать курсор увеличивает счетчик; попытка скрыть курсор уменьшает счетчик. Курсор видим только тогда, если этот счетчик больше или равен нулю.

 

Курсор класса окна

Когда Вы регистрируете класс окна, используя функцию RegisterClass, вы можете назначить ею заданный по умолчанию курсор, известный как курсор класса. После того, как прикладная программа регистрирует класс окна, каждое окно этого класса будет иметь заданный курсор класса (class cursor).

Чтобы отменить курсор класса, обработайте сообщение WM_SETCURSOR. Вы можете также заменить курсор класса, используя функцию SetClassLong. Эта функция изменяет заданные по умолчанию параметры настройки окна для всех окон данного класса. Для получения дополнительной информации, см. раздел Классы окна.


Ограничение свободы движения курсора

Вы можете ограничить курсор прямоугольной областью на экране, используя функцию ClipCursor. Это полезно тогда, когда пользователь должен ответить на достоверное событие внутри области ограниченной прямоугольником. Например, вы можете использовать функцию ClipCursor, чтобы ограничить курсор рамками модального блока диалога, не давая пользователю взаимодействовать с другими окнами, пока диалоговое окно не закрыто.

Функция GetClipCursor извлекает информацию об экранных координатах этой прямоугольной области, в которой курсор временно ограничен. Когда необходимо ограничить курсор, вы можете также использовать эту функцию, чтобы сохранить координаты первоначальной области, в которой курсор может двигаться. Затем, вы можете восстановить курсор в этой первоначальной области, когда в созданном ограничении свободы движения больше нет необходимости.

 

Разрушение курсора

Когда вам больше не нужен курсор, который вы создали, используя функцию CreateIconIndirect, вы должны его уничтожить. Функция DestroyCursor уничтожает дескриптор курсора и освобождает любую память, которую он использовал. Эту функцию используйте только для курсоров, которые были созданы с помощью CreateIconIndirect; вам нет необходимости уничтожать другие курсоры.

Функция DestroyCursor не имеет никакого влияния на общедоступный курсор; то есть курсор, который был загружен при помощи использования флажка LR_SHARED функции LoadImage. Общедоступный курсор допустим, пока модуль, из которого он был загружен, остается в памяти.

 

Дублирование курсора

Функция CopyCursor копирует дескриптор курсора. Это дает возможность прикладной программе или коду DLL извлечь информацию о дескрипторе курсора, принадлежащего другому модулю. Затем, если другой модуль освобождается, модуль, который скопировал курсор, будет все еще получать возможность, чтобы использовать рисунок курсора.

Для информации относительно того, как добавлять, удалять, или заменять ресурсы курсора в исполняемых файлах, см. раздел Ресурсы.

 

Использование курсоров

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

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

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. Но нет необходимости уничтожать курсоры, созданные другими функциями.


Отображение курсора

Windows автоматически отображает курсор класса (курсор, связанный с окном, в котором он указывает). Вы можете назначать курсор класса при регистрации класса окна. Следующий пример иллюстрирует это, назначая дескриптор курсора в элементе hCursor структуры WNDCLASS, идентифицированной параметром wc.

WNDCLASS  wc;
//заполнение структуры класса окна параметрами, которые описывают главное окно.

style = NULL; // стиль(и) класса
wc.lpfnWndProc = (WNDPROC) MainWndProc; // оконная процедура
wc.cbClsExtra = 0; // дополнительных данных в классе нет
wc.cbWndExtra = 0; // дополнительных данных для окна нет
wc.hInstance = hinst; // приложение, которое владеет классом
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); // иконка класса
wc.hCursor = LoadCursor(hinst, MAKEINTRESOURCE(230)); // курсор класса
wc.hbrBackground = GetStockObject(WHITE_BRUSH); // фон класса
wc.lpszMenuName = "GenericMenu"; // меню класса
wc.lpszClassName = "GenericWClass" // имя класса
// регистрация класса окна.
return RegisterClass(&wc);

Когда класс окна зарегистрирован, курсор, идентифицированный как 230 в файле определения ресурса прикладной программы, будет задан по умолчанию как курсор для всех окон, основанных на классе.

Ваша прикладная программа может изменить внешний вид курсора, используя функцию SetCursor и определяя дескриптор другого курсора. Однако, когда курсор перемещается, Windows в новом месте снова рисует курсор класса. Чтобы предотвратить повторный вывод курсора класса, вы должны обрабатывать сообщение WM_SETCURSOR. Каждый раз, когда курсор перемещается, а ввод информации от мыши не захвачен, Windows посылает это сообщению окну, в котором перемещается курсор.

Вы можете устанавливать различные курсоры для различных условий при обработке WM_SETCURSOR. Например, следующий пример показывает, как всякий раз отображать курсор hCurs3, когда он перемещается поверх пиктограммы свернутой прикладной программы.

case WM_SETCURSOR:

// Если окно свернуто рисуется курсор hCurs3.
// Если окно не свернуто, рисуется курсор
// по умолчанию (курсор класса).

if (IsIconic(hwnd))
{
SetCursor(hCurs3);
break;
}

Когда окно не свернуто, Windows отображает курсор класса.

Вы можете заменить курсор класса, используя функцию SetClassLong. Эта функция изменяет заданные по умолчанию параметры настройки окна для всех окон данного класса. В следующем примере заменяется существующий курсор класса на курсор hCurs2.

// изменение курсора класса окна, представляемого hwnd
SetClassLong(hwnd, // дескриптор окна
GCL_HCURSOR, // изменяемый курсор
(LONG) hCurs2); // новый курсор

За более подробной информацией, обратитесь к статьям Классы окна и Информация вводимая от Мыши.

 

Ограничение свободы перемещения курсора

В примере ниже ограничивается перемещение курсора в окне прикладной программы, а затем курсор восстанавливается в его предыдущем окне. В примере используется функция GetClipCursor, чтобы записать область, в которой курсор может передвигаться и функция ClipCursor для ограничения и восстановления курсора.

RECT rcClip;           	// новая область для ClipCursor
RECT rcOldClip; // предыдущая область для ClipCursor
// Запись области, в которой курсор может перемещаться.
GetClipCursor(&rcOldClip);
// Получение габаритов окна приложения.
GetWindowRect(hwnd, &rcClip);
// Ограничение перемещения курсора в окне приложения.
ClipCursor(&rcClip);
//
// Обработка вводимой информации от ограниченного в перемещении курсора.
//
// Возвращение курсора в его предыдущую область.

ClipCursor(&rcOldClip);

Поскольку в системе имеется только один курсор, доступный одновременно, прикладная программа, которая ограничила перемещение курсора, должна восстановить курсор перед отказом от управления им в другом окне.


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

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


Использование клавиатуры для перемещения курсора

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

HCURSOR hCurs1, hCurs2;    			// дескриптор курсора
POINT pt; // расположение курсора
RECT rc; // координаты рабочей области
static int repeat = 1; // счетчик повтора нажатий клавиши

//
// Другие объявления и инициализация.
//


switch (message)
{
//
// Обработка других сообщений.
//

case WM_KEYDOWN:

if (wParam != VK_LEFT && wParam != VK_RIGHT &&
wParam != VK_UP && wParam != VK_DOWN)
{
break;
}

GetCursorPos(&pt);

// Преобразование экранных координат в рабочие координаты.

ScreenToClient(hwnd, &pt);

switch (wParam)
{
// Отображение перемещения курсора, когда
// нажата клавиша курсора.


case VK_LEFT: // стрелка влево
pt.x -= repeat;
break;

case VK_RIGHT: // стрелка вправо
pt.x += repeat;
break;

case VK_UP: // стрелка вверх
pt.y -= repeat;
break;

case VK_DOWN: // стрелка вниз
pt.y += repeat;
break;

default:
return NULL;

}

repeat++; // счетчик увеличения числа повторов на единицу
// Сохранение курсора в рабочей области.


GetClientRect(hwnd, &rc);


if (pt.x >= rc.right)
{
pt.x = rc.right - 1;
}
else
{
if (pt.x < rc.left)
{
pt.x = rc.left;
}
}

if (pt.y >= rc.bottom)
pt.y = rc.bottom - 1;
else
if (pt.y < rc.top)
pt.y = rc.top;

// Преобразование рабочих координат в экранные координаты.

ClientToScreen(hwnd, &pt);
SetCursorPos(pt.x, pt.y);
break;

case WM_KEYUP:

repeat = 1; // очистка счетчика повторений
break;
}


Справочник по Курсору

Следующие функции и сообщения связаны с курсорами. 

Функции курсора

Ниже следуют функции, используемые с курсорами

 

Функция ClipCursor

(ОграничениеКурсора)

Функция ClipCursor ограничивает перемещение курсора в прямоугольной области на экране. Если последующая позиция курсора (установленная функцией SetCursorPos или мышью) лежит снаружи прямоугольника, Windows автоматически корректирует позицию, чтобы сохранить курсор внутри прямоугольной области.

Синтаксис

BOOL ClipCursor
(
CONST RECT *lpRect // указатель на структуру прямоугольника
);

Параметры
lpRect
Указывает на структуру RECT, которая содержит экранные координаты левого верхнего и нижнего правого углов прямоугольника ограничения. Если этот параметр значение ПУСТО (NULL), курсор свободен для передвижения в любое место экрана.

Возвращаемые значения
Если функция завершилась успешно, возвращается значение отличное от нуля.
Если функция потерпела неудачу, возвращаемое значение - ноль. Чтобы получить расширенные данные об ошибках, обратитесь к функции GetLastError.

Замечания
Курсор - общедоступный ресурс. Если прикладная программа ограничивает курсор, она должна освободить курсор, используя ClipCursor перед отказом от управления им в другой прикладной программе.
Вызываемый процесс должен иметь доступ WINSTA_WRITEATTRIBUTES к месту окна.

Смотри также
GetClipCursor, GetCursorPos, RECT, SetCursorPos

Размещение и совместимость ClipCursor

Windows NT			Да 
Win95 Да
Win32s Да
Импортируемая библиотека user32.lib
Заголовочный файл winuser.h
Unicode Нет
Замечания по платформе Не имеется


Функция CopyCursor

(КопированиеКурсора)

Функция CopyCursor копирует курсор.

Синтаксис

HCURSOR CopyCursor
(
HCURSOR pcur // дескриптор копируемого курсора
);

Параметры
pcur
Идентификатор копируемого курсора.

Возвращаемые значения
Если функция завершается успешно, возвращаемое значение - дескриптор дубликата курсора.
Если функция не выполняет задачу, возвращаемое значение ПУСТО (NULL). Чтобы получить расширенные данные об ошибках, вызовите GetLastError.

Замечания
Функция CopyCursor дает возможность прикладной программе или динамически подключаемой библиотеке (DLL) получить дескриптор образца курсора, принадлежащий другому модулю. И даже тогда, когда другой модуль освобождается, прикладная программа все еще способна использовать этот образец курсора.

Смотри также
CopyIcon, GetCursor, SetCursor, ShowCursor

Размещение и совместимость CopyCursor

Windows NT			Да 
Win95 Да
Win32s Да
Импортируемая библиотека user32.lib
Заголовочный файл winuser.h
Unicode Нет
Замечания по платформе Не имеется

 

Функция CreateCursor

(СоздатьКурсор)

Функция CreateCursor создает курсор, имеющий заданный размер, битовые шаблоны и острие.

Синтаксис

HCURSOR CreateCursor
(
HINSTANCE hInst, // дескриптор экземпляра программы
int xHotSpot, // позиция острия по горизонтали
int yHotSpot, // позиция острия по вертикали
int nWidth, // ширина курсора
int nHeight, // высота курсора
CONST VOID *pvANDPlane, // указатель на массив битовой маски AND
CONST VOID *pvXORPlane // указатель на массив битовой маски XOR
);

Параметры
hInst
Идентифицирует текущий образец прикладной программы, создающей курсор.
xHotSpot
Определяет горизонтальную позицию острия курсора.
yHotSpot
Определяет вертикальную позицию острия курсора.
nWidth
Устанавливает ширину курсора в пискелях.
nHeight
Устанавливает высоту курсора в пискелях.
pvANDplane
Указывает на массив байтов, который содержит битовые значения битовой маски AND для курсора, как в аппаратно-зависимом одноцветном точечном рисунке.
pvXORplane
Указывает на массив байтов, который содержит битовые значения битовой маски XOR для курсора, как в аппаратно-зависимом одноцветном точечном рисунке.

Возвращаемые значения
Если функция завершается успешно, возвращаемое значение идентифицирует курсор.
Если функция не выполняет задачу, возвращаемое значение ПУСТО (NULL). Чтобы получить расширенные данные об ошибках, вызовите GetLastError.

Замечания
Параметры nWidth и nHeight должны установить ширину и высоту, которые поддерживаются текущим драйвером дисплея, потому что система не может создать курсоры других размеров. Чтобы определить ширину и высоту, поддерживаемую драйвером дисплея, используйте функцию GetSystemMetrics, установив значение SM_CXCURSOR или SM_CYCURSOR.
Перед закрытием, приложение должно вызвать функцию DestroyCursor, чтобы освободить любые ресурсы системы, связанные с курсором.

Смотри также
CreateIcon, DestroyCursor, GetModuleHandle, GetSystemMetrics, SetCursor

Размещение и совместимость CreateCursor

Windows NT			Да 
Win95 Да
Win32s Да
Импортируемая библиотека user32.lib
Заголовочный файл winuser.h
Unicode Нет
Замечания по платформе Не имеется


Функция DestroyCursor

(РазрушитьКурсор)

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

Синтаксис

BOOL DestroyCursor
(
HCURSOR hCursor // дескриптор курсора, который разрушается
);

Параметры
hCursor
Идентифицирует курсор, который будет разрушен. Курсор не должен быть в использовании.

Возвращаемые значения
Если функция завершилась успешно, возвращается значение отличное от нуля.
Если функция потерпела неудачу, возвращаемое значение - ноль. Чтобы получить расширенные данные об ошибках, обратитесь к функции GetLastError.

Смотри также
CreateCursor

Размещение и совместимость DestroyCursor.

Windows NT			Да 
Win95 Да
Win32s Да
Импортируемая библиотека user32.lib
Заголовочный файл winuser.h
Unicode Нет
Замечания по платформе Не имеется

 

Функция GetClipCursor

(ПолучитьОграничениеКурсора)

Функция GetClipCursor извлекает информацию об экранных координатах прямоугольной области, в которой ограничен курсор.

Синтаксис

BOOL GetClipCursor
(
LPRECT lpRect // адрес структуры для прямоугольника
);

Параметры
lpRect
Указывает на структуру RECT, которая принимает экранные координаты прямоугольника ограничения. Структура принимает габариты экрана, если курсор не ограничен в прямоугольнике.

Возвращаемые значения
Если функция завершилась успешно, возвращается значение отличное от нуля.
Если функция потерпела неудачу, возвращаемое значение - ноль. Чтобы получить расширенные данные об ошибках, обратитесь к функции GetLastError.

Замечания
Курсор - общедоступный ресурс. Если прикладная программа ограничивает курсор при помощи функции ClipCursor, она позже должна освободить курсор, используя ClipCursor перед отказом от управления им в другой прикладной программе.
Процесс вызова должен иметь указатель WINSTA_READATTRIBUTES на местоположение окна.

Смотри также
ClipCursor, GetCursorPos, RECT

Размещение и совместимость GetClipCursor

Windows NT			Да 
Win95 Да
Win32s Да
Импортируемая библиотека user32.lib
Заголовочный файл winuser.h
Unicode Нет
Замечания по платформе Не имеется


Функция GetCursor

(ПолучитьКурсор)

Функция GetCursor извлекает информацию о дескрипторе текущего курсора.

Синтаксис

HCURSOR GetCursor(VOID)

Параметры
У этой функции нет параметров.

Возвращаемые значения
Если функция завершается успешно, возвращаемое значение - дескриптор текущего курсора.
Если не имеется никакого курсора, возвращаемое значение ПУСТО (NULL).

Смотри также
SetCursor

Размещение и совместимость GetCursor

Windows NT			Да 
Win95 Да
Win32s Да
Импортируемая библиотека user32.lib
Заголовочный файл winuser.h
Unicode Нет
Замечания по платформе Не имеется


Функция GetCursorPos

(ПолучитьПозициюКурсора)

Функция GetCursorPos извлекает информацию о позиции курсора, в экранных координатах.

Синтаксис

BOOL GetCursorPos
(
LPPOINT lpPoint // адрес структуры, где позиция курсора
);

Параметры
lpPoint
Указывает на структуру POINT, которая принимает экранные координаты курсора.

Возвращаемые значения
Если функция завершилась успешно, возвращается значение отличное от нуля.
Если функция потерпела неудачу, возвращаемое значение - ноль. Чтобы получить расширенные данные об ошибках, обратитесь к функции GetLastError.

Замечания
Позиция курсора всегда дается в экранных координатах и не находится под влиянием режима отображения окна, которое содержит курсор.
Процесс вызова должен иметь указатель WINSTA_READATTRIBUTES на местоположение окна.

Смотри также
ClipCursor, POINT, SetCursor, SetCursorPos, ShowCursor

Размещение и совместимость GetCursorPos

Windows NT			Да 
Win95 Да
Win32s Да
Импортируемая библиотека user32.lib
Заголовочный файл winuser.h
Unicode Нет
Замечания по платформе Не имеется


Функция LoadCursor

(ЗагрузитьКурсор)

Функция LoadCursor загружает заданный ресурс курсора из (.EXE) файла выполняемой программы, связанной с экземпляром прикладной программы.

Синтаксис

HCURSOR LoadCursor
(
HINSTANCE hInstance, // дескриптор экземпляра приложения
LPCTSTR lpCursorName // идентификатор названия строки или ресурса курсора
);

Параметры
hInstance
Идентифицирует экземпляр модуля, исполняемый файл которого содержит курсор, который будет загружен.
lpCursorName
Указывает на строку с символом нуля в конце, содержащую имя ресурса курсора, который будет загружен. Или же, этот параметр может состоять из идентификатора ресурса, в младшем слове и нуля в старшем слове. Может также использоваться макрокоманда MAKEINTRESOURCE, чтобы создать это значение.
Чтобы использовать предопределенный курсор Win32, прикладная программа должна установить параметр hInstance в значение ПУСТО (NULL), а параметр lpCursorName в одно из следующих значений:

  • IDC_APPSTARTING - Стандартная стрелка и маленькие песочные часы
  • IDC_ARROW - Стандартная стрелка
  • IDC_CROSS - Перекрестие
  • IDC_IBEAM - I-прямая вертикальная линия для текста
  • IDC_ICON - Только для Windows NT: Пустая иконка
  • IDC_NO - Перечеркнутый круг
  • IDC_SIZE - Только для Windows NT: Четырех направленная стрелка
  • IDC_SIZEALL - Подобно IDC_SIZE
  • IDC_SIZENESW - Двунаправленная стрелка, указывающая северо-восток и юго-запад
  • IDC_SIZENS - Двунаправленная стрелка, указывающая север и юг
  • IDC_SIZENWSE - Двунаправленная стрелка, указывающая северо-запад и юго-восток
  • IDC_SIZEWE - Двунаправленная стрелка, указывающая запад и восток
  • IDC_UPARROW - Вертикальная стрелка
  • IDC_WAIT - Песочные часы

Возвращаемые значения
Если функция завершается успешно, возвращаемое значение - дескриптор недавно загруженного курсора.
Если функция не выполняет задачу, возвращаемое значение ПУСТО (NULL). Чтобы получать расширенные данные об ошибках, вызовите GetLastError

Замечания
LoadCursor загружает только ресурс курсора, если он не был загружен; иначе, функция извлекает дескриптор существующего ресурса. Эта функция возвращает допустимое значение дескриптора курсора только тогда, если параметр lpCursorName указывает на ресурс курсора. Если lpCursorName указывает на какой-либо тип ресурса отличающегося от курсора (например, пиктограммы), возвращаемое значение не ПУСТО (NULL), даже притом, что это не правильный дескриптор курсора.
Функция LoadCursor ищет ресурс курсора наиболее соответствующий курсору для текущего устройства отображения. Ресурс курсора может быть цветной или одноцветный точечный рисунок.

Смотри также
LoadImage, MAKEINTRESOURCE, SetCursor, SetCursorPos, ShowCursor

Размещение и совместимость LoadCursor

Windows NT			Да 
Win95 Да
Win32s Да
Импортируемая библиотека user32.lib
Заголовочный файл winuser.h
Unicode WinNT
Замечания по платформе Не имеется


Функция LoadCursorFromFile

(ЗагрузитьКурсорИзФайла)

Функция LoadCursorFromFile создает курсор, основанный на данных, содержащихся в файле. Файл определен его именем или идентификатором курсора системы. Функция возвращает значение дескриптора недавно созданного курсора. Файлы, содержащие данные курсора могут быть или в формате курсора (.CUR) или "живого указателя" (.ANI).

Синтаксис

HCURSOR LoadCursorFromFile 
(
LPCTSTR lpFileName // указатель на имя файла курсора или
// на идентификатор системного курсора

);

Параметры
lpFileName
Указывает источник данных файла, которые нужно использовать, чтобы создать курсор. Данные в файле должны быть или в формате .ANI или .CUR.
Если старшее слово LoadCursorFromFile отлично от нуля, это - указатель на строку, которая является полностью составным именем файла, содержащего данные курсора.
Если старшее слово lpszFileName нулевое, младшее слово является идентификатором курсора системы. Затем функция ищет входную точку [Cursors] в файле WIN.INI для файла, связанного с именем этого курсора системы. Имеется список имен курсоров системы и идентификаторов:

Имена Системных Курсоров							Идентификаторы Системных Курсоров
"Arrow" -стрелка OCR_NORMAL
"IBeam" - I - образная линия OCR_IBEAM
"Wait" - ждать (песочные часы) OCR_WAIT
"Crosshair" -крест OCR_CROSS
"UpArrow" -стрелка вверх OCR_UP
"Size" -двунаправленная стрелка OCR_SIZE
"Icon" - пиктограмма OCR_ICON
"SizeNWSE" - двунаправленная стрелка северо-запад - юго-восток OCR_SIZENWSE
"SizeNESW" - двунаправленная стрелка северо-восток - юго-запад OCR_SIZENESW
"SizeWE" -двунаправленная стрелка запад-восток OCR_SIZEWE
"SizeNS" - - двунаправленная стрелка север-юг OCR_SIZENS
"SizeAll" -крест из стрелок OCR_SIZEALL
"No" OCR_NO
"AppStarting" OCR_APPSTARTING

Например, если WIN.INI файл содержит следующее:

[Cursors]
Arrow = "arrow.ani"

Тогда вызывается

LoadCursorFromFile((LPWSTR)OCR_NORMAL),

что заставляет функцию LoadCursorFromFile получить данные курсора из файла ARROW.ANI. Если файл WIN.INI не содержит входной точки для заданного курсора системы, функция не выполняет задачу и возвращает значение ПУСТО (NULL).

Возвращаемые значения
Если функция завершается успешно, возвращаемое значение - дескриптор нового курсора.
Если функция не выполняет задачу, возвращаемое значение ПУСТО (NULL). Чтобы получать расширенные данные об ошибках, вызовите функцию GetLastError.
Функция GetLastError может возвратить следующее значение:

  • ERROR_FILE_NOT_FOUND - Невозможно найти заданный файл

Смотри также
LoadCursor, SetCursor, SetSystemCursor

Размещение и совместимость LoadCursorFromFile

Windows NT			Да 
Win95 Да
Win32s Да
Импортируемая библиотека user32.lib
Заголовочный файл winuser.h
Unicode WinNT
Замечания по платформе Не имеется


Функция SetCursor

(УстановитьКурсор)

Функция SetCursor устанавливает форму курсора.

Синтаксис

HCURSOR SetCursor
(
HCURSOR hCursor // дескриптор курсора
);

Параметры
hCursor
Идентифицирует курсор. Курсор, должен быть создан функцией CreateCursor или загружен функцией LoadCursor или LoadImage. Если этот параметр имеет значение ПУСТО (NULL), курсор удаляется с экрана.
Windows 95: ширина и высота курсора должны быть значениями, возвращенными функцией GetSystemMetrics для SM_CXCURSOR и SM_CYCURSOR. Кроме того, битовая глубина резко изображаемого пространства курсора должна соответствовать битовой глубине резко изображаемого пространства дисплея, или курсор должен быть одноцветен.

Возвращаемые значения
Возвращаемое значение - дескриптор предыдущего курсора, если тот имелся.
Если не было никакого предыдущего курсора, возвращаемое значение ПУСТО (NULL).

Замечания
Курсор устанавливается только тогда, если новый курсор отличается от предыдущего курсора; иначе, функция немедленно возвращает значение.
Курсор - общедоступный ресурс. Окно должно устанавливать форму курсора только тогда, когда курсор находится в его рабочей области или когда окно захватило ввод мыши. В системах без мыши, окно должно восстановить предыдущий курсор до того, как курсор оставит рабочую область или до того, как система предоставит управление другому окну.
Если ваша прикладная программа должна установить курсор, в то время когда оно находится в окне, удостоверитесь, что курсор класса в классе определяемого окна установлен в значение ПУСТО (NULL). Если курсор класса не ПУСТО (NULL), система восстанавливает курсор класса, каждый раз, когда перемещается мышь.
Курсор не показывается на экране, если внутренний счетчик отображения курсора - меньше чем нуль. Это происходит тогда, если прикладная программа использует функцию ShowCursor для сокрытия курсора большее количество времени, чем для показа курсора.

Смотри также
CreateCursor, GetCursor, GetSystemMetrics, LoadCursor, LoadImage, SetCursorPos, ShowCursor

Размещение и совместимость SetCursor

Windows NT				Да 
Win95 Да
Win32s Да
Импортируемая библиотека user32.lib
Заголовочный файл winuser.h
Unicode Нет
Замечания по платформе Не имеется


Функция SetCursorPos

(УстановитьПозициюКурсора)

Функция SetCursorPos перемещает курсор в заданные экранные координаты. Если новые координаты не внутри экранного прямоугольника, установленного самой последней функцией ClipCursor, Windows автоматически корректирует координаты так, чтобы курсор остался внутри прямоугольника.

Синтаксис

BOOL SetCursorPos
(
int X, // позиция по горизонтали
int Y // позиция по вертикали
);

Параметры
X
Устанавливает новую x-координату, в экранных координатах, курсора.
Y
Устанавливает новую y-координату, в экранных координатах, курсора.

Возвращаемые значения
Если функция завершилась успешно, возвращается значение отличное от нуля.
Если функция потерпела неудачу, возвращаемое значение - ноль. Чтобы получить расширенные данные об ошибках, обратитесь к функции GetLastError.

Замечания
Курсор - общедоступный ресурс. Окно должно перемещать курсор, только тогда, когда курсор находится в его рабочей области.
Процесс вызова должен иметь указатель WINSTA_WRITEATTRIBUTES местоположение окна.

Смотри также
ClipCursor, GetCursorPos, SetCaretPos, SetCursor, ShowCursor

Размещение и совместимость SetCursorPos

Windows NT			Да 
Win95 Да
Win32s Да
Импортируемая библиотека user32.lib
Заголовочный файл winuser.h
Unicode Нет
Замечания по платформе Не имеется


Функция SetSystemCursor

(УстановитьСистемныйКурсор)

Функция SetSystemCursor заменяет содержимое системного курсора, заданного идентификатором id содержимым курсора, заданного hcur, и затем уничтожает hcur. Эта функция позволяет прикладной программе настраивать курсоры системы.

Синтаксис

BOOL SetSystemCursor 
(
HCURSOR hcur, // устанавливает заданный курсор системы в содержимом этого
//курсора, эатем уничтожает его

DWORD id // курсор системы, заданный его идентификатором
);

Параметры
hcur
Дескриптор курсора. Функция заменяет содержимое курсора системы, заданного идентификатором id, содержимым курсора, обработанного при помощи hcur. Затем функция уничтожает hcur, вызывая DestroyCursor (hCursor).
id
Идентификатор курсора системы. Функция заменяет содержимое этого курсора системы содержимым курсора, обработанного при помощи hcur.
Ниже следует список идентификаторов курсоров системы:

  • OCR_NORMAL - Обычный курсор-стрелка
  • OCR_IBEAM - I-образный курсор
  • OCR_WAIT - Курсор в виде больших песочных часов
  • OCR_CROSS - Курсор в виде креста
  • OCR_UP - Курсор стрелка вверх
  • OCR_SIZE - Курсор размера (четырех направленная стрелка)
  • OCR_ICON - Курсор в виде пиктограммы
  • OCR_SIZENWSE - Курсор изменения размера (двунаправленная стрелка СЗ - ЮВ)
  • OCR_SIZENESW - Курсор изменения размера (двунаправленная стрелка СВ - ЮЗ)
  • OCR_SIZEWE - Курсор изменения размера по горизонтали
  • OCR_SIZENS - Курсор изменения размера по вертикали
  • OCR_SIZEALL - Курсор изменения размера по вертикали и горизонтали
  • OCR_SIZENO - Международный символ отсутствия курсора
  • OCR_APPSTARTING - Курсор в виде стрелки с маленькими песочными часами

Возвращаемые значения
Если функция завершилась успешно, возвращается значение отличное от нуля.
Если функция потерпела неудачу, возвращаемое значение - ноль. Чтобы получить расширенные данные об ошибках, обратитесь к функции GetLastError.

Смотри также
DestroyCursor, LoadCursor, LoadCursorFromFile, SetCursor

Размещение и совместимость SetSystemCursor

Windows NT				Да 
Win95 Да
Win32s Да
Импортируемая библиотека user32.lib
Заголовочный файл winuser.h
Unicode Нет
Замечания по платформе Не имеется


Функция ShowCursor

(ПоказатьКурсор)

Функция ShowCursor отображает или скрывает курсор.

Синтаксис

int ShowCursor
(
BOOL bShow // флажок видимости курсора
);

Параметры
bShow
Определяет, должен ли внутренний счетчик отображения быть увеличен или уменьшен. Если bShow - ИСТИНА (TRUE), счет дисплея увеличивается на единицу. Если bShow - ЛОЖЬ(FALSE), счет дисплея уменьшается на единицу.

Возвращаемые значения
Возвращаемое значение устанавливает новый счетчик отображения.

Замечания
Эта функция устанавливает внутренний счетчик отображения, который определяет, должен ли курсор отображаться. Курсор отображается только тогда, если счетчик отображения больше чем 0 или равен 0. Если инсталлирована мышь, начальное значение счетчика отображения - 0. Если никакая мышь не установлена, начальное значение счетчика отображения -(минус)1.

Смотри также
ClipCursor, GetCursorPos, SetCursor, SetCursorPos

Размещение и совместимость ShowCursor

Windows NT			Да 
Win95 Да
Win32s Да
Импортируемая библиотека user32.lib
Заголовочный файл winuser.h
Unicode Нет
Замечания по платформе Не имеется


Сообщения курсора

Следующее сообщение используется курсорами

 

Сообщение WM_SETCURSOR

Сообщение WM_SETCURSOR посылается окну, если мышь вынуждает курсор двигаться внутри окна, а ввод данных от мыши не перехватывается.

Синтаксис

WM_SETCURSOR  
hwnd = (HWND) wParam; // дескриптор окна с курсором
nHittest = LOWORD(lParam); //код местоположения курсора (hit-test code)
wMouseMsg = HIWORD(lParam); // идентификатор сообщения мыши

Параметры
hwnd
Значение wParam. Идентифицирует окно, которое содержит курсор.
nHittest
Значение младшего слова lParam. Определяет код местоположения курсора.
wMouseMsg
Значение старшего слова lParam. Определяет идентификатор сообщения мыши.

Действие по умолчанию
Функция DefWindowProc, перед обработкой, передает сообщение WM_SETCURSOR родительскому окну. Если родительское окно возвращает ИСТИНА (TRUE), дальнейшая обработка останавливается. Передача сообщения родительскому окну дает ему контроль над установкой курсора в дочернем окне. Функция DefWindowProc также использует это сообщение для того, чтобы установить курсор в виде стрелке, если он не в рабочей области, или в виде зарегистрированного курсора класса, если он находится в рабочей области. Если младшее слово параметра lParam - HTERROR, а старшее слово lParam определяет, что одна из кнопок мыши нажата, DefWindowProc вызывает функцию MessageBeep.

Замечания
Старшее слово lParam имеет значение ноль тогда, когда окно вводит режим меню.

Смотри также
DefWindowProc, MessageBeep

Размещение и совместимость WM_SETCURSOR

Windows NT			Да 
Win95 Да
Win32s Да
Импортируемая библиотека -
Заголовочный файл winuser.h
Unicode Нет
Замечания по платформе Не имеется