看起来这比听起来更困难。
首先有GetThemeMetric or GetThemeInt。但是你会看到很多引用这些函数返回一个0x8007490
, some “未找到元素”,当您尝试检索标题按钮的属性时。
然后还有GetThemePartSize。这个似乎有点作用。例如,它可以正常工作WP_CLOSEBUTTON
,但它会返回无意义的内容,例如WP_MINBUTTON
。无论如何我都不建议使用这个函数,因为它会检索default按钮的尺寸。例如,如果用户更改了标题大小,您将无法获得正确的值。无论如何,它可以这样调用:
uses
uxtheme, themes;
...
var
Err: HRESULT;
Size: TSize;
begin
Err := GetThemePartSize(ThemeServices.Theme[teWindow], 0,
WP_CLOSEBUTTON, CBS_NORMAL, nil, TS_TRUE, Size);
我不知道前两个函数如果起作用会返回什么(当前标题栏大小或默认标题栏大小的按钮尺寸)。
获得准确结果的唯一可能方法似乎是使用WM_GETTITLEBARINFOEX信息。但有一个缺点;它仅适用于 Vista 及更高版本。您可能需要定义消息及其使用的结构,具体取决于您使用的 Delphi 版本(此处为 D2007)。
const
CCHILDREN_TITLEBAR = 5;
WM_GETTITLEBARINFOEX = $033F;
type
tagTITLEBARINFOEX = record
cbSize: DWORD;
rcTitleBar: TRect;
rgstate: array[0..CCHILDREN_TITLEBAR] of DWORD;
rgrect: array [0..CCHILDREN_TITLEBAR] of TRect;
end;
TITLEBARINFOEX = tagTITLEBARINFOEX;
TTitleBarInfoEx = tagTITLEBARINFOEX;
PTitleBarInfoEx = ^TTitleBarInfoEx;
...
var
TitleInfo: TTitleBarInfoEx;
begin
SendMessage(Handle, WM_GETTITLEBARINFOEX, 0, NativeInt(@TitleInfo));
然后,您可以从矩形中获取关闭按钮的大小TitleInfo.rgrect[5]
. See "标题栏信息结构”了解详细信息。请注意,这些值以屏幕坐标表示。
如果您需要支持 XP 和/或以下版本,我建议您使用旧版GetSystemMetrics(SM_CXSIZE)
and GetSystemMetrics(SM_CYSIZE)
(“窗口标题或标题栏中按钮的宽度,以像素为单位”)。您需要根据是否启用主题、是否启用航空等来进行一些近似。