为什么使用DrawText API绘制时字体边缘不平滑

Why are my font edges not smooth when drawn with the DrawText API?

本文关键字:字体 边缘 平滑 绘制 DrawText API 为什么      更新时间:2023-10-16

当我在dc上绘制文本时,文本会出现粗糙的边缘,而在这个WindowProc处理的多个窗口上,每个窗口之间的文本看起来都不一样,这看起来很不专业。有没有一种方法可以把它画出来,使它的边缘清晰、光滑?

    case WM_PAINT:
    {
    GetClientRect(hwnd, &rect);
    hdc = BeginPaint(hwnd, &ps);
    hdcmem = CreateCompatibleDC(hdc);
    BITMAP bm;      
    HBITMAP hbmold =  (HBITMAP)SelectObject(hdcmem, gbutton);
    GetObject(gbutton, sizeof(bm), &bm);
    SetBkMode(hdcmem, TRANSPARENT);
    SetTextColor(hdcmem, RGB(74,88,91));
    HFONT hf = CreateFont(30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, L"Myriad Pro");
    HFONT hfold = (HFONT)SelectObject(hdcmem, hf);
    //the next line works fine, but with rough text edges.
    DrawText(hdcmem, L"Drag arnFilernHere", -1, &rect, DT_CENTER | DT_VCENTER  );
    SelectObject(hdcmem, hfold);
    BitBlt(hdc, 0,0,bm.bmWidth,bm.bmHeight,hdcmem,0,0,SRCCOPY);
    SelectObject(hdcmem, hbmold);
    DeleteDC(hdcmem);
    EndPaint(hwnd, &ps);
    break;
    }

Myriad Pro是一种OpenType字体,不受GDI支持。请选择TrueType字体。

  1. 为字体指定一个非零限定符
  2. 确保您的CreateFont调用成功——如果调用失败,您将返回到(锯齿状)SYSTEM字体

关于示例代码的一般说明:

  1. 你泄露了HFONT
  2. 您可能应该static_cast HFONT,而不是C样式的强制转换

您可能想要为fdwQuality参数(倒数第三个参数)传递ANTIALIASED_QUALITYCLEARTYPE_QUALITY

确保在"显示设置"中启用ClearType。