【问题标题】:Winapi get string width in pixelsWinapi以像素为单位获取字符串宽度
【发布时间】:2013-06-17 20:26:55
【问题描述】:

我正在尝试创建一个以像素为单位提供字符串宽度的方法。 到目前为止我的代码:

inline void getTextWidth(HWND hwnd char* text) {
    SIZE textSize;
    GetTextExtentPoint32(GetDC(hwnd), text, strlen(text), &textSize);
    return ?;
}

我知道我应该使用LPtoDP (MSDN),但是需要点作为参数,而不是 GetTextExtentPoint32 返回的 SIZE。

如何转换?

【问题讨论】:

  • 这很不清楚。你的问题标题说像素,你的身体说点。您正在尝试获取一个返回 void 以返回某些内容的函数。当您似乎意味着返回值时,您会谈论参数。懒惰,做的更好。并解释为什么您认为需要更改从头开始创建的设备上下文的映射模式。
  • 别忘了修复HDC 泄漏。 GetDC() 返回的HDC 需要在使用完毕后用ReleaseDC() 释放。

标签: c++ winapi type-conversion gdi


【解决方案1】:

SIZE 结构同时包含高度和宽度。由于您只关心宽度,因此您显然想要LPtoDP(textSize.cx);

【讨论】:

    【解决方案2】:

    我用另一种方法解决了它。对于所有感兴趣的人,这是我的解决方案:

    int getStringWidth(char *text, HFONT font) {
        HDC dc = GetDC(NULL);
        SelectObject(dc, font);
    
        RECT rect = { 0, 0, 0, 0 };
        DrawText(dc, text, strlen(text), &rect, DT_CALCRECT | DT_NOPREFIX | DT_SINGLELINE);
        int textWidth = abs(rect.right - rect.left);
    
        DeleteDC(dc);
        return textWidth;
    }
    

    【讨论】:

    • 你匹配 ReleaseDCGetDC不是 DeleteDC
    • 那么,ReleaseDC(NULL, dc); ?
    猜你喜欢
    • 1970-01-01
    • 2011-11-18
    • 2011-09-24
    • 2011-06-28
    • 1970-01-01
    • 2011-09-15
    • 2013-08-22
    • 1970-01-01
    • 2015-03-05
    相关资源
    最近更新 更多