4

GetKerningPairsで使用する GDI のカーニング情報を取得するにはどうすればよいですか? ドキュメントには、

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

最初に 3 番目のパラメーターを NULL に設定して呼び出します。この場合、フォントのカーニング ペアの数が返されます。次に、メモリを割り当て、そのバッファを渡して再度呼び出します。

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

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

GetKernningPairs(your_dc, num_pairs, pairs);

編集: 簡単なテスト (GDI+ ではなく MFC を使用) を行ったところ、合理的な結果が得られました。私が使用したコードは次のとおりです。

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

問題は、Gdiplus::Fontの HFONT ではなくを渡しているという事実にありますSelectObjectFont* myFontに変換してHFONTから、それHFONTを SelectObjectに渡す必要があります。

まず、 を に変換するGdiplus::Fontには、からLOGFONTHFONTを取得する必要があります。ここまでできればあとは簡単です。カーニングペアの数を取得するための実用的なソリューションは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 に答える