Какую функцию Uxtheme я должен использовать для получения размера кнопок по умолчанию, свернуть и закрыть? - PullRequest
9 голосов
/ 08 января 2012

Я использую функцию DrawThemeBackground, чтобы нарисовать некоторые системные элементы на холсте, и мне нужно нарисовать кнопки заголовка формы, единственная часть, которую я пропустил, - это как я могу получить default размеры кнопок заголовка. Exist any Uxtheme function to get that info?

enter image description here

Ответы [ 2 ]

8 голосов
/ 08 января 2012

Похоже, это сложнее, чем кажется.

Сначала есть 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) ( "Ширина кнопки в заголовке окна или строке заголовка в пикселях "). Вам нужно потренироваться в некоторых приближениях в зависимости от того, включены ли темы, включен ли аэро и т. Д.

0 голосов
/ 08 января 2012

Я думаю, SystemParametersInfo с SPI_GETNONCLIENTMETRICS - это то, что вы ищете. Я предполагаю, что кнопки сворачивания и максимизации используют NONCLIENTMETRICS . iSmCaptionWidth, в то время как close использует iCaptionWidth для определения ширины.

...