Окт 16

Работа с кареткой

Каретка — это небольшой символ в виде вертикальной или горизонтальной черты. Иногда каретка отображается в виде прямоугольника, который показывает пользователю место на экране, где будет отображен очередной символ, вводимый с клавиатуры. Если вы создаете программу, реализующую функции упрощенного текстового редактора, то необходимо позаботиться и об управлении кареткой.
Для этого в Win32 API предусмотрены функции, приведенные в следующем списке:
Функция CreateCaret создает связанную с окном каретку, Функция SetCaretPos устанавливает положение каретки в окне. Функция ShowCaret показывает каретку. Функция HideCaret прячет каретку, Функция DestroyCaret удаляет каретку.
Однако вы не можете просто создать каретку при обработке сообщения WM_CREATE и удалить ее при обработке сообщения WM_DESTROY. Каретка является общесистемным ресурсом и должна разделяться между всеми работающими приложениями. Следует помнить, что появление каретки в окне имеет смысл только в том случае, когда окно имеет фокус ввода. Оконная процедура может контролировать моменты, когда окно получает или теряет фокус ввода, обрабатывая сообщения WNLSETFOCUS и WM_KILLFOCUS.
Это диктует основные правила использования каретки. Оконная процедура вызывает функцию CreateCaret при обработке сообщения WM_SETFOCUS и функцию DestroyCaret при обработке сообщения WM_KILLFOCUS.
Рассмотрим подробней использование функции CreateCaret, имеющей следующий прототип:
BOOL CreateCaret(HWND hWnd. HBITMAP hBitmap, int nWidth, int nHeight):
Первый параметр функции содержит дескриптор окна, которое становится владельцем создаваемой каретки.
Второй параметр определяет форму каретки. В нем можно указать дескриптор растра, единичное значение или значение NULL
Если параметр hBitmap равен NULL, то каретка имеет форму прямоугольного блока шириной nWidth и высотой nHeight, закрашенного черной однородной кистью.
Если параметр hBitmap равен единице, то форма каретки будет такой же, что и для значения NULL, но заполняться блок будет черно-белой кистью с шахматным рисунком, что выглядит внешне как серый цвет. При единичной ширине каретки она будет выглядеть как пунктирная линия.
Если параметру h Bitmap передается дескриптор растра, то форма каретки определяется этим растром. В этом случае параметры nWidth и nHeight игнорируются.
Параметры nWidth и nHeight задают ширину и высоту каретки в логических единицах. Их использование уже было описано выше. Если параметр nWidth имеет нулевое значение, то используется предопределенная в системе ширина рамки для окна, которая обычно равна одному пикселу. Если nHeight имеет нулевое значение, то используется предопределенная в системе высота рамки для окна, которая тоже обычно равна одному пикселу1.
В случае успешного завершения функция CreateCaret возвращает ненулевое значение. Нулевое значение служит признаком ошибки.
После создания каретки функцией CreateCaret она все еще остается скрытой. Чтобы каретка стала видимой, необходимо вызвать функцию ShowCaret. Перед уничтожением каретки с помощью функции DestroyCaret рекомендуется убрать ее с экрана функцией HideCaret.