Winapi 获取字体的字符宽度

Winapi 获取字体的字符宽度,winapi,Winapi,我需要从给定字体(例如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? } 有,但请注意,它不会告诉您有关字距调整的信息,因此它可能有用,也可能不

我需要从给定字体(例如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?
}
有,但请注意,它不会告诉您有关字距调整的信息,因此它可能有用,也可能不有用,这取决于您计划如何处理这些信息


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

这应该可以完成以下工作:

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 ;
}
顺便说一句,这没有意义:

HFONT font = CreateFont(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, L"Arial");
必须为某些参数指定非空值,例如:

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

我只需要单个字符边界框的宽度,没有任何间距。这些函数似乎需要HDC而不是HFONT,这是为什么?您必须在设备上下文中选择字体,然后调用您选择的任何函数来测量文本。原因是答案取决于要在其上显示文本的特定设备。显示设备的分辨率和功能等因素可能会影响答案。屏幕上的10点Arial“X”可能与我的屏幕或打印机上的大小略有不同。