gpt4 book ai didi

c++ - 我必须使用什么 Uxtheme 函数来获取最小化、最大化和关闭按钮的默认大小?

转载 作者:可可西里 更新时间:2023-11-01 16:38:24 25 4
gpt4 key购买 nike

我正在使用 DrawThemeBackground函数在 Canvas 上绘制一些系统元素,我需要绘制表单的标题按钮,我唯一错过的部分是如何获得标题按钮的 default 大小。 是否存在任何 Uxtheme 函数来获取该信息?

enter image description here

最佳答案

看起来这比听起来更难。

首先是 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));

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


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

关于c++ - 我必须使用什么 Uxtheme 函数来获取最小化、最大化和关闭按钮的默认大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8775428/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com