2012-04-10 23 views
4

Wie kann ich Kerning-Informationen für GDI erhalten, um sie dann in GetKerningPairs zu verwenden? Das besagt, dass documentationKerning-Informationen erhalten

Die Anzahl von Paaren in der lpkrnpair Array. Wenn die Schriftart mehr als nNumPairs Kerning-Paare enthält, gibt die Funktion einen Fehler zurück.

Allerdings weiß ich nicht, wie viele Paare übergeben werden, und ich sehe keine Möglichkeit, danach zu fragen.

EDIT # 2

Hier ist meine Fill-Anwendung, die ich auch versucht habe, das immer für die Anzahl der Paare 0 für jede Schriftart zu erzeugen. GetLastError gibt immer auch 0 zurück.

#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 Ich habe versucht, die folgenden zu tun, es aber gab mir noch 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); 

Antwort

3

Das Problem liegt in der Tatsache, dass Sie eine Gdiplus::Font und nicht eine HFONT für SelectObject übergeben. Sie müssen Font* myFont in ein HFONT konvertieren und dann das HFONT in SelectObject übergeben.

zunächst eine Gdiplus::Font in eine HFONT zu konvertieren, müssen Sie die LOGFONT vom Gdiplus::Font zu bekommen. Sobald Sie dies tun, ist der Rest einfach. Die Arbeitslösung zu erhalten Anzahl der Kerning-Paare ist

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

Wie Sie sehen können, ist die einzige funktionelle Veränderung gab ich war ein FONT zu schaffen.

3

Sie es zunächst mit dem dritten Parameter auf NULL gesetzt nennen, in welchem ​​Fall es wieder die Anzahl der Kerning-Paare für die Schriftart. Sie ordnen dann Speicher, und es diesen Puffer wieder rufen vorbei:

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

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

GetKernningPairs(your_dc, num_pairs, pairs); 

Edit: Ich habe einen schnellen Test (MFC von nicht GDI +) und bekam, was wie vernünftige Ergebnisse zu sein schien. Der Code, den ich verwendet wurde:

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

Diese 116 als das Ergebnis ausgedruckt.

+0

Damit das funktionieren würde, müsste ich meine Schriftarten dc verwenden, wie könnte ich das bekommen? – chadb

+0

@ chadb: Erstellen Sie einen Domänencontroller und wählen Sie die Schriftart aus. Normalerweise möchten Sie einen DC verwenden, der mit dem endgültigen Ziel kompatibel ist. Wenn also die Ausgabe auf den Bildschirm geht, erstellen Sie einen DC, der mit dem Bildschirm kompatibel ist. Wenn es zum Drucker geht, erstellen Sie einen für den Drucker. –

+1

Hmm, ich habe das probiert und ich bekomme immer noch 0. Ich habe meinen obigen Code aktualisiert, da er hier nicht passt. – chadb