我必须使用什么Uxtheme函数来获得最小化,最大化和关闭按钮的默认大小?

时间:2012-01-08 04:40:24

标签: c++ delphi winapi uxtheme

我正在使用DrawThemeBackground函数在画布上绘制一些系统元素,我需要绘制一个表单的标题按钮,我唯一想念的部分是如何获得{{1}标题按钮的大小。 default

enter image description here

2 个答案:

答案 0 :(得分:8)

看起来这听起来比较困难。

首先是GetThemeMetricGetThemeInt。但是,当您尝试检索字幕按钮的属性时,您会看到许多引用这些函数返回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));

然后,您可以从rect TitleInfo.rgrect[5]获取关闭按钮的大小。有关详细信息,请参阅“TITLEBARINFOEX structure”。请注意,值在屏幕坐标中。


如果您需要支持XP和/或以下版本,我建议您使用优质的GetSystemMetrics(SM_CXSIZE)GetSystemMetrics(SM_CYSIZE)“窗口中按钮的宽度标题栏或标题栏,以像素为单位“)。你需要锻炼一些近似值,具体取决于是否启用了主题,是否启用了aero等。

答案 1 :(得分:0)

我认为SystemParametersInfoSPI_GETNONCLIENTMETRICS是您正在寻找的。我想最小化和最大化按钮使用NONCLIENTMETRICSiSmCaptionWidth而关闭使用iCaptionWidth来确定宽度。