GetTextExtentPoint32不考虑当前字体

时间:2016-06-08 16:51:49

标签: c++ winapi text

我需要找到任何字体的字符串宽度。但是,当我使用GetTextExtentPoint32时,它不会使用当前字体的帐户。这是我的代码:

HFONT hFont = CreateFont(36, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, DEFAULT_CHARSET, 
    OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, NULL);

SelectObject(GetDC(m_hSettingsWnd), hFont);
GetTextExtentPoint32(GetDC(m_hSettingsWnd), TITLE_TEXT, wcslen(TITLE_TEXT), &sTextSize);
// TITLE_TEXT is the string I'm trying to get the width of.

还有人可以更正格式吗?我是Stack Overflow的新手,代码示例并没有为我正常工作。

1 个答案:

答案 0 :(得分:4)

SelectObject(GetDC(m_hSettingsWnd), ...);
GetTextExtentPoint32(GetDC(m_hSettingsWnd), ...);

以这种方式使用GetDC(),您正在创建资源泄漏。每次致电GetDC()后,都必须致电ReleaseDC()。每次拨打GetDC()都会创建一个单独的HDC,这就是为什么GetTextExtentPoint32()不知道您的字体的原因,因为您没有在第二个HDC中选择它。

正确使用GetDC()应该可以解决字体问题。在释放HDC

之前,请务必恢复旧字体
HDC hdc = GetDC(hwnd);
const wchar_t *buf = L"buf";
HFONT hFont = CreateFont(36, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, DEFAULT_CHARSET, 
    OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, NULL);

SIZE size;
HFONT oldfont = (HFONT) SelectObject(hdc, hFont);
GetTextExtentPoint32(hdc, buf, wcslen(buf), &size);

SelectObject(hdc, oldfont);
DeleteObject(hFont);

ReleaseDC(hwnd, hdc);