2012-01-08 3 views
9

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

enter image description here

ответ

7

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

Первый - 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 и т. Д.

0

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

+0

Я сомневаюсь, что это так. Это, безусловно, даст значения для классических окон. –

 Смежные вопросы

  • Нет связанных вопросов^_^