2013-11-07 5 views
0

Я пытаюсь сделать так, чтобы пользователь мог выбрать текст из поля редактирования только для чтения, но он не увидит мигающий карет. Я смог заставить каретку исчезнуть из редактирования, но его все еще можно увидеть на мгновение.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 мс?). Я хочу, чтобы он вообще не появлялся. Как я могу это сделать? Я хочу, чтобы пользователь все еще мог выбирать текст из редактирования.

+1

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

+0

Ну, это не сработало. Как можно было бы вызывать 'HideCaret()', если бы я переместил его за оператор return? –

+2

Вы не перемещаете его за оператор return, вы сохраняете возвращаемое значение из 'DefSubClassProc', вызываете' HideCaret', а затем возвращаете ... –

ответ

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; 
} 
+0

В моем коде я вызываю 'HideCaret' каждый раз, когда сообщение отправляется в окно (вне WM_SETFOCUS). Каковы же недостатки? Значительно тяжелее для системы вызывать функцию ** каждый раз **? –

+0

Наверное, не имеет никакого значения, просто не нужно называть его каждый раз. Независимо от того, что работает :) –

+0

Ну что ж, это не сработало, если бы оно было внутри предложения if –

Смежные вопросы