获取主题编辑控件的非客户区域的大小

Blu*_*erk 4 windows delphi winapi themes

如何获取 Windows XP 及更高版本中主题编辑控件的边框(非客户端)宽度?

在 Windows 7 上GetThemeMetric,使用TMT_BORDERSIZEas 属性标识符对于现有编辑控件返回 0,如果未提供句柄,则返回 1。但仔细一看,似乎应该是2。

当控件包含WS_VSCROLLWS_HSCROLL窗口样式时,滚动条将绘制在该边框内,并且它们确实距离控件的外边缘 2 个像素,因此我假设有一种方法可以获得正确的信息。

查询的原因是我能够在WM_NCCALCSIZE创建自定义控件时设置客户区域大小。

在此输入图像描述

zet*_*t42 5

如何获取 Windows XP 及更高版本中主题编辑控件的边框(非客户端)宽度?

以下内容适用于所有控件,无论它们是否有主题。它甚至不需要主题 API。

  1. 调用GetClientRect()以获取客户区的大小。
  2. 调用ClientToScreen()将客户端矩形转换为屏幕坐标。
  3. 调用GetWindowRect()以获取屏幕坐标中的控件矩形(包括 NC 区域)。
  4. 计算客户端矩形和窗口矩形坐标之间的差异以获得边框的大小(例如leftBorderWidth = clientRect.left - windowRect.left)。

编辑:

有趣的是,Wine 源theme_edit.cGetThemeMetric()根本没有使用。相反,他们GetSystemMetrics()SM_CXEDGE和来调用SM_CYEDGE

在我的系统(Windows 7 和 Windows 10)上,这会返回正确的2.