我正在编写一个自定义 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);
将返回 NULL GetWindowTheme
。hChildWnd
那么,这是一个错误还是一个功能?
PS。为了制作一个可重现的 Win32 示例,我必须从 VS 2017 调整现有的 Win32 解决方案。(这是它的完整源代码。)它的工作方式是这样的:在其中我创建了一个小的子控件(如下所示的灰色)有问题的主题:
然后当您单击主窗口的白色区域时,我尝试更改其样式并且其主题消失了:
要查看该项目的完整 Win32 代码,我还将其发布在 PasteBin 上。