استرداد أحجام الخطوط المتوفرة على نظام التشغيل Windows

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

  •  05-07-2019
  •  | 
  •  

سؤال

عندما أقوم بفتح مربع حوار الخطوط العامة لـ Windows، فإنه يسرد، لكل خط، مجموعة من الأحجام.بالنسبة لجميع خطوط OpenType/TrueType، فهي تحتوي على نفس القائمة - 9، 10، 11، 12، 14، 16، 18...بالنسبة للخطوط النقطية، تختلف القائمة وفقًا للصور النقطية المتوفرة.تحتوي "الخطوط الصغيرة" على 2,3,4,5,6,7، بينما تحتوي الخطوط القديمة البسيطة على 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