【问题标题】:GetTextExtentPoint32 Doesn't Take Account of the Current FontGetTextExtentPoint32 不考虑当前字体
【发布时间】:2016-06-08 16:51:48
【问题描述】:

我需要找到任何字体的字符串的宽度。但是,当我使用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 的新手,代码示例对我来说不能正常工作。

【问题讨论】:

    标签: c++ winapi text


    【解决方案1】:
    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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-15
      • 1970-01-01
      • 2019-08-20
      • 1970-01-01
      相关资源
      最近更新 更多