11

我正在使用该DrawThemeBackground功能在画布上绘制一些系统元素,并且我需要绘制表单的标题按钮,我错过的唯一部分是如何获取default标题按钮的大小。Exist any Uxtheme function to get that info?

在此处输入图像描述

4

2 回答 2

10

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

首先有GetThemeMetricor GetThemeInt。但是当您尝试检索标题按钮的属性时,您会看到很多引用这些函数返回一个0x8007490,一些“找不到元素” 。

然后是GetThemePartSize. 这个似乎有些用。也就是说,它可以正常工作,例如 for WP_CLOSEBUTTON,但它返回废话,例如 for 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 结构”。请注意,这些值位于屏幕坐标中。


如果您需要支持 XP 和/或以下版本,我建议您使用旧的GetSystemMetrics(SM_CXSIZE)GetSystemMetrics(SM_CYSIZE)“窗口标题或标题栏中按钮的宽度,以像素为单位”)。您需要根据是否启用主题、是否启用 aero 等来锻炼一些近似值。

于 2012-01-08T16:26:15.367 回答
0

我认为SystemParametersInfo withSPI_GETNONCLIENTMETRICS是您正在寻找的。我猜最小化和最大化按钮使用NONCLIENTMETRICSiSmCaptionWidth而 close 用于iCaptionWidth确定宽度。

于 2012-01-08T11:01:48.080 回答