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);
這很完美。這些函數現在可以工作n = 14。你能解釋爲什麼他們只在n> = 16之前工作嗎? – Ayrosa 2011-03-27 20:08:53
@jaayrosa我的柵格字體提供了8,10,12,14,18,24的大小。所以我希望你的代碼在這六個值上失效。但我不確定GDI使用什麼算法來選擇字體。 – Neil 2011-03-27 20:18:40
我真的很感謝你的幫助。我如何知道我的系統上安裝的字體? – Ayrosa 2011-03-27 20:22:31