C++ 使用winapi计算按钮大小

C++ 使用winapi计算按钮大小,c++,winapi,C++,Winapi,我有工具栏上的按钮,可以有图像或/和下拉菜单,我有以下代码 int text_width = CalcTextWidth(); // this function use GetTextExtentPoint32 int image_width = CalcImageWidth(); 然后我将按钮宽度设置为文本宽度+图像宽度, 但在这样的公式中,文本/图像和边框之间的空格被忽略,并且也忽略了下拉箭头元素的大小 计算工具栏上按钮宽度的正确方法是什么 另外,按钮\u GetIdealSize()为我

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

int text_width = CalcTextWidth(); // this function use GetTextExtentPoint32
int image_width = CalcImageWidth();
然后我将按钮宽度设置为文本宽度+图像宽度, 但在这样的公式中,文本/图像和边框之间的空格被忽略,并且也忽略了下拉箭头元素的大小

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

另外,
按钮\u GetIdealSize()
为我提供了超出需要的宽度,因为它使用了下拉菜单中元素的最大宽度

更新:在我看来,没有办法正确计算按钮,但按钮的BTN_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);

有有趣的答案

既然您提到了它,那么在Windows7中获得下拉列表宽度的正确方法是什么?到目前为止,我们只需要用一个常量替换掉TP_SPLITBUTTONDROPDOWN代码

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

对于RegexBuddy和RegexMagic中的工具栏,我们使用Developer Express中的ExpressBars库。他们在Build47中解决了这个问题。修复方法是,当操作系统是Windows7时,他们现在使用GetSystemMetrics(SM_CYHSCROLL)来获取下拉按钮的宽度。我不知道这是否与您的代码相关,因为他们最初没有使用TP_SPLITBUTTONDROPDOWN。请注意,我指的是工具栏上的实际组合框,而不是带有下拉菜单的工具按钮

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


开始,你在这里已经2年5个月了。是时候学习如何格式化你的帖子了。