我需要找到任何字体的字符串宽度。但是,当我使用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的新手,代码示例并没有为我正常工作。
答案 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);