问题标签 [uxtheme]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
delphi - 具有适当主题的 TBitBtn?
如果您查看 Windows 7 及更高版本上的标准 TButton,将鼠标悬停在按钮上会产生微妙的淡入效果,而将光标移开会使按钮的热面快速淡出。
如果您使用 TBitBtn 检查相同的内容,您会发现没有淡入淡出效果;它在没有任何转换的情况下变为热状态,然后在没有任何转换的情况下变回。
是否有任何类似于 TBitBtn 的组件可以显示图片并且同时具有适当的主题?
delphi - 是否有像 TBitBtn 一样具有正确主题的组件?
有谁知道现有的 Delphi 组件,即
- 像 TButton 一样正确主题(在 Windows 7 及更高版本中鼠标悬停时具有淡入/淡出效果)
- 支持像 TBitBtn 这样的字形,但不使用 ImageLists(与 TBitBtn 一样)。
如果没有这样的组件可用,是否可以修改 TBitBtn 的主题行为以复制 TButton 的主题行为?我不是主题大师,但也许您可以从 ThemeServices 获得不同的淡入淡出阶段?或者您是否必须自己通过在热状态和非热状态之间进行平均来创建淡入淡出效果?
winapi - DPI 意识:是否可以告诉我何时需要重新计算文本高度,这样我就不必一直这样做了?还有 SM_CYSMICON/复选框的高度?
我正在修改并移入 DLL 的 Windows 表控件中的一个常见操作是获取行的高度。这是最大的
- 当前字体中文本的高度,以像素为单位
- 当前的小图标高度,以像素为单位 (
GetSystemMetrics(SM_CYSMICON)
) - 复选框的高度,以像素为单位(在
WM_THEMECHANGED
重新计算复选框信息时在 a 上确定)
据我所知,计算文本高度需要获取 DC、选择字体(并获取SYSTEM_FONT
if that's NULL
)、获取文本度量、选择字体并释放 DC,所有这些都可能出错/失败/等等。这意味着我控制的几乎所有功能都可能失败。
我可以通过将文本高度存储在其他地方来避免这种情况,只有在它改变时才计算它。我知道文本高度是与GetDC(hwnd)
返回的 DC 的 DPI 相关的属性。我希望我的控件与 DPI 无关,因为DPI 感知是每个进程,而不是每个 DLL/每个窗口。
同时,了解何时GetSystemMetrics(SM_CYSMICON)
更改也很有用。
所以我的问题很简单:
- 是否有一条我可以查找的消息会告诉我我的 DPI 已更改并且我需要重新计算我的文本高度?
- 是否有消息告诉我
SM_CYSMICON
发生了变化并且我需要重新计算所有内容?是同一个吗?(我知道没有可靠的方法来检测GetSystemMetrics()
故障(因为 0 是有效的返回并且它没有设置最后一个错误代码),所以我假设它不会因有效参数而失败,并且每次我需要时都简单地调用它计算行高;这只是为了当值发生变化时我可以排队重绘。)它也适用SM_CXSMICON
吗? - 此外,回顾我的代码,
GetThemePartSize()
也需要一个 DC;像复选框图像这样的主题项目是否随 DPI 缩放?如果是这样,在这种情况下我会寻找什么消息?同一个? - 替代方案:是否有一种非失败的方法来获取我不知道的文本高度,只给出一个
HWND
andHFONT
?
我很乐意采用在 Windows XP 或 Windows Vista 中引入的解决方案;如果在较新版本的 Windows 中引入了解决方案,那么了解它也可能是有益的。
谢谢。
winapi - 是否所有 BP_CHECKBOX 状态都保证具有相同的大小,如果不是,我应该如何处理绘图和命中测试时的大小差异?
我的自定义表格控件绘制自己的复选框并处理自己的复选框事件。现在,当我计算主题复选框的大小(使用GetThemePartSize()
)时,我确保所有状态的大小都相同,如果一个状态不同,就会惊慌失措。如果我要更改为即时计算复选框大小(传入HDC
一个我无论如何都要重组我所有的控件代码)。
我可以假设所有主题复选框状态都具有相同的大小吗?如果不是,我该如何处理用于绘图的尺寸差异:我是否总是使用最大尺寸,如果是这样,我在哪里绘制相对于最大尺寸的较小复选框,还是我做其他事情?对于命中测试:我总是考虑最大的尺寸吗?
旧的“Windows XP 视觉指南”文档建议它们都应该具有相同的大小,但这并不能保证未来版本的 Windows 的任何内容(我也不知道未来版本的 Windows 有类似的文档)。我在 MSDN 或头文件中没有看到任何其他内容。
我在这里专门谈论uxtheme;我不知道非主题复选框(现在我只对所有状态使用小图标大小,但我确信有更好的方法来获取我不知道的大小......)。
谢谢。
c++ - 使用uxtheme theough winapi时更改选定或选定但不活动的列表视图行的颜色
我在 Win10 上,想更改使用 uxtheme API 绘制 ListView 控件时使用的颜色。
但是,当通过 DrawThemeBackgroundEx 绘制 ListView ListItem ( LVP_LISTITEM
) 背景时,它总是在此资源管理器中绘制,例如选中时的浅蓝色 ( LISS_SELECTED
) 或选中但未激活时的浅灰色 ( LISS_SELECTEDNOTFOCUS
)。
有没有办法将选择颜色更改为其他颜色,而不是似乎在主题中硬编码的蓝色和灰色?
winapi - 主题应用程序中 SYSLINK 控件的颜色
我需要知道 Windows SYSLINK 控件的实际颜色是什么,因为我需要绘制一些其他应该具有完全相同颜色的元素。
目前我使用GetSysColor(COLOR_HOTLIGHT)
正确的颜色,但这对于主题应用程序是否也正确(显然它至少在 Windows 10 下)?MS文档对此并不清楚。
c++ - 当我在窗口上调用 SetWindowLongPtr(GWL_STYLE) 时,为什么窗口会丢失其 HTMEME?
我正在编写一个自定义 Win32 UI 控件,我想在其中加入视觉主题。我在其中加载主题WM_NCCREATE
:
然后在控制被破坏时释放它们:
这很好用,直到有人试图更改该控件的样式。以下调用(仅靠自身,甚至没有更改任何样式):
将返回 NULL GetWindowTheme
。hChildWnd
那么,这是一个错误还是一个功能?
PS。为了制作一个可重现的 Win32 示例,我必须从 VS 2017 调整现有的 Win32 解决方案。(这是它的完整源代码。)它的工作方式是这样的:在其中我创建了一个小的子控件(如下所示的灰色)有问题的主题:
然后当您单击主窗口的白色区域时,我尝试更改其样式并且其主题消失了:
要查看该项目的完整 Win32 代码,我还将其发布在 PasteBin 上。
c - 无法导入 uxtheme 库
我想导入uxtheme
我的 c 程序并使用uxtheme.h
库中的一些变量类型。当我使用它并编译我的项目时,我的计算机向我显示了一些不合理的错误。像这样:
未知类型名称“DTTOPTS”
但我确信这DTTOPTS
是在uxtheme.h
.
为什么我的电脑显示此错误以及如何解决?
我的代码:
c++ - UXTheme:绘制无边界组合框雪佛龙
我正在尝试绘制一个应该使用“组合框”主题类的自定义控件。
使用
给出正确的背景(只读外观),没有 V 形。但是如何添加雪佛龙?
正确绘制雪佛龙,但有自己的边框,雪佛龙位于rect
. 因此,如果我使用完整的客户端矩形,我会得到:
如果我使用较小的矩形以便正确定位人字形,我会得到一个单独的下拉列表:
我如何获得“正常”的外观?- 即像这样:
奖金问题:
有没有比 MSDN 做得更好的文档?它与大多数较新的文档一样稀疏,例如仅列出“部件和状态”,而没有描述它们的目的(这并不总是很明显),以及它是针对特定项目DrawThemeBackground
还是〜 。Edge
我仍然使用旧DrawFocusRect
的焦点矩形吗?
GetThemeBackgroundContentRect
计算 的预期矩形iPartId=CP_READONLY
,但对于iPartId=CP_CUEBANNER
,它返回完整的客户矩形,因此提示文本对齐错误。这……正常吗?