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

时间:2018-01-05 05:42:18

标签: windows delphi winapi themes

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

在Windows 7 GetThemeMetric上,TMT_BORDERSIZE作为属性标识符,对于现有编辑控件,返回0;如果未提供句柄,则返回1。但经过仔细检查,它似乎应该是2。

当控件包含WS_VSCROLLWS_HSCROLL窗口样式时,滚动条会在该边框内绘制,它们确实距离控件的外边缘2个像素,所以我假设有获取正确信息的方法。

查询的原因是我可以在创建自定义控件时WM_NCCALCSIZE出现时设置客户区大小。

enter image description here

1 个答案:

答案 0 :(得分:4)

  

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

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

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

    有趣的是,葡萄酒来源theme_edit.c根本不使用GetThemeMetric()。相反,他们使用SM_CXEDGESM_CYEDGE来呼叫GetSystemMetrics()

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