gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 14:13:12 24 4
gpt4 key购买 nike

如何在 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com