У меня нормальное окно с элементами управления. Некоторые из которых являются владельцами. Я обнаружил, что мне нужно инициализировать состояния при создании элементов управления.
SendMessage(m_hWnd, WM_UPDATEUISTATE, MAKEDWORDHL(0, UIS_INITIALIZE), 0);
SendMessage(m_hWnd, WM_UPDATEUISTATE, MAKEDWORDHL(UISF_HIDEFOCUS, UIS_SET), 0);
Причина, по которой я использовал 0 в старшем слове UIS_INITIALIZE, заключается в том, что именно это было у Раймонда через Кто отправляет первоначальное сообщение WM_UPDATEUISTATE?
Я управляю состоянием в подклассе элемента управления с помощью:
case WM_KILLFOCUS:
SendMessage(hwnd, WM_UPDATEUISTATE, MAKEDWORDHL(UISF_HIDEFOCUS, UIS_SET), 0);
break;
case WM_SETFOCUS:
SendMessage(hwnd, WM_UPDATEUISTATE, MAKEDWORDHL(UISF_HIDEFOCUS, UIS_CLEAR), 0);
break;
Использование WM_CHANGEUISTATE
не сработало, поэтому застрял с WM_UPDATEUISTATE
Во время WM_DRAWITEM
я проверяю состояние, а затем DrawFocusRect()
, если не скрываю фокус.
Теперь проблема. Когда я скрываю элементы управления окна и затем показываю их снова, все состояния равны 0, поэтому все элементы управления заканчиваются прямоугольником фокуса вокруг них. Я мог сбросить все на WM_SHOWWINDOW
, но это просто кажется грязным.
Есть ли подходящий способ обработки состояний при использовании обычного окна вместо диалогового окна (и не использования IsDialogMsg()
). В частности, с ShowWindow()
изменением состояний?