2012-04-10 34 views
4

GetKerningPairsで使用するGDIのカーニング情報を取得するにはどうすればよいですか? documentationは、そのことを述べていますカーニング情報の取得

lpkrnpair配列のペア数です。フォントに 以上のnNumPairsカーニングペアがある場合、関数はエラーを返します。

しかし、どのくらいの数のペアが渡されるのかわかりません。私はそれを照会する方法がありません。ここで

EDIT#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; 
} 

EDIT は、しかし、それはまだ私には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); 

答えて

3

Gdiplus::Fontを渡していて、SelectObjectのHFONTではないという点に問題があります。 Font* myFontHFONTに変換してから、HFONTをSelectObjectに渡す必要があります。

まず、Gdiplus::FontHFONTに変換するには、LOGFONTGdiplus::Fontから取得する必要があります。一度これを行うと、残りはシンプルです。作業溶液は、カーニングペアの数は、あなたが言うことができるように、私が与えただけで、機能変更は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); 

で取得します。

3

を与えたあなたはまず、それが返した場合にはNULLに設定された第3のパラメータ、とそれを呼び出しますフォントのカーニングペアの数その後、メモリを割り当て、そのバッファを渡し、再びそれを呼び出す:

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

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

GetKernningPairs(your_dc, num_pairs, pairs); 

編集:私は(ないのGDI +でMFCを使用して)簡単なテストを行なったし、合理的な結果のように思えたものを得ました。私が使用したコードは以下のとおりであった:これは、結果として116をプリントアウト

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); 

+0

それを動作させるには、フォントdcを使用する必要があるようですが、どうすればそれを得ることができますか? – chadb

+0

@chadb:DCを作成し、その中のフォントを選択します。最終的なターゲットと互換性のあるDCを使用したいので、出力が画面に表示される場合は、画面と互換性のあるDCを作成します。プリンタに接続する場合は、プリンタ用にプリンタを作成します。 –

+1

うーん、私はそれを試して、私はまだ0を得る。私はここに適合しないので、上記の私のコードを更新しました。 – chadb

関連する問題