Поделиться через


Сведения о курсорах

Windows предоставляет набор стандартных курсоров , которые могут использоваться приложениями. В WinUser.h определены следующие идентификаторы курсоров:

Значение Значение
IDC_ARROW
MAKEINTRESOURCE(32512)
Обычный выбор
IDC_IBEAM
MAKEINTRESOURCE(32513)
Выбор текста
IDC_WAIT
MAKEINTRESOURCE(32514)
Занят
IDC_CROSS
MAKEINTRESOURCE(32515)
Выбор точности
IDC_UPARROW
MAKEINTRESOURCE(32516)
Альтернативный выбор
IDC_SIZENWSE
MAKEINTRESOURCE(32642)
Размер диагонали 1
IDC_SIZENESW
MAKEINTRESOURCE(32643)
Размер диагонали 2
IDC_SIZEWE
MAKEINTRESOURCE(32644)
Горизонтальное изменение размера
IDC_SIZENS
MAKEINTRESOURCE(32645)
Вертикальное изменение размера
IDC_SIZEALL
MAKEINTRESOURCE(32646)
Переместить
IDC_NO
MAKEINTRESOURCE(32648)
Недоступен
IDC_HAND
MAKEINTRESOURCE(32649)
Выбор ссылки
IDC_APPSTARTING
MAKEINTRESOURCE(32650)
Работа в фоновом режиме
IDC_HELP
MAKEINTRESOURCE(32651)
Выбор справки
IDC_PIN
MAKEINTRESOURCE(32671)
Выбор расположения
IDC_PERSON
MAKEINTRESOURCE(32672)
Выбор пользователя

Также доступно несколько дополнительных курсоров, которые не имеют идентификаторов, определенных в WinUser.h (или считаются устаревшими):

Значение Значение
MAKEINTRESOURCE(32631) Курсор пера.
MAKEINTRESOURCE(32652) Курсор прокрутки со стрелками, указывающими на север и юг.
MAKEINTRESOURCE(32653) Курсор прокрутки со стрелками, указывающими на запад и восток.
MAKEINTRESOURCE(32654) Курсор прокрутки со стрелками, указывающими на север, юг, восток и запад.
MAKEINTRESOURCE(32655) Курсор прокрутки со стрелкой, указывающей на север.
MAKEINTRESOURCE(32656) Курсор прокрутки со стрелкой, указывающей на юг.
MAKEINTRESOURCE(32657) Курсор прокрутки со стрелкой, указывающей на запад.
MAKEINTRESOURCE(32658) Курсор прокрутки со стрелкой, указывающей на восток.
MAKEINTRESOURCE(32659) Курсор прокрутки со стрелками, указывающими на север и запад.
MAKEINTRESOURCE(32660) Курсор прокрутки со стрелками, указывающими на север и восток.
MAKEINTRESOURCE(32661) Курсор прокрутки со стрелками, указывающими на юг и запад.
MAKEINTRESOURCE(32662) Курсор прокрутки со стрелками, указывающими на юг и восток.
MAKEINTRESOURCE(32663) Курсор на компакт-диске со стрелками.

Дополнительные сведения об использовании стандартных курсоров см. в руководстве.

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

Приложение может использовать функцию GetIconInfo для получения текущего изображения для курсора и может нарисовать курсор с помощью функции DrawIconEx.

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

custom cursors, including hand, banana, drum, wristwatch on hand, metronome

Курсоры могут быть монохромными или цветными, а также статическими или анимированными. Тип курсора, используемого в определенной компьютерной системе, зависит от отображения системы. Старые экраны, такие как VGA, не поддерживают цвет или анимированные курсоры. Новые экраны, драйверы отображения которых используют подсистему точечных карт (DIB) независимо от устройства, поддерживают их.

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

В этом обзоре содержатся сведения о следующих разделах:

Горячее место

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

hot spots on two cursors

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

Мышь и курсор

Система отражает движение мыши, перемещая курсор на экране соответствующим образом. При перемещении курсора по разным частям окон или в разные окна система (или приложение) изменяет внешний вид курсора. Например, когда курсор пересекает гиперссылку, система изменяет курсор с стрелки на руку.

standard cursor changing to a hand when over a hyperlink

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

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

Так как стандартные курсоры предопределяются, их не нужно создавать. Чтобы использовать стандартный курсор, приложение извлекает дескриптор курсора с помощью функции LoadCursor или LoadImage. Дескриптор курсора — это уникальное значение типа HCURSOR, определяющего стандартный или настраиваемый курсор.

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

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

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

Функция CreateIconFromResourceEx позволяет приложению создавать значки и курсоры на основе данных ресурсов. CreateIconFromResourceEx создает курсор на основе двоичных данных ресурсов из других исполняемых файлов .exe или БИБЛИОТЕК DLL. Перед ним должны предшествовать вызовы функции LookupIconIdFromDirectoryEx , а также несколько функций ресурсов. LookupIconIdFromDirectoryEx определяет наиболее подходящие данные курсора для текущего устройства отображения. Дополнительные сведения о функциях ресурсов см. в разделе "Ресурсы".

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

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

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

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

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

Функция GetCursorInfo получает следующие сведения для глобального курсора: скрыт ли курсор или отображается, дескриптор курсора и координаты курсора.

Ограничение курсора

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

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

Уничтожение курсора

Можно уничтожить дескриптор курсора и освободить память, используемую курсором, вызвав функцию DestroyCursor. Однако эта функция не влияет на общий курсор. Общий курсор действителен, пока модуль, из которого он был загружен, остается в памяти. Следующие функции получают общий курсор:

Если вам больше не нужен курсор, созданный с помощью функции CreateIconIndirect , необходимо уничтожить курсор. Функция DestroyIcon уничтожает дескриптор курсора и освобождает любую память, используемую курсором. Используйте эту функцию только для курсоров, созданных с помощью CreateIconIndirect.

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

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

Сведения о добавлении, удалении или замене ресурсов курсора в исполняемых файлах см. в разделе "Ресурсы".

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

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

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