![]() |
КурсорыНА ЭТОЙ СТРАНЦЕ:О курсорах Горячая точка Мышь и курсор Создание курсоров Управление курсором Ограничение курсора Уничтожение курсора Копирование курсоров Курсор оконного класса Функции для работы с курсорами Структуры для работы с курсорами Сообщения для работы с курсорами Примеры КУРСОР - это маленькая картинка, располагающаяся на экране и управляемая координатно-указательным устройством, таким как мышь, перо или трекбол. В этой статье под термином "мышь" понимается любое координатно-указательное устройство. Когда пользователь перемещает мышь, система, в соответствии с ней, перемещает по экрану курсор. Предоставляемые API-функции для работы с курсорами позволяют создавать, загружать, отображать, анимировать, перемещать и уничтожать курсоры. Windows предоставляет набор стандартных курсоров, которые в любое время доступны к использованию любому приложению. В заголовочных файлах SDK содержаться идентификаторы для стандартных курсоров. Такие идентификаторы начинаются с префикса "IDC_". Каждый стандартный курсор соответствует картинке ассоциированной с ним по умолчанию. Пользователь или приложение может в любое время заменять картинки для стандартных курсоров. Приложение это делает функцией SetSystemCursor. Приложение может получить текущее изображение курсора функцией GetIconInfo, а так же нарисовать его, используя функцию DrawIconEx. Курсоры могут быть монохромными или цветными, статичными или анимированные. Горячая точкаВ каждом курсоре есть пиксель называемый ГОРЯЧЕЙ ТОЧКОЙ. Система отслеживает эту точку и рассматривает ее как позицию курсора. Например, в курсоре в виде стрелки горячая точка располагается на кончике ее острия, а в курсоре в виде перекрестья в его центре.Когда происходит ввод с мыши, драйвер мыши переводит это событие в соответствующее сообщение, в которое записывает координаты горячей точки. Система передает это сообщение окну, в пределах которого находиться горячая точка или окну, захватившему ввод с мыши. Мышь и курсорСистема реагирует на перемещение мыши перемещением в соответствии с ней курсора. При перемещении курсора в различные части окна или в другие окна система или приложение могут изменять внешний вид курсора. Например, при перемещении курсора на рамку окна система изменяет его на двунаправленную стрелку.Если к компьютеру не подключена мышь, система отображает и перемещает курсор только при выборе пользователем некоторых системных команд, таких как изменение размеров окна или его перемещения. Если приложению недоступна мышь, то оно может эмулировать перемещение мыши (а соответственно и курсора) при нажатии пользователем клавиш со стрелками. Создание курсоровТак как стандартные курсоры предопределены системой, то нет необходимости в их создании. Для использования этих курсоров приложение должно получить их описатели используя функцию LoadCursor или LoadImage. ОПИСАТЕЛЬ КУРСОРА это уникальное значение типа HCURSOR, которое является идентификатором курсора.Для создания собственного курсора приложения обычно используется графический редактор, результат работы которого прописывается в файле описания ресурсов. Приложение, во время выполнения, при помощи функции LoadCursor получает описатель курсора (См. Пример 1). Ресурс курсора может содержать данные для различных устройств отображения, из которых LoadCursor автоматически выбирает наиболее подходящие. Для загрузки курсоров не из ресурса, а из файлов типа .cur и .ani, используется функция LoadCursorFromFile. Так же приложение может создавать свои курсоры в течение своего выполнения, используя функцию CreateIconIndirect, которая создает курсор на основе информации структуры ICONINFO (См. Пример 1). Функция GetIconInfo заполняет эту структуру координатами горячей точки и информацией о маске и цвете. Функция CreateIconFromResourceEx позволяет создавать пиктограммы и курсоры на основе данных ресурса другого exe-файла или .DLL. Перед ее вызовом нужно вызвать функцию LookupIconIdFromDirectoryEx, которая среди доступных курсоров находит наиболее подходящий для текущего дисплея. Управление курсоромСистема автоматически управляет курсором, но ваше приложение может получать текущие координаты курсора и самостоятельно перемещать его, используя функции GetCursorPos и SetCursorPos соответственно.Можно получить описатель текущего курсора, используя функцию GetCursor и установить свой функцией SetCursor. После вызова функции SetCursor внешний вид курсора не измениться, пока не переместиться мышь. При перемещении мыши система автоматически перерисовывает курсор на новом месте, изменяя его внешний вид в зависимости от окна над которым он находится. Курсор можно скрывать и отображать на экране функцией ShowCursor. Эта функция использует внутренний счетчик для скрытия и отображения курсора. Если в качестве параметра функции передать TRUE, то счетчик увеличится на единицу, если FALSE - уменьшится на единицу. Курсор отображается на экране, только если значение счетчика равно или превышает ноль. Если к компьютеру подключена мышь, то изначально счетчик инициализируется нулем. Если мышь не подключена то -1 (минус единицей). Вне зависимости от того скрыт курсор или отображен, функция GetCursorInfo определяет описатель глобального курсора и его координаты. Ограничение курсораМожно ограничить перемещение курсора в пределах заданной прямоугольной области функцией ClipCursor. Например, можно удерживать курсор в пределах модального диалогового окна, предотвращая взаимодействие пользователя с другими окнами, пока он не закроет это диалоговое окно.Координаты ограничивающей курсор области можно получить функцией GetClipCursor. Ее можно использовать совместно с ClipCursor, чтобы сохранить координаты первоначальной ограничивающей области. При этом восстановление прежних координат происходит также функцией ClipCursor. Так как в системе допустим только один курсор, то приложение должно освободить его перед передачей управления другому окну. Уничтожение курсораВы можете уничтожить описатель курсора и освободить память, занимаемую им, функцией DestroyCursor. Уничтожаемый курсор должен быть создан функцией CreateIconIndirect или CopyIcon. DestroyCursor не уничтожает разделяемые курсоры. Они существуют пока модуль, из которого он был загружен, остается в памяти. Разделяемые курсоры создаются при использовании следующих функций:LoadCursor LoadCursorFromFile LoadImage (при установленном флаге LR_SHARED) CopyImage (если установлен флаг LR_COPYRETURNORG а в параметре hImage указан описатель разделяемого курсора) Копирование курсоровФункция CopyCursor создает копию описателя курсора. Это позволяет приложению или DLL получать описатели курсоров принадлежащих другим модулям.Курсор оконного классаКогда вы регистрируете оконный класс, используя функцию RegisterClass, вы можете назначить для него курсор по умолчанию, называемый КУРСОРОМ КЛАССА. Назначенную форму курсор автоматически принимает над окнами этого класса. Для того чтобы над окном не применялся курсор класса нужно соответствующим образом обработать сообщение WM_SETCURSOR, которое высылается оконной процедуре при каждом прохождении курсора над одним из ее окон.Курсор класса можно заменить функцией SetClassLong. Эта функция заменяет установки по умолчанию для всех окон указанного класса. Функции для работы с курсорамиClipCursor - ограничивает перемещение курсора в пределах заданной прямоугольной областиCopyCursor - копирует указанный курсор CreateCursor - создает курсор указанного размера, битового образа и горячей точкой DestroyCursor - уничтожает курсор (только неразделяемый) GetClipCursor - получает координаты прямоугольной области ограничивающий перемещение курсора GetCursor - узнает описатель текущего курсора GetCursorInfo - узнает информацию о глобальном курсоре GetCursorPos - узнает позицию курсора LoadCursor - загружает ресурс курсора из исполняемого файла LoadCursorFromFile - создает курсор на основе данных содержащихся в указанном файле SetCursor - устанавливает форму курсора SetCursorPos - перемещает курсор по указанным координаты экрана SetSystemCursor - позволяет приложению изменить системный курсор ShowCursor - отображает или скрывает курсор Структуры для работы с курсорамиCURSORINFO - структура для информации о глобальном курсореСообщения для работы с курсорамиWM_SETCURSOR - это сообщение высылается окну над которым проходит курсор (при не захваченном вводе с мыши)Примеры использования курсоровПример 1 - пример создания курсора в течение выполнения приложения и путем загрузки ресурса.Пример 2 - пример отображения курсора над окном различными способами (назначение курсора оконному классу, отображение другого курсора вместо курсора оконного класса, установка нового курсора для оконного класса) Пример 3 - установка и отмена границ перемещения курсора Пример 4 - управление курсором с клавиатуры |
![]() ![]() ![]() ![]()
![]() |