Возвращаясь к обсуждению концепции "фокуса ввода", вспомним, что сообщения клавиатуры приходит в окно, являющееся активным и имеющее "фокус ввода". Обрабатывая сообщения WM_SETFOCUS и WM_KILLFOCUS, программа может определить, имеет ли она фокус ввода, или нет.
Работая с реальными программами, например, с текстовыми редакторами, вам часто необходимо определить также то место внутри окна, куда необходимо осуществлять ввод информации. Когда вы набираете текст, то, как правило, какой-либо символ (например, мигающий прямоугольник, либо символ подчеркивания) показывает вам место, где следующий набираемый вами символ появится на экран. Ваша программа может сама следить за рисованием, управлением данным символом в зависимости от действий пользователя. Однако, Windows предоставляет вам предопределенный объект, реализующий перечисленные функции, и носящий имя "каретка" (caret).
Каретка является общесистемным ресурсом (как, впрочем, и курсор, который связан с мышью), единственным в операционной системе, и может использовать только окном, имеющим фокус ввода. Поэтому, основным правилом использования каретки является следующее: оконная процедура вызывает функцию CreateCaret при обработке сообщения WM_SETFOCUS (получении фокуса ввода), и функцию DestroyCaret при обработке сообщения WM_KILLFOCUS (потере фокуса).
Приведем основные функции работы с кареткой:
CreateCaret(hWnd, pImage, cxChar, cyChar); // создание каретки
SetCaretPos(cxChar, cyChar); // установить позицию каретки в позицию cxChar, cyChar
GetCaretPos(); // получить положение каретки
GetCaretBlinkTime(); // Получение частоты мигания
SetCaretBlinkTime(); // Установка частоты мигания
ShowCaret(hWnd); // показать каретку
HideCaret(hWnd); // спрятать каретку
DestroyCaret(); // удалить каретку