- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在编写一个自定义 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 是它的完整源代码。)它的工作方式是这样的:我在其中创建了一个小的子控件(下面以灰色显示) ) 有问题的主题:
然后当你点击主窗口的白色区域时,我尝试改变它的样式并且它的主题消失了:
要查看该项目的完整 Win32 代码,我还 posted it on PasteBin .
最佳答案
根据 Window Styles文档:
"After the window has been created, these styles cannot be modified, except as noted."
因为这是不允许的,所以主题引擎并不总是检查更改的样式,并且在某些情况下会根据旧数据绘制标题。唯一有保障和可支持的解决方案是应用程序销毁窗口并使用新样式重新创建它,而不是尝试即时更改它们。
关于c++ - 为什么我的窗口在调用 SetWindowLongPtr(GWL_STYLE) 时丢失了它的 HTMEME?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55319559/
我尝试子类化另一个窗口(在另一个进程中),因此我注入(inject)了一个 dll,它调用 SetWindowLongPtr,但它失败并且 GetLastError 返回 5。 BOOL APIENT
我想在我的程序中继承 RichEdit(这里是 C++ 代码:http://dumpz.org/46182/)。 _native_log 是richedit 的一个hwnd。起初一切正常,LogWin
我一直在努力学习如何使用 SetWindowLongPtr() 并将其理解如下: 您可以使用以下函数获取当前消息并将其发送到自定义协议(protocol):LONG_PTR Some_Ptr = Se
我还在为钩子(Hook)而苦苦挣扎。 我的目标是: 在notepad.exe中设置一个钩子(Hook) 对其进行子类化(我的最终目标是将 Edit 类子类化并在我自己的窗口中显示内容) 免责声明:我知
前阵子,我用 Win32 API 编写了一个 C++ 程序,它会显示一个对话框,然后收听它生成的消息。有一次,我对将一段数据与对话窗口相关联很感兴趣。如果我手动创建窗口并附加一个窗口过程,我只需使用
关于 MSDN网站,我发现以下内容: Calling SetWindowLongPtr with the GWLP_WNDPROC index creates a subclass of the wi
我知道可以使用 SetWindowLongPtr + GWLP_USERDATA 来存储指向某些数据的指针。但是是否可以直接存储数据,例如“句柄”、“ bool 值”、“整数”或其他更大的数据。 来自
我需要为桌面上的一些应用程序窗口创建一个水印窗口(markHwnd),水印窗口样式为: uint dwStyle = Win32API.WS_CLIPSIBLINGS |
我正在编写一个自定义 Win32 UI 控件,我想在其中加入视觉主题。我将主题加载到它的 WM_NCCREATE 中: case WM_NCCREATE: { HTHEME hTheme =
我想 P/Invoke 到 GetWindowLongPtr和 SetWindowLongPtr ,而且我看到了关于它们的相互矛盾的信息。 一些消息称,在 32 位平台上,GetWindowLongP
我目前正在处理一个涉及使用 SWT 的 Eclipse RCP 的 Java 项目,并试图通过在保存时向 Windows 环境中的用户提供有意义的消息来处理正常关闭。我应该使用 ShutdownBlo
我是一名优秀的程序员,十分优秀!