Почему мое окно теряет свой HTMEME, когда я вызываю SetWindowLongPtr (GWL_STYLE) для него? - PullRequest
2 голосов
/ 24 марта 2019

Я кодирую пользовательский элемент управления Win32 UI, в который я хочу включить визуальные темы. Я загружаю темы в WM_NCCREATE как таковые:

case WM_NCCREATE:
{
    HTHEME hTheme = ::OpenThemeData(hWnd, L"EDIT");
    assert(hTheme);
    assert(::GetWindowTheme(hWnd) != 0);

}
return 1;

и затем отпустите их, когда контроль разрушен:

case WM_DESTROY:
{
    HTHEME hTheme = ::GetWindowTheme(hWnd);
    assert(hTheme);
    if(::CloseThemeData(hTheme) != S_OK)
    {
        assert(NULL);
    }
}
break;

Это работает хорошо, пока кто-то не попытается изменить стили этого элемента управления. Следующий вызов (сам по себе, даже не меняя стили):

::SetWindowLongPtr(hChildWnd, GWL_STYLE, dwStyle);

сделает GetWindowTheme при hChildWnd возвратом NULL.

Итак, это ошибка или функция ?

PS. Чтобы создать воспроизводимый пример Win32, мне пришлось настроить стандартное решение Win32 для VS 2017. ( Здесь - его полный исходный код.) Вот как он работает: в нем я создаю маленький дочерний элемент управления ( показан серым цветом ниже), тема которого обсуждается:

enter image description here

Затем, когда вы нажимаете на белую область главного окна, я пытаюсь изменить его стили, и тема исчезает:

enter image description here

Чтобы увидеть полный код Win32 для этого проекта, я также разместил его на PasteBin .

1 Ответ

1 голос
/ 25 марта 2019

Согласно документу Стили окон :

"После создания окна эти стили нельзя изменить, кроме как указано."

Поскольку это не разрешено, механизм тем не всегда проверяет наличие измененных стилей и в некоторых случаях выводит заголовок на основе старых данных.И единственное гарантированное и поддерживаемое решение для приложения состоит в том, чтобы уничтожить окно и воссоздать его с новыми стилями, а не пытаться изменить их на лету.

Можно найти аналогичное обсуждение: http://social.msdn.microsoft.com/Forums/en/windowscompatibility/thread/7b5ef777-ff0d-4f15-afed-5588f93f0e23

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...