Как изменить форму курсора Windows, мигающую с С++?

Как изменить форму курсора мерцания окон с вертикальной, которая по умолчанию ( | ), на горизонтальную, как в DOS ( _ ).

Есть ли какая-то хорошая функция, которая позаботится об этом?

ОС: Win7


person tonni    schedule 18.11.2012    source источник


Ответы (1)


На самом деле это называется курсором, а не курсором. Вероятно, отсюда и возникает путаница, и почему поиск решения не принес много пользы. комментарий 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;
}
person Cody Gray    schedule 04.04.2013
comment
Эй, Коди, большое спасибо за усилия, этот пост устарел, и я почти забыл о нем, и думаю, что смена каретки - это персонал, который требует слишком много исследований, и я не нашел много хорошей информации в Интернете, но ты покажи мне другая сторона! Спасибо, чувак, ты классный, я очень ценю это! - person tonni; 04.04.2013
comment
@тонни Конечно! Ты сказал вчера, что я помогал тебе раньше. Я этого не помнил, но это заставило меня просмотреть некоторые из ваших старых вопросов в вашем профиле, и я увидел, что на этот вопрос нет ответа. Вы правы, в сети мало информации по этому поводу. Это уже не то, чем люди занимаются. Изменение курсора было гораздо более популярным в 1992 году с 16-битной Windows. Оригинальные книги по Windows API посвящали кареткам главу, но вы больше этого не увидите. Хорошая информация, чтобы иметь доступ. - person Cody Gray; 05.04.2013
comment
Ты сказал вчера, что я помогал тебе раньше. Я этого не помнил - хех, да, вы мне помогли, и я это помню, но у меня есть другая учетная запись, для которой я потерял пароль, но знайте, что помощь пришла от вас :) - person tonni; 05.04.2013
comment
@tonni, вы можете запросить объединение другой учетной записи с вашей текущей учетной записью или наоборот на stackoverflow.com/help/user-merge. - person Gordon; 06.04.2013