Получение доступных размеров шрифтов в Windows

StackOverflow https://stackoverflow.com/questions/1003450

  •  05-07-2019
  •  | 
  •  

Вопрос

Когда я открываю диалоговое окно Windows Common Font, в нем для каждого шрифта указывается несколько размеров. Для всех шрифтов OpenType / TrueType он имеет один и тот же список - 9, 10, 11, 12, 14, 16, 18 ... Для растровых шрифтов список варьируется в зависимости от доступных растровых изображений. " Мелкие шрифты " имеет 2,3,4,5,6,7, в то время как обычный старый Courier имеет 10, 12, 15. Я не знаю, но из предыдущего чтения я полагаю, что даже для шрифтов TrueType определенные размеры будут намекает и будет выглядеть лучше, чем все остальные размеры, поэтому, вероятно, я мог бы также увидеть шрифт TrueType с более ограниченным набором размеров.

Я реализую в своем приложении функцию, посредством которой Ctrl + Mousewheel будет масштабировать размер шрифта вверх и вниз, как это происходит в браузерах. Я хотел бы определить список доступных размеров для шрифта, чтобы, если я в настоящее время нахожусь в размере 12, мое приложение знает, что для Courier New следующий подходящий больший размер - 14, а для простого старого Courier - 15.

Как мне это сделать?

Это было полезно?

Решение

См. здесь для объяснения того, как перечислить шрифты / размеры шрифта для определенного шрифта. Обратите внимание, что шрифты TrueType могут отображаться в любом размере (а не только в заранее определенных), поскольку они основаны на векторах.

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;
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top