Я использую функцию DrawThemeBackground
, чтобы нарисовать некоторые элементы системы на холсте. И мне нужно нарисовать кнопки заголовка формы, единственная часть, которую я пропустил, - это то, как я могу получить размеры кнопок заголовка default
. Exist any Uxtheme function to get that info?
Какую функцию Uxtheme я должен использовать, чтобы получить размер по умолчанию для кнопок минимизации, максимизации и закрытия?
ответ
Похоже, это сложнее, чем кажется.
Первый - GetThemeMetric
или GetThemeInt
. Но вы увидите много ссылок, что эти функции возвращают 0x8007490
, некоторые «элемент не найден», когда вы пытаетесь восстановить свойства кнопок заголовка.
Тогда есть GetThemePartSize
. Кажется, что это работает. То есть он работает нормально, например, для WP_CLOSEBUTTON
, но он возвращает бессмыслицу, например, для WP_MINBUTTON
. Я бы не предложил использовать эту функцию, так как она извлекает размеры кнопки по умолчанию. Если пользователь, например, изменил размер заголовка, вы не получите правильные значения. Во всяком случае, это можно было бы назвать так:
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 structure». Обратите внимание, что значения находятся в координатах экрана.
Если вам нужна поддержка XP и/или ниже, я предлагаю вам использовать старый добрый GetSystemMetrics(SM_CXSIZE)
и GetSystemMetrics(SM_CYSIZE)
(«Ширина кнопки в заголовке окна или заголовка, в пикселях»). Вам нужно будет настроить некоторые приближения в зависимости от того, включены ли темы, если активировано aero и т. Д.
Я думаю SystemParametersInfo с SPI_GETNONCLIENTMETRICS
является то, что вы ищете. Я думаю, кнопки с минимальным и максимальным значениями используют NONCLIENTMETRICS. iSmCaptionWidth
while close использует iCaptionWidth
для определения ширины.
Я сомневаюсь, что это так. Это, безусловно, даст значения для классических окон. –