ShowWindow () Сбрасывает состояние пользовательского интерфейса? - PullRequest
0 голосов
/ 28 июня 2019

У меня нормальное окно с элементами управления. Некоторые из которых являются владельцами. Я обнаружил, что мне нужно инициализировать состояния при создании элементов управления.

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() изменением состояний?

...