使用winapi计算按钮大小

Calculating button size using winapi

本文关键字:按钮 计算 winapi 使用      更新时间:2023-10-16

工具栏上有一个按钮,可以是图像或/和下拉菜单,我有以下代码

int text_width = CalcTextWidth(); // this function use GetTextExtentPoint32
int image_width = CalcImageWidth();

然后我设置设置按钮宽度为text_width + image_width,但是在这样的公式中,文本/图像和边框之间的空格被忽略了,也忽略了下拉箭头元素的大小。

计算工具栏按钮宽度的正确方法是什么

注:Button_GetIdealSize()给我的宽度比我需要的要大,因为它使用了下拉菜单中元素的最大宽度

更新:在我看来,没有办法正确地计算按钮,但按钮的BTNS_AUTOSIZE标志使我需要的大部分

默认按钮大小?

可能这就是答案,我没有检查

 HTHEME hTheme = NULL;
        if(_ThemeHelper::IsAppThemed())
          hTheme = _ThemeHelper::OpenThemeData(pInfo->hdr.hwndFrom, L"TOOLBAR");
        if (hTheme)
        {
           CSize size(0, 0);
           int state1 = (bHot && bSelected) ? TS_PRESSED : TS_HOT;
           _ThemeHelper::GetThemePartSize(hTheme, dc, TP_SPLITBUTTONDROPDOWN, state1, 0, TS_TRUE, &size);

有有趣的答案

既然你提到了,在Windows 7中获得下拉宽度的正确方法是什么?到目前为止,我们只需要用常量替换TP_SPLITBUTTONDROPDOWN代码。

Craig Peterson评论- 2009年11月11日星期三0:42

我们使用Developer Express中的ExpressBars库作为RegexBuddy和RegexMagic中的工具栏。他们在build 47中修复了这个问题。修复是,他们现在使用GetSystemMetrics(SM_CYHSCROLL)来获得下拉按钮的宽度,当操作系统是Windows 7。我不知道这是否与你的代码相关,因为他们一开始就没有使用TP_SPLITBUTTONDROPDOWN。请注意,我讨论的是工具栏上的实际组合框,而不是带有下拉菜单的工具按钮。

Jan Goyvaerts评论- 2009年11月11日星期三@ 9:59

从http://www.micro-isv.asia/2009/11/windows-7-is-to-vista-what-xp-was-to-2000/