Pregunta

Cuando abro el Diálogo de fuente común de Windows, enumera, para cada fuente, un montón de tamaños. Para todas las fuentes OpenType / TrueType, tiene la misma lista: 9, 10, 11, 12, 14, 16, 18 ... Para las fuentes de mapa de bits, la lista varía según los mapas de bits disponibles. " Fuentes pequeñas " tiene 2,3,4,5,6,7, mientras que el antiguo Courier tiene 10, 12, 15. No lo sé, pero desde la lectura anterior creo que creo que incluso para las fuentes TrueType, ciertos tamaños serán insinuó y se verá mejor que todos esos otros tamaños, así que probablemente también podría ver una fuente TrueType con un conjunto de tamaños más restringido.

Estoy implementando una función en mi aplicación mediante la cual Ctrl + Mousewheel aumentará o disminuirá el tamaño de la fuente, como lo hace en los navegadores. Me gustaría determinar la lista disponible de tamaños para una fuente, de modo que si actualmente tengo el tamaño 12, mi aplicación sabe que para Courier New, el siguiente tamaño más grande apropiado es 14, mientras que para Courier old, es 15.

¿Cómo hago para hacer esto?

¿Fue útil?

Solución

Ver aquí para obtener una explicación sobre cómo enumerar fuentes / tamaños de fuente para una fuente específica. Tenga en cuenta que las fuentes TrueType se pueden mostrar en cualquier tamaño (y no solo en las predeterminadas), ya que están basadas en vectores.

int EnumFontSizes(char *fontname)
{
    LOGFONT logfont;

    ZeroMemory(&logfont, sizeof logfont);

    logfont.lfHeight = 0;
    logfont.lfCharSet = DEFAULT_CHARSET;
    logfont.lfPitchAndFamily = FIXED_PITCH | FF_DONTCARE;

    lstrcpy(logfont.lfFaceName, fontname);

    EnumFontFamiliesEx(hdc, &logfont, (FONTENUMPROC)FontSizesProc, 0, 0);

    return 0;
}

int CALLBACK FontSizesProc(
    LOGFONT *plf,      /* pointer to logical-font data */
    TEXTMETRIC *ptm,   /* pointer to physical-font data */
    DWORD FontType,    /* font type */
    LPARAM lParam      /* pointer to application-defined data */
    )
{
    static int truetypesize[] = { 8, 9, 10, 11, 12, 14, 16, 18, 20, 
            22, 24, 26, 28, 36, 48, 72 };

    int i;

    if(FontType != TRUETYPE_FONTTYPE)
    {
        int  logsize    = ptm->tmHeight - ptm->tmInternalLeading;
        long pointsize  = MulDiv(logsize, 72, GetDeviceCaps(hdc, LOGPIXELSY));

        for(i = 0; i < cursize; i++)
            if(currentsizes[i] == pointsize)
                return 1;

        printf("%d ", pointsize);

        currentsizes[cursize] = pointsize;

        if(++cursize == 200) return 0;
        return 1;   
    }
    else
    {

        for(i = 0; i < (sizeof(truetypesize) / sizeof(truetypesize[0])); i++)
        {
            printf("%d ", truetypesize[i]);
        }

        return 0;
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top