为什么工具栏的文本大小错误?

时间:2009-10-30 15:51:05

标签: c++ windows winapi toolbar

在Win32 GUI应用程序中,我需要确定工具栏按钮上字符串占用的区域宽度,以便相应地调整按钮宽度。工具栏是普通的ToolbarWindow32窗口类。我使用以下代码:

 HDC dc = GetDC( toolbarWindowHandle );
 SIZE size;
 GetTextExtentPoint32( dc, stringToMeasure, tcslen(stringToMeasure), &size );

对于某些固定字符串(例如“Hello”)size.cx填充了72但是当我使用按钮上显示的相同字符串制作工具栏的屏幕截图时,我看到该字符串占据了56像素

差异显然取决于系统字体设置。我使用“大字体”,代码获得的值大于屏幕上占用的值。在具有“小字体”的机器上,获得的值较小。

我想如果我在窗口设备上下文中使用GetTextExtentPoint32(),它将返回完全正确的大小。我做错了什么?

1 个答案:

答案 0 :(得分:3)

工具栏使用的字体不会被选中到DC中,因此您需要计算出它使用的字体,创建副本,将其选择到DC中,获取大小然后选择字体输出(否则你最终会导致资源泄漏)。您将获得我期望的系统字体大小,或者默认DC字体的大小。

您可以尝试通过向工具栏窗口发送WM_GETFONT消息来查找使用的字体句柄,但这不能保证返回显示文本时使用的实际字体。这完全取决于工具栏内部的工作方式。

但是我很确定Win32工具栏使用菜单字体来渲染按钮文本,可以使用SystemParametersInfo和NONCLIENTMETRICS结构的组合来发现它。

如果我在工作,我会发布一些代码。

难道你不喜欢Win32吗?

顺便说一句,我使用工具栏按钮文字功能,从来没有用这种方式手动调整按钮大小。

http://msdn.microsoft.com/en-us/library/ms724947(VS.85).aspx   http://msdn.microsoft.com/en-us/library/ms724506(VS.85).asp