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

标签 windows delphi winapi themes

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

在 Windows 7 上,GetThemeMetricTMT_BORDERSIZE 作为属性标识符,对于现有编辑控件返回 0,如果未提供句柄则返回 1。但仔细观察似乎应该是 2。

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

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

enter image description here

最佳答案

How do you get the width of the border (non-client) of a themed Edit control in Windows XP and later versions?

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

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

编辑:

有趣的是,Wine 源theme_edit.c根本不使用 GetThemeMetric()。相反,他们调用 GetSystemMetrics()使用 SM_CXEDGESM_CYEDGE

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

关于windows - 获取主题编辑控件的非客户区的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48107817/

相关文章:

delphi - TForm 上的 RTTI GetFields 和 GetAttributes

线条的颜色没有变化?

c - 使用 Win32 的多线程

javascript - 从 C++ 函数返回字符串到 JavaScript

.net - 使用单个 exe 部署 Windows 窗体应用程序

windows - Git pull 无法更新本地引用

delphi - 在 Delphi 5 中创建面板的精确副本

windows - 更新显卡不更新opengl32.dll

windows - 我有翻译 Windows Winapi/Win32/系统错误消息的 Microsoft 资源吗?

c++ - 在 .ico 文件中选择特定图标