2013-04-10 89 views
0

我需要从给定字体(例如Arial)获取字符的宽度。只有边框的宽度,没有间距。获取字体的字符宽度

HFONT font = CreateFont(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, L"Arial"); 

使用创建的HFONT,有没有办法提取这些信息?

int MyGetCharWidth(HFONT font, wchar_t wch) 
{ 
    // How to implement this? 
} 

回答

2

GetCharABCWidths,但要注意,它不会告诉你字距,所以这取决于你打算用这些信息做什么它可能会或可能不会有用。

如果你想要一个实际的文本字符串的宽度,有几个函数会为你测量它,如GetTextExtentPoint32。这些功能将包括任何字距修正。

+0

我只需要单个字符的边框的宽度,没有任何间距。这些功能似乎需要HDC而不是HFONT,为什么? – sashoalm 2013-04-10 16:45:10

+0

您必须将字体选择到设备上下文中,然后调用您选择用于测量文本的任何功能。原因是答案取决于您要显示文本的特定设备。诸如显示设备的分辨率和功能等可能会影响答案。屏幕上的十点Arial“X”可能与我的屏幕或打印机上的尺寸略有不同。 – 2013-04-10 16:52:07

1

这应该做的工作:

int MyGetCharWidth(HFONT font, wchar_t wch) 
{ 
    HDC hDC = GetDC(NULL) ; 
    HGDIOBJ oldfont = SelectObject(hDC, font) ; 

    RECT rect ; 
    DrawText(hDC, &wch, 1, &rect, DT_CALCRECT|DT_NOPREFIX) ; 

    SelectObject(hDC, oldfont) ; 
    return rect.right - rect.left ; 
} 

BTW这没有任何意义:

HFONT font = CreateFont(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, L"Arial"); 

您必须specifiy非空值的一些参数,例如:

CreateFont(fontsize, 0, 0, 0, FW_NORMAL, 0, 0, 0, 
          DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, 
          CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, 
          DEFAULT_PITCH, "Arial");