Похоже, это сложнее, чем кажется.
Сначала есть GetThemeMetric
или GetThemeInt
. Но вы увидите много ссылок, что эти функции возвращают 0x8007490
, некоторый «элемент не найден» , когда вы пытаетесь получить свойства кнопок заголовка.
Тогда есть 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]
. Смотрите " Структура TITLEBARINFOEX " для деталей. Обратите внимание, что значения указаны в экранных координатах.
Если вам нужна поддержка XP и / или ниже, я предлагаю вам использовать старые добрые GetSystemMetrics(SM_CXSIZE)
и GetSystemMetrics(SM_CYSIZE)
( "Ширина кнопки в заголовке окна или строке заголовка в пикселях "). Вам нужно потренироваться в некоторых приближениях в зависимости от того, включены ли темы, включен ли аэро и т. Д.