4

如何获取 GDI 的字距调整信息,然后在GetKerningPairs中使用?该文件指出

lpkrnpair 数组中的对数。如果字体有多个 nNumPairs 字距对,则函数返回错误。

但是,我不知道要传入多少对,也没有办法查询它。

编辑#2

这是我也尝试过的填充应用程序,对于任何字体的对数,这始终为 0。GetLastError 也将始终返回 0。

#include <windows.h>
#include <Gdiplus.h>
#include <iostream>

using namespace std;
using namespace Gdiplus;

int main(void)
{
    GdiplusStartupInput gdiplusStartupInput;
    ULONG_PTR           gdiplusToken;
    GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

    Font* myFont = new Font(L"Times New Roman", 12);
    Bitmap* bitmap = new Bitmap(256, 256, PixelFormat32bppARGB);
    Graphics* g = new Graphics(bitmap);

    //HDC hdc = g->GetHDC();
    HDC hdc = GetDC(NULL);
    SelectObject(hdc, myFont->Clone());
    DWORD numberOfKerningPairs = GetKerningPairs(hdc, INT_MAX, NULL );

    cout << GetLastError() << endl;
    cout << numberOfKerningPairs << endl;

    GdiplusShutdown(gdiplusToken);

    return 0;
}

编辑 我尝试执行以下操作,但是,它仍然给了我 0。

Font* myFont = new Font(L"Times New Roman", 10);
Bitmap* bitmap = new Bitmap(256, 256, PixelFormat32bppARGB);
Graphics* g = new Graphics(bitmap);

SelectObject(g->GetHDC(), myFont);
//DWORD numberOfKerningPairs = GetKerningPairs( g->GetHDC(), -1, NULL );
DWORD numberOfKerningPairs = GetKerningPairs( g->GetHDC(), INT_MAX, NULL );
4

2 回答 2

3

您首先调用它时将第三个参数设置为 NULL,在这种情况下,它会返回字体的紧缩对数。然后分配内存,并通过该缓冲区再次调用它:

int num_pairs = GetKerningPairs(your_dc, -1, NULL);

KERNINGPAIR *pairs = malloc(sizeof(*pairs) * num_pairs);

GetKernningPairs(your_dc, num_pairs, pairs);

编辑:我做了一个快速测试(使用 MFC 而不是 GDI+)并得到了看起来合理的结果。我使用的代码是:

CFont font;
font.CreatePointFont(120, "Times New Roman", pDC);
pDC->SelectObject(&font);

int pairs = pDC->GetKerningPairs(1000, NULL);

CString result;
result.Format("%d", pairs);
pDC->TextOut(10, 10, result);

结果打印出来116了。

于 2012-04-10T03:44:24.557 回答
3

问题在于您传递的是 aGdiplus::Font而不是 HFONT SelectObject。您需要转换Font* myFontHFONT,然后将其传递HFONT给 SelectObject。

首先,要将 aGdiplus::Font转换为,HFONT您需要. Gdiplus::Font一旦你这样做了,剩下的就很简单了。获得紧缩对数量的工作解决方案是

Font* gdiFont = new Font(L"Times New Roman", 12);

Bitmap* bitmap = new Bitmap(256, 256, PixelFormat32bppARGB);
Graphics* g = new Graphics(bitmap);

LOGFONT logFont;
gdiFont->GetLogFontA(g, &logFont);
HFONT hfont = CreateFontIndirect(&logFont);

HDC hdc = GetDC(NULL);
SelectObject(hdc, hfont);
DWORD numberOfKerningPairs = GetKerningPairs(hdc, INT_MAX, NULL );

如您所知,我给出的唯一功能更改是创建一个FONT.

于 2012-04-11T02:36:50.383 回答