GetTextExtentPoint32不考虑当前字体

Ole*_*kov 0 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.
Run Code Online (Sandbox Code Playgroud)

任何人也可以更正格式吗?我是Stack Overflow的新手,并且代码示例对我来说无法正常工作。

Bar*_*ani 5

SelectObject(GetDC(m_hSettingsWnd), ...);
GetTextExtentPoint32(GetDC(m_hSettingsWnd), ...);
Run Code Online (Sandbox Code Playgroud)

通过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);
Run Code Online (Sandbox Code Playgroud)