GetCharABCWidths()和GetGlyphOutline()返回FALSE。为什么?

时间:2011-03-27 19:51:19

标签: windows winapi

当字体大小从(-16 * i)/ 72更改为(-n * i)/ 72时,对于任何下面的n,GetCharABCWidths()和GetGlyphOutline()函数中似乎存在错误16。

字符'a'仍然正确显示,但函数返回FALSE和GDI_ERROR。 为什么???

GetCharABCWidths()的GetLastError()返回0(ERROR_SUCCESS)并且 GetGlyphOutline()GetLastError()返回1003(CAN NOT COMPLETE FUNCTION)。

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

1 个答案:

答案 0 :(得分:2)

在我的系统上,Symbol既是光栅字体(symbole.fon)又是OpenType字体(symbol.ttf),所以当GDI决定使用光栅版本的字体时,你不会能够获得任何TrueType指标。要解决此问题,请将fdwOutputPrecision的{​​{1}}成员设置为合适的成员,例如LOGFONT