Я кодирую пользовательский элемент управления 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. ( Здесь - его полный исходный код.) Вот как он работает: в нем я создаю маленький дочерний элемент управления ( показан серым цветом ниже), тема которого обсуждается:
Затем, когда вы нажимаете на белую область главного окна, я пытаюсь изменить его стили, и тема исчезает:
Чтобы увидеть полный код Win32 для этого проекта, я также разместил его на PasteBin .