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

发布于 2012-01-09 00:26:15
看起来这比听起来更难。
首先是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));然后,您可以从rect TitleInfo.rgrect[5]获取close按钮的大小。详情请参见"TITLEBARINFOEX structure“。请注意,这些值是以屏幕坐标表示的。
如果你需要支持XP和/或更低版本,我建议你使用老的GetSystemMetrics(SM_CXSIZE)和GetSystemMetrics(SM_CYSIZE) (“窗口标题或标题栏中按钮的宽度,以像素为单位”)。你需要根据是否启用了主题,是否启用了aero等,来计算出一些近似值。
发布于 2012-01-08 19:01:48
我想带SPI_GETNONCLIENTMETRICS的SystemParametersInfo就是你要找的。我猜minimize和maximize按钮使用NONCLIENTMETRICS。iSmCaptionWidth while close使用iCaptionWidth来确定宽度。
https://stackoverflow.com/questions/8775428
复制相似问题