Как изменить форму курсора мерцания окон с вертикальной, которая по умолчанию ( | ), на горизонтальную, как в DOS ( _ ).
Есть ли какая-то хорошая функция, которая позаботится об этом?
ОС: Win7
Как изменить форму курсора мерцания окон с вертикальной, которая по умолчанию ( | ), на горизонтальную, как в DOS ( _ ).
Есть ли какая-то хорошая функция, которая позаботится об этом?
ОС: Win7
На самом деле это называется курсором, а не курсором. Вероятно, отсюда и возникает путаница, и почему поиск решения не принес много пользы. комментарий NullPonyPointer также отражает эту распространенную путаницу . Функция SetCursor
- это действительно то, что вы хотели бы изменить курсор мыши, но это не сработает, чтобы изменить каретку.
К счастью, есть целая группа функций Windows, которые работают с каретками: CreateCaret
, ShowCaret
, < a href="http://msdn.microsoft.com/en-us/library/windows/desktop/ms648403.aspx" rel="nofollow noreferrer">HideCaret
, SetCaretPos
и DestroyCaret
. Есть и другие настройки для управления временем мерцания, но я рекомендую придерживаться текущих настроек пользователя (которые будут использоваться по умолчанию).
Сначала немного предыстории. Я настоятельно рекомендую прочитать две вводные статьи MSDN о каретках и с помощью знаков вставки. Но вот краткий обзор: каретка принадлежит окну; в частности, окно, которое в данный момент находится в фокусе. Это окно, скорее всего, будет чем-то вроде элемента управления текстовым полем. Когда окно получает фокус, оно создает курсор для использования, а затем, когда оно теряет фокус, оно уничтожает свой курсор. Очевидно, что если вы не сделаете ничего из этого вручную, вы получите реализацию по умолчанию.
Теперь пример кода. Поскольку мне нравятся интерфейсы конфетных автоматов, я бы обернул их функцией:
bool CreateCustomCaret(HWND hWnd, int width, int height, int x, int y)
{
// Create the caret for the control receiving the focus.
if (!CreateCaret(hWnd, /* handle to the window that will own the caret */
NULL, /* create a solid caret using specified size */
width, /* width of caret, in logical units */
height)) /* height of caret, in logical units */
return false;
// Set the position of the caret in the window.
if (!SetCaretPos(x, y))
return false;
// Show the caret. It will begin flashing automatically.
if (!ShowCaret(hWnd))
return false;
return true;
}
Затем в ответ на WM_SETFOCUS
EN_SETFOCUS
или подобное уведомление, я бы вызвал функцию CreateCustomCaret
. И в ответ на WM_KILLFOCUS
EN_KILLFOCUS
или другое подобное уведомление, я бы назвал DestroyCaret()
.
В качестве альтернативы CreateCustomCaret
мог создать каретку из растрового изображения. Я мог бы предоставить следующую перегрузку:
bool CreateCustomCaret(HWND hWnd, HBITMAP hbmp, int x, int y)
{
// Create the caret for the control receiving the focus.
if (!CreateCaret(hWnd, /* handle to the window that will own the caret */
hBmp, /* create a caret using specified bitmap */
0, 0)) /* width and height parameters ignored for bitmap */
return false;
// Set the position of the caret in the window.
if (!SetCaretPos(x, y))
return false;
// Show the caret. It will begin flashing automatically.
if (!ShowCaret(hWnd))
return false;
return true;
}