2011-03-27 80 views
0

當字體大小從(-16 * i)/ 72變爲(-n * i)/ 72時,GetCharABCWidths()和GetGlyphOutline()函數中的一個錯誤,對於低於16的任何nGetCharABCWidths()和GetGlyphOutline()返回FALSE。爲什麼?

字符'a'仍然正確顯示,但函數返回FALSE和GDI_ERROR。 爲什麼?對於GetCharABCWidths(),GetLastError()返回0(ERROR_SUCCESS),對於 GetGlyphOutline()GetLastError()返回1003(無法完成的功能)。

MAT2 gmat = { {0, 1}, {0, 0}, {0, 0}, {0, 1} }; 


case WM_PAINT: 

     PAINTSTRUCT ps; 

     BeginPaint(hwnd, &ps); 

     int i; 

     i = GetDeviceCaps(ps.hdc, LOGPIXELSY); 

     LOGFONT lf; 

     memset(&lf, 0, sizeof(LOGFONT)); 
     lf.lfHeight = (-14 * i)/72; 
     lf.lfWeight = FW_NORMAL; 
     lf.lfItalic = 0; 
     lf.lfCharSet = SYMBOL_CHARSET; 
     wcscpy(lf.lfFaceName, L"Symbol"); 

     HFONT hFont; 

     hFont = CreateFontIndirect(&lf); 
     hFont = (HFONT)SelectObject(ps.hdc, hFont); 

     BOOL bx; 
     ABC abc; 
     TCHAR tx; 
     DWORD dwx; 

     tx = 'a'; 

     if(!GetCharABCWidths(ps.hdc, tx, tx, &abc)) dwx = GetLastError(); 

     GLYPHMETRICS gm; 

     if(GetGlyphOutline(ps.hdc, tx, GGO_METRICS, &gm, 0, NULL, &gmat) == GDI_ERROR) 
      dwx = GetLastError(); 

     TextOut(ps.hdc, 10, 20, (LPTSTR)&tx, 1); 

     EndPaint(hwnd, &ps); 

回答

2

在我的系統,符號都存在一個光柵字體(symbole.fon)和OpenType字體(symbol.ttf),所以當GDI決定使用字體的光柵版本,您將無法獲得任何TrueType指標。要解決此問題,請將LOGFONTfdwOutputPrecision成員設置爲適合的內容,例如OUT_TT_PRECIS

+0

這很完美。這些函數現在可以工作n = 14。你能解釋爲什麼他們只在n> = 16之前工作嗎? – Ayrosa 2011-03-27 20:08:53

+0

@jaayrosa我的柵格字體提供了8,10,12,14,18,24的大小。所以我希望你的代碼在這六個值上失效。但我不確定GDI使用什麼算法來選擇字體。 – Neil 2011-03-27 20:18:40

+0

我真的很感謝你的幫助。我如何知道我的系統上安裝的字體? – Ayrosa 2011-03-27 20:22:31