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