2009-10-30 76 views
0

在Win32 GUI應用程序中,我需要確定工具欄按鈕上字符串佔用的區域寬度,以便相應地調整按鈕寬度。該工具欄是普通的老式ToolbarWindow32 windows類。我使用下面的代碼:爲什麼我會在工具欄上弄錯文字大小?

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

對於一些固定的字符串(說「你好」)size.cx充滿說72,但是當我做了工具欄的截圖上一個按鈕,我看到,顯示的非常相同的字符串該字符串佔據56個像素。

區別很明顯取決於系統字體設置。我使用「大字體」,代碼獲得的值比屏幕上佔用的大。在具有「小字體」的機器上,獲得的值較小。

我想如果我在窗口設備上下文中使用GetTextExtentPoint32(),它將返回完全正確的大小。我究竟做錯了什麼?

回答

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

+0

原來,發送WM_GETFONT準確獲得必要的字體。 – sharptooth 2009-11-02 15:46:44

相關問題