c ++ win32 скрыть (отключить) каретку из поля редактирования

Я пытаюсь сделать так, чтобы пользователь мог выбирать текст из поля редактирования, доступного только для чтения, но он не видел мигающую вставку. Мне удалось убрать курсор из поля редактирования, но его все еще можно увидеть на мгновение.

Это мой код для подкласса:

LRESULT CALLBACK UserInfoProc (HWND hUserInfoWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, UINT_PTR uIdSubclass, DWORD_PTR dwRefData)
{

    HideCaret(hUserInfoWnd);

    return DefSubclassProc(hUserInfoWnd, uMsg, wParam, lParam);

}

Я знаю, что это небольшой фрагмент кода, но он почти выполняет то, что я хочу.

Итак, что происходит, когда я нажимаю кнопку редактирования, курсор можно увидеть на мгновение (50 мс?). Я хочу, чтобы его вообще не было. Как я могу это сделать? Я хочу, чтобы пользователь по-прежнему мог выбирать текст из редактирования.


person Olavi Mustanoja    schedule 07.11.2013    source источник
comment
Вы можете попробовать переместить вызов HideCaret() после DefSubclassProc(), поскольку на данный момент, если сообщение запускает каретку, оно не будет скрыто до следующего вызова.   -  person Jonathan Potter    schedule 08.11.2013
comment
Что ж, это не сработало. Как было бы возможно, что HideCaret() когда-либо вызвали бы, если бы я переместил его мимо оператора return?   -  person Olavi Mustanoja    schedule 08.11.2013
comment
Вы не перемещаете его мимо оператора return, вы сохраняете возвращаемое значение из DefSubClassProc, вызываете HideCaret и затем возвращаете ...   -  person Jonathan Potter    schedule 08.11.2013
comment
Кстати, вероятно, только WM_SETFOCUS запускает отображение каретки.   -  person Jonathan Potter    schedule 08.11.2013
comment
Да, я понял то, что вы имели в виду, незадолго до того, как вы прокомментировали: D и да! это сработало! Большое спасибо, чувак.   -  person Olavi Mustanoja    schedule 08.11.2013
comment
@JonathanPotter Можете ли вы сформулировать это как ответ, чтобы его можно было принять?   -  person    schedule 08.11.2013


Ответы (1)


Вы можете попробовать переместить вызов HideCaret() после DefSubclassProc(), поскольку на данный момент, если сообщение запускает каретку, оно снова скрывается только в следующем сообщении.

Кроме того, я бы предположил, что единственное сообщение, которое запускает отображение каретки, - это WM_SETFOCUS, поэтому вы можете проверить только это сообщение. Например,

LRESULT CALLBACK UserInfoProc (HWND hUserInfoWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, UINT_PTR uIdSubclass, DWORD_PTR dwRefData)
{
    LRESULT lRes = DefSubclassProc(hUserInfoWnd, uMsg, wParam, lParam);
    if (uMsg == WM_SETFOCUS) // maybe?
        HideCaret(hUserInfoWnd);
    return lRes;
}
person Jonathan Potter    schedule 08.11.2013
comment
В моем коде я вызываю HideCaret каждый раз, когда сообщение отправляется в окно (за пределами WM_SETFOCUS). Какие там недостатки? Существенно ли тяжелее для системы вызывать функцию каждый раз? - person Olavi Mustanoja; 08.11.2013
comment
Наверное, нет никакой разницы, просто кажется излишним звонить каждый раз. Все, что работает :) - person Jonathan Potter; 08.11.2013
comment
Да ладно, это все равно не сработало, если бы оно было внутри предложения if - person Olavi Mustanoja; 08.11.2013