Sal*_*dor 9 c++ delphi winapi uxtheme
我正在使用该DrawThemeBackground功能在画布上绘制一些系统元素,我需要绘制一个表单的标题按钮,我唯一想念的部分就是如何获得default标题按钮的大小.Exist any Uxtheme function to get that info?

看起来这听起来比较困难.
首先是GetThemeMetric或GetThemeInt.但是,当您尝试检索字幕按钮的属性时0x8007490,您会看到许多引用这些函数返回一些"未找到元素".
那就是GetThemePartSize.这个似乎有点工作.例如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);
Run Code Online (Sandbox Code Playgroud)
我不知道前两个函数在它们工作时会返回什么(当前标题栏大小的按钮尺寸或默认标题栏大小).
获得准确结果的唯一可能方法似乎是使用该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));
Run Code Online (Sandbox Code Playgroud)
然后,您可以从rect获取关闭按钮的大小TitleInfo.rgrect[5].有关详细信息,请参阅" TITLEBARINFOEX结构 ".请注意,值在屏幕坐标中.
如果你需要支持XP和/或以下,我建议你使用旧的GetSystemMetrics(SM_CXSIZE)和GetSystemMetrics(SM_CYSIZE)("窗口标题或标题栏中按钮的宽度,以像素为单位").您需要锻炼一些近似值,具体取决于是否启用了主题,是否启用了aero等.