gpt4 book ai didi

c++ - 为什么我的窗口在调用 SetWindowLongPtr(GWL_STYLE) 时丢失了它的 HTMEME?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:03:25 27 4
gpt4 key购买 nike

我正在编写一个自定义 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);

将使 hChildWnd 上的 GetWindowTheme 返回 NULL。

那么,它是错误还是功能

附言。为了制作一个可重现的 Win32 示例,我必须调整 VS 2017 中的库存 Win32 解决方案。(Here 是它的完整源代码。)它的工作方式是这样的:我在其中创建了一个小的子控件(下面以灰色显示) ) 有问题的主题:

enter image description here

然后当你点击主窗口的白色区域时,我尝试改变它的样式并且它的主题消失了:

enter image description here

要查看该项目的完整 Win32 代码,我还 posted it on PasteBin .

最佳答案

根据 Window Styles文档:

"After the window has been created, these styles cannot be modified, except as noted."

因为这是不允许的,所以主题引擎并不总是检查更改的样式,并且在某些情况下会根据旧数据绘制标题。唯一有保障和可支持的解决方案是应用程序销毁窗口并使用新样式重新创建它,而不是尝试即时更改它们。

可以找到类似的讨论: http://social.msdn.microsoft.com/Forums/en/windowscompatibility/thread/7b5ef777-ff0d-4f15-afed-5588f93f0e23

关于c++ - 为什么我的窗口在调用 SetWindowLongPtr(GWL_STYLE) 时丢失了它的 HTMEME?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55319559/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com