Курсор мыши
В отличие от текстового курсора курсор мыши можно перемещать не только с помощью специальных функций, но и вручную (было бы странно, если курсор мыши нельзя было бы перемещать вручную).
Вы также можете изменять форму курсора мыши. Можно определить форму курсора (или, иными словами, определить курсор) при регистрации класса окна или изменить ее в любое время в процессе работы приложения.
При регистрации класса окна мы задавали форму курсора следующим способом:
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
Второй параметр функции LoadCursor в нашем случае выбирает одну из предопределенных форм курсора, а именно стандартный курсор в виде стрелки. Возможные значения для выбора предопределенных форм курсора представлены ниже.
Символическое имя | Описание |
IDC_ARROW | Стандартный курсор в виде стрелки |
IDC_CROSS | Курсор в виде перекрещивающихся линий |
IDC_IBEAM | Текстовый курсор в виде буквы "I" |
IDC_ICON | Пустая пиктограмма |
IDC_SIZE | Курсор в виде четырех стрелок, указывающих в разных направлениях |
IDC_SIZENESW | Двойная стрелка, указывающая в северо-восточном и юго-западном направлении |
IDC_SIZENS | Двойная стрелка, указывающая в севером и южном направлении |
IDC_SIZENWSE | Двойная стрелка, указывающая в северо-западном и юго-восточном направлении |
IDC_SIZEWE | Двойная стрелка, указывающая в восточном и западном направлении |
IDC_UPARROW | Вертикальная стрелка |
IDC_WAIT | Курсор в виде песочных часов |
Вы можете попробовать изменить курсор в любом из уже рассмотренных нами ранее приложений, создающих окна.
Забегая вперед, скажем, что вы можете создать курсор произвольной формы с помощью такого средства, как Borland Resource Workshop или Microsoft SDK. В этом случае вы должны нарисовать курсор в виде небольшой картинки, состоящей из отдельных точек. Эта картинка создается специальным графическим редактором и сохраняется в файле с расширением .cur. Затем файл подключается к ресурсам приложения, которые записываются в исполняемый exe-файл. Каждый ресурс в файле имеет свой идентификатор.
Вы можете изменить форму курсора, если укажете идентификатор ресурса, соответствующего новому изображению курсора.
Для того чтобы можно было изменить форму курсора, прежде всего надо загрузить новый курсор при помощи функции LoadCursor, которая входит в программный интерфейс Windows:
HCURSOR WINAPI LoadCursor(HINSTANCE hinst, LPCSTR lpszCursor);
Для загрузки нового курсора из ресурсов приложения в качестве первого параметра (hinst) необходимо указать идентификатор приложения, полученный через параметры функции WinMain. Второй параметр (lpszCursor) при этом должен указывать на идентификатор ресурса. Подробнее об использовании ресурсов мы поговорим позже в отдельной главе.
Если же в качестве первого параметра указать значение NULL, для загрузки курсора можно использовать перечисленные выше символические имена с префиксом IDC_. Именно так мы и поступаем при регистрации класса окна:
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
Функция LoadCursor возвращает идентификатор загруженного курсора или NULL при ошибке.
Для динамического изменения формы курсора (например, во время обработки сообщения) следует использовать функцию SetCursor:
HCURSOR WINAPI SetCursor(HCURSOR hcur);
Параметр hcur функции SetCursor должен указывать идентификатор нового курсора, подготовленный при помощи функции LoadCursor. Если указать параметр как NULL, изображение курсора исчезнет с экрана.
Для того чтобы выключить изображение курсора мыши или вновь включить его, используют функцию ShowCursor:
int WINAPI ShowCursor(BOOL fShow);
Функция управляет содержимым счетчика, который используется для определения момента включения или выключения изображения курсора мыши. Первоначально содержимое счетчика равно нулю. Этот счетчик увеличивается, когда необходимо включить курсор, и уменьшается при выключении курсора. Если счетчик больше или равен нулю, курсор мыши находится во включенном (видимом) состоянии.
Для включения курсора в качестве параметра fShow функции следует передать значение TRUE, для выключения - FALSE.
Возвращаемое функцией ShowCursor значение равно новому содержимому счетчика.
Наблюдая за работой стандартных приложений Windows, вы можете заметить, что часто на время выполнения длительных операций курсор принимает форму песочных часов. Как правило, все такие операции выполняются во время обработки какого-либо одного сообщения. Перед началом выполнения операции вы можете вызвать функцию LoadCursor с параметром IDC_WAIT, а затем вернуть прежнюю форму, вызвав эту же функцию еще раз. Дополнительно на время выполнения операции обработчик сообщения должен захватить мышь, вызвав функцию SetCapture. В этом случае вы не сможете с помощью мыши переключиться на другое приложение и прервать таким образом ход длительной операции. После выполнения операции следует освободить мышь, вызвав функцию ReleaseCapture.
Ваше приложение может установить курсор мыши в новое положение или определить текущие координаты курсора.
Для установки курсора мыши в новое положение следует вызвать функцию SetCursorPos:
void WINAPI SetCursorPos(int x, int y);
Первый параметр функции определяет горизонтальную координату курсора, второй вертикальную. Начало системы координат расположено в верхнем левом углу экрана.
Для определения текущих экранных координат курсора мыши необходимо использовать функцию GetCursorPos:
void WINAPI GetCursorPos(POINT FAR* lppt);
Эта функция записывает в поля x и y структуры типа POINT соответственно горизонтальную и вертикальную координату курсора мыши.
Существует редко используемая возможность ограничения перемещения курсора прямоугольной областью. Для ограничения свободы перемещения курсора следует использовать функцию ClipCursor:
void WINAPI ClipCursor(const RECT FAR* lprc);
В качестве параметра lprc функции передается указатель на структуру типа RECT, в которой указываются координаты области ограничения. Как только необходимость в ограничении пропадет, следует освободить движение мыши, вызвав функцию ClipCursor с параметром NULL.
Программный интерфейс Windows версии 3.1 содержит функцию GetClipCursor, с помощью которой можно определить расположение и размер области, ограничивающей движение курсора:
void WINAPI GetClipCursor(RECT FAR* lprc);
В качестве параметра lprc функции передается указатель на структуру типа RECT, в которую будут записаны координаты области ограничения.