如何在 Windows XP 和更高版本中获取主题编辑控件的边框(非客户端)宽度?
在 Windows 7 上,GetThemeMetric
以 TMT_BORDERSIZE
作为属性标识符,对于现有编辑控件返回 0,如果未提供句柄则返回 1。但仔细观察似乎应该是 2。
当控件包含 WS_VSCROLL
或 WS_HSCROLL
窗口样式时,滚动条将绘制在该边框内,并且它们确实距离控件的外边缘 2 个像素,所以我假设有一种方法可以获得正确的信息。
查询的原因是我能够在创建自定义控件时发生WM_NCCALCSIZE
时设置客户区大小。
最佳答案
How do you get the width of the border (non-client) of a themed Edit control in Windows XP and later versions?
以下适用于所有控件,无论它们是否有主题。它甚至不需要主题 API。
- 调用
GetClientRect()
获取客户区的大小。 - 调用
ClientToScreen()
将客户端矩形转换为屏幕坐标。 - 调用
GetWindowRect()
以屏幕坐标获取包含 NC 区域的控件矩形。 - 计算客户端 rect 和窗口 rect 坐标之间的差异以获得边框的大小(例如
leftBorderWidth = clientRect.left - windowRect.left
)。
编辑:
有趣的是,Wine 源theme_edit.c根本不使用 GetThemeMetric()
。相反,他们调用 GetSystemMetrics()
使用 SM_CXEDGE
和 SM_CYEDGE
。
在我的系统(Windows 7 和 Windows 10)上,这将返回 2
的正确值。
关于windows - 获取主题编辑控件的非客户区的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48107817/