2012-04-10 3 views
4

Как получить информацию о кернинге для GDI, чтобы затем использовать ее в GetKerningPairs? В 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, а не HFONT для SelectObject. Вам необходимо преобразовать Font* myFont в HFONT, а затем передать HFONT в SelectObject.

Во-первых, чтобы преобразовать Gdiplus::Font в HFONT, вам нужно, чтобы получить LOGFONT от 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.

3

Вы первый называть его третьим параметром равным NULL, в этом случае возвращается количество пар кернинга для шрифта. Затем выделить память, и вызвать его снова передавая этот буфер:

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

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

GetKernningPairs(your_dc, num_pairs, pairs); 

Edit: Я сделал быстрый тест (с использованием 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 как результат.

+0

Для этого, казалось бы, мне нужно будет использовать мои шрифты постоянного тока, как я могу это получить? – chadb

+0

@chadb: создайте DC и выберите шрифт в нем. Обычно вы хотите использовать DC, совместимый с конечной целью, поэтому, если выход идет на экран, создайте DC, совместимый с экраном. Если принтер подходит к принтеру, создайте его для принтера. –

+1

Хм, я попробовал это, и я все равно получаю 0. Я обновил свой код выше, так как он здесь не подходит. – chadb

Смежные вопросы