我正在修改并移入 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 中引入了解决方案,那么了解它也可能是有益的。
谢谢。