Поделиться через


Функция CreateFontW (wingdi.h)

Функция CreateFont создает логический шрифт с указанными характеристиками. Впоследствии логический шрифт можно выбрать в качестве шрифта для любого устройства.

Синтаксис

HFONT CreateFontW(
  [in] int     cHeight,
  [in] int     cWidth,
  [in] int     cEscapement,
  [in] int     cOrientation,
  [in] int     cWeight,
  [in] DWORD   bItalic,
  [in] DWORD   bUnderline,
  [in] DWORD   bStrikeOut,
  [in] DWORD   iCharSet,
  [in] DWORD   iOutPrecision,
  [in] DWORD   iClipPrecision,
  [in] DWORD   iQuality,
  [in] DWORD   iPitchAndFamily,
  [in] LPCWSTR pszFaceName
);

Параметры

[in] cHeight

Высота (в логических единицах) символьной ячейки или символа шрифта. Значение высоты символа (также известное как высота em) — это значение высоты ячейки символов за вычетом внутреннего начального значения. Средство сопоставления шрифтов интерпретирует значение, указанное в nHeight , следующим образом.

Значение Значение
> 0
Функция сопоставления шрифтов преобразует это значение в единицы устройства и сопоставляет его с высотой ячеек доступных шрифтов.
0
Функция сопоставления шрифтов использует значение высоты по умолчанию при поиске совпадения.
< 0
Модуль сопоставления шрифтов преобразует это значение в единицы устройства и сопоставляет его абсолютное значение с высотой символов доступных шрифтов.
 

Для всех сравнений высоты сопоставителя шрифтов выполняется поиск самого большого шрифта, который не превышает запрошенный размер.

Это сопоставление возникает при первом использовании шрифта.

В режиме сопоставления MM_TEXT можно использовать следующую формулу, чтобы указать высоту шрифта с указанным размером точек:


nHeight = -MulDiv(PointSize, GetDeviceCaps(hDC, LOGPIXELSY), 72);

[in] cWidth

Средняя ширина символов запрошенного шрифта в логических единицах. Если это значение равно нулю, сопоставителя шрифтов выбирает ближайшее значение соответствия. Ближайшее значение соответствия определяется путем сравнения абсолютных значений разницы между пропорциями текущего устройства и оцифровано пропорциями доступных шрифтов.

[in] cEscapement

Угол в десятых градусах между вектором escapement и осью X устройства. Вектор escapement параллелен базовой строке строки текста.

Если для режима графики задано значение GM_ADVANCED, можно указать угол экранирования строки независимо от угла ориентации символов строки.

Если для режима графики задано значение GM_COMPATIBLE, nEscapement указывает экранирование и ориентацию. Следует задать для nEscapement и nOrientation одинаковое значение.

[in] cOrientation

Угол (в десятых градусах) между базовой линией каждого символа и осью X устройства.

[in] cWeight

Вес шрифта в диапазоне от 0 до 1000. Например, 400 — это нормально, а 700 — полужирный. Если это значение равно нулю, используется вес по умолчанию.

Для удобства определяются следующие значения.

Вес Значение
FW_DONTCARE
0
FW_THIN
100
FW_EXTRALIGHT
200
FW_ULTRALIGHT
200
FW_LIGHT
300
FW_NORMAL
400
FW_REGULAR
400
FW_MEDIUM
500
FW_SEMIBOLD
600
FW_DEMIBOLD
600
FW_BOLD
700
FW_EXTRABOLD
800
FW_ULTRABOLD
800
FW_HEAVY
900
FW_BLACK
900

[in] bItalic

Указывает курсив, если задано значение TRUE.

[in] bUnderline

Указывает подчеркнутый шрифт, если задано значение TRUE.

[in] bStrikeOut

Зачеркивать шрифт, если задано значение TRUE.

[in] iCharSet

Набор символов. Следующие значения предопределяются:

  • ANSI_CHARSET
  • BALTIC_CHARSET
  • CHINESEBIG5_CHARSET
  • DEFAULT_CHARSET
  • EASTEUROPE_CHARSET
  • GB2312_CHARSET
  • GREEK_CHARSET
  • HANGUL_CHARSET
  • MAC_CHARSET
  • OEM_CHARSET
  • RUSSIAN_CHARSET
  • SHIFTJIS_CHARSET
  • SYMBOL_CHARSET
  • TURKISH_CHARSET
  • VIETNAMESE_CHARSET
Выпуск Windows на корейском языке:
  • JOHAB_CHARSET
Выпуск Windows для ближневосточных языков:
  • ARABIC_CHARSET
  • HEBREW_CHARSET
Выпуск Windows на тайском языке:
  • THAI_CHARSET
Значение OEM_CHARSET указывает набор символов, зависящий от операционной системы.

DEFAULT_CHARSET задано значение на основе текущего языкового стандарта системы. Например, если языковой стандарт системы — английский (США), он задается как ANSI_CHARSET.

В операционной системе могут существовать шрифты с другими кодировками. Если приложение использует шрифт с неизвестным набором символов, оно не должно пытаться перевести или интерпретировать строки, отображаемые с помощью этого шрифта.

Чтобы обеспечить согласованность результатов при создании шрифта, не указывайте OEM_CHARSET или DEFAULT_CHARSET. Если вы указываете имя шрифта в параметре lpszFace , убедитесь, что значение fdwCharSet соответствует набору символов шрифта, указанного в lpszFace.

[in] iOutPrecision

Точность вывода. Точность выходных данных определяет, насколько точно выходные данные должны соответствовать высоте, ширине, ориентации символов, escapement, шагу и типу шрифта. Может быть одним из указанных далее.

Значение Значение
OUT_CHARACTER_PRECIS
Не используется.
OUT_DEFAULT_PRECIS
Поведение сопоставителя шрифтов по умолчанию.
OUT_DEVICE_PRECIS
Указывает сопоставитель шрифтов выбрать шрифт Устройства, если система содержит несколько шрифтов с одинаковым именем.
OUT_OUTLINE_PRECIS
Это значение указывает средству сопоставления шрифтов выбрать из TrueType и других шрифтов на основе структуры.
OUT_PS_ONLY_PRECIS
Указывает средству сопоставления шрифтов выбрать только шрифты PostScript. Если в системе не установлены шрифты PostScript, средство сопоставления шрифтов возвращается к поведению по умолчанию.
OUT_RASTER_PRECIS
Указывает сопоставителю шрифтов выбрать растровый шрифт, если система содержит несколько шрифтов с одинаковым именем.
OUT_STRING_PRECIS
Это значение не используется сопоставитель шрифтов, но возвращается при перечислении растровых шрифтов.
OUT_STROKE_PRECIS
Это значение не используется сопоставитель шрифтов, но возвращается при перечислении TrueType, других шрифтов на основе структуры и векторных шрифтов.
OUT_TT_ONLY_PRECIS
Указывает средству сопоставления шрифтов выбрать только шрифты TrueType. Если в системе не установлены шрифты TrueType, средство сопоставления шрифтов возвращает поведение по умолчанию.
OUT_TT_PRECIS
Указывает сопоставитель шрифтов выбрать шрифт TrueType, если система содержит несколько шрифтов с одинаковым именем.
 

Приложения могут использовать значения OUT_DEVICE_PRECIS, OUT_RASTER_PRECIS, OUT_TT_PRECIS и OUT_PS_ONLY_PRECIS для управления тем, как средство сопоставления шрифтов выбирает шрифт, если операционная система содержит несколько шрифтов с указанным именем. Например, если операционная система содержит шрифт Symbol в растровой форме и TrueType, указание OUT_TT_PRECIS заставляет сопоставителя шрифтов выбрать версию TrueType. Указание OUT_TT_ONLY_PRECIS заставляет сопоставителя шрифтов выбирать шрифт TrueType, даже если он должен заменить шрифт TrueType с другим именем.

[in] iClipPrecision

Точность обрезки. Точность обрезки определяет, как обрезать символы, которые частично находятся за пределами области обрезки. Это может быть одно или несколько из следующих значений.

Значение Значение
CLIP_CHARACTER_PRECIS
Не используется.
CLIP_DEFAULT_PRECIS
Задает поведение обрезки по умолчанию.
CLIP_DFA_DISABLE
Windows XP с пакетом обновления 1 (SP1): отключает сопоставление шрифтов для шрифта. Обратите внимание, что этот флаг не будет иметь никакого влияния на любую платформу после Windows Server 2003.
CLIP_EMBEDDED
Этот флаг необходимо указать, чтобы использовать встроенный шрифт только для чтения.
CLIP_LH_ANGLES
При использовании этого значения поворот для всех шрифтов зависит от того, является ли ориентация системы координат левой или правой.

Если шрифты устройства не используются, они всегда поворачиваются против часовой стрелки, но поворот других шрифтов зависит от ориентации системы координат.

Дополнительные сведения о ориентации систем координат см. в описании параметра nOrientation .

CLIP_MASK
Не используется.
CLIP_DFA_OVERRIDE
Отключает сопоставление шрифтов для шрифта. Это идентично CLIP_DFA_DISABLE, но в некоторых ситуациях это может иметь проблемы; Рекомендуемый флаг для использования — CLIP_DFA_DISABLE.
CLIP_STROKE_PRECIS
Не используется сопоставитель шрифтов, но возвращается при перечислении растровых, векторных или TrueType шрифтов.

Для обеспечения совместимости это значение всегда возвращается при перечислении шрифтов.

CLIP_TT_ALWAYS
Не используется.

[in] iQuality

Качество вывода. Качество вывода определяет, насколько тщательно GDI должен пытаться сопоставить атрибуты логического шрифта с атрибутами фактического физического шрифта. Может быть одним из указанных далее.

Значение Значение
ANTIALIASED_QUALITY
Шрифт сглаживается или сглаживается, если шрифт поддерживает его и размер шрифта не слишком мал или слишком большой.
CLEARTYPE_QUALITY
Если этот параметр задан, текст отображается (по возможности) с помощью метода сглаживания ClearType. Дополнительные сведения см. в разделе "Примечания".
DEFAULT_QUALITY
Внешний вид шрифта не имеет значения.
DRAFT_QUALITY
Внешний вид шрифта менее важен, чем при использовании значения PROOF_QUALITY. Для растровых шрифтов GDI включено масштабирование, что означает, что доступны дополнительные размеры шрифтов, но качество может быть ниже. При необходимости синтезируются полужирные, курсивные шрифты, подчеркивание и зачеркивающие шрифты.
NONANTIALIASED_QUALITY
Шрифт никогда не сглаживается, то есть сглаживание шрифта не выполняется.
PROOF_QUALITY
Качество символов шрифта важнее точного сопоставления атрибутов логического шрифта. Для растровых шрифтов GDI масштабирование отключено и выбирается шрифт, ближайший по размеру. Несмотря на то, что выбранный размер шрифта не может быть сопоставлен точно при использовании PROOF_QUALITY, качество шрифта высокое и нет искажения внешнего вида. При необходимости синтезируются полужирные, курсивные шрифты, подчеркивание и зачеркивающие шрифты.
 

Если качество вывода DEFAULT_QUALITY, DRAFT_QUALITY или PROOF_QUALITY, шрифт будет сглаживается, если системный параметр SPI_GETFONTSMOOTHING имеет значение TRUE. Пользователи могут управлять этим системным параметром из панель управления. (Точная формулировка параметра на панели управления зависит от версии Windows, но это будут слова с эффектом "Гладкие края шрифтов экрана".)

[in] iPitchAndFamily

Шаг и семейство шрифта. Два бита нижнего порядка определяют шаг шрифта и могут иметь одно из следующих значений:

  • DEFAULT_PITCH
  • FIXED_PITCH
  • VARIABLE_PITCH
Четыре бита высокого порядка определяют семейство шрифтов и могут быть одним из следующих значений.
Значение Значение
FF_DECORATIVE
Шрифты новизны. Например, Old English.
FF_DONTCARE
Используйте шрифт по умолчанию.
FF_MODERN
Шрифты с постоянной шириной штриха, с засечками или без нее. Примерами являются Pica, Elite и Courier New.
FF_ROMAN
Шрифты с переменной шириной штриха и засечками. Например, MS Serif.
FF_SCRIPT
Шрифты, предназначенные для рукописного ввода. Например, Script и Cursive.
FF_SWISS
Шрифты с переменной шириной штриха и без засечек. MS? Примером является sans Serif.
 

Приложение может указать значение для параметра fdwPitchAndFamily , используя логический оператор OR для соединения константы тона с константой семейства.

Семейства шрифтов описывают внешний вид шрифта в общем виде. Они предназначены для указания шрифтов, когда точный запрошенный шрифт недоступен.

[in] pszFaceName

Указатель на строку, завершающуюся нулевым значением, которая указывает имя шрифта. Длина этой строки не должна превышать 32 символа, включая завершающий символ NULL. Функцию EnumFontFamilies можно использовать для перечисления имен шрифтов всех доступных в настоящее время шрифтов. Дополнительные сведения см. в разделе «Примечания».

Если аргумент lpszFace имеет значение NULL или пустую строку, GDI использует первый шрифт, соответствующий другим указанным атрибутам.

Возвращаемое значение

Если функция выполняется успешно, возвращаемое значение является дескриптором логического шрифта.

Если функция завершается сбоем, возвращается значение NULL.

Комментарии

Если шрифт больше не нужен, вызовите функцию DeleteObject , чтобы удалить его.

Чтобы защитить авторские права поставщиков, предоставляющих шрифты для Windows, приложения должны всегда сообщать точное имя выбранного шрифта. Так как доступные шрифты могут отличаться в разных системах, не предполагайте, что выбранный шрифт всегда совпадает с запрошенным шрифтом. Например, если вы запросите шрифт с именем Palatino, но такой шрифт недоступен в системе, средство сопоставления шрифтов заменит шрифт с похожими атрибутами, но с другим именем. Всегда сообщайте пользователю имя выбранного шрифта.

Чтобы получить соответствующий шрифт в версиях ОС на разных языках, вызовите Метод EnumFontFamiliesEx с нужными характеристиками шрифта в структуре LOGFONT , а затем получите соответствующее имя шрифта и создайте шрифт с помощью Командлета CreateFont или CreateFontIndirect.

Сопоставителя шрифтов для CreateFont, CreateFontIndirect и CreateFontIndirectEx распознает как английский, так и локализованное имя шрифта, независимо от языкового стандарта.

Следующие ситуации не поддерживают сглаживание ClearType:

  • Текст, отображаемый на принтере.
  • Набор для отображения не более 256 цветов.
  • Текст, отображаемый клиенту сервера терминалов.
  • Шрифт не является шрифтом TrueType или шрифтом OpenType с контурами TrueType. Например, следующее не поддерживает сглаживание ClearType: шрифты типа 1, шрифты Postscript OpenType без контуров TrueType, точечные шрифты, векторные шрифты и шрифты устройств.
  • Шрифт настраивает внедренные растровые изображения только для размеров шрифтов, содержащих внедренные растровые изображения. Например, это часто встречается в восточноазиатских шрифтах.

Примеры

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;
    switch (message)
    {
    
    
    case WM_PAINT:
        {
        RECT rect;
        HFONT hFontOriginal, hFont1, hFont2, hFont3;
        hdc = BeginPaint(hWnd, &ps);

            
            //Logical units are device dependent pixels, so this will create a handle to a logical font that is 48 pixels in height.
            //The width, when set to 0, will cause the font mapper to choose the closest matching value.
            //The font face name will be Impact.
            hFont1 = CreateFont(48,0,0,0,FW_DONTCARE,FALSE,TRUE,FALSE,DEFAULT_CHARSET,OUT_OUTLINE_PRECIS,
                CLIP_DEFAULT_PRECIS,CLEARTYPE_QUALITY, VARIABLE_PITCH,TEXT("Impact"));
            hFontOriginal = (HFONT)SelectObject(hdc, hFont1);
            
            //Sets the coordinates for the rectangle in which the text is to be formatted.
            SetRect(&rect, 100,100,700,200);
            SetTextColor(hdc, RGB(255,0,0));
            DrawText(hdc, TEXT("Drawing Text with Impact"), -1,&rect, DT_NOCLIP);
            
            //Logical units are device dependent pixels, so this will create a handle to a logical font that is 36 pixels in height.
            //The width, when set to 20, will cause the font mapper to choose a font which, in this case, is stretched.
            //The font face name will be Times New Roman.  This time nEscapement is at -300 tenths of a degree (-30 degrees)
            hFont2 = CreateFont(36,20,-300,0,FW_DONTCARE,FALSE,TRUE,FALSE,DEFAULT_CHARSET,OUT_OUTLINE_PRECIS,
                CLIP_DEFAULT_PRECIS,CLEARTYPE_QUALITY, VARIABLE_PITCH,TEXT("Times New Roman"));
            SelectObject(hdc,hFont2);
            
            //Sets the coordinates for the rectangle in which the text is to be formatted.
            SetRect(&rect, 100, 200, 900, 800);
            SetTextColor(hdc, RGB(0,128,0));
            DrawText(hdc, TEXT("Drawing Text with Times New Roman"), -1,&rect, DT_NOCLIP);
            
            //Logical units are device dependent pixels, so this will create a handle to a logical font that is 36 pixels in height.
            //The width, when set to 10, will cause the font mapper to choose a font which, in this case, is compressed. 
            //The font face name will be Arial. This time nEscapement is at 250 tenths of a degree (25 degrees)
            hFont3 = CreateFont(36,10,250,0,FW_DONTCARE,FALSE,TRUE,FALSE,DEFAULT_CHARSET,OUT_OUTLINE_PRECIS,
                CLIP_DEFAULT_PRECIS,ANTIALIASED_QUALITY, VARIABLE_PITCH,TEXT("Arial"));
            SelectObject(hdc,hFont3);

            //Sets the coordinates for the rectangle in which the text is to be formatted.
            SetRect(&rect, 500, 200, 1400, 600);
            SetTextColor(hdc, RGB(0,0,255));
            DrawText(hdc, TEXT("Drawing Text with Arial"), -1,&rect, DT_NOCLIP);

            SelectObject(hdc,hFontOriginal);
            DeleteObject(hFont1);
            DeleteObject(hFont2);
            DeleteObject(hFont3);
        
        EndPaint(hWnd, &ps);
        break;
        }
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

Другой пример см. в разделе Настройка шрифтов для Menu-Item текстовых строк в разделе Использование меню.

Примечание

Заголовок wingdi.h определяет CreateFont в качестве псевдонима, который автоматически выбирает версию ANSI или Юникод этой функции на основе определения константы препроцессора UNICODE. Использование псевдонима, не зависящий от кодирования, с кодом, который не является нейтральным для кодировки, может привести к несоответствиям, которые приводят к ошибкам компиляции или времени выполнения. Дополнительные сведения см. в разделе Соглашения для прототипов функций.

Требования

   
Минимальная версия клиента Windows 2000 Professional [только классические приложения]
Минимальная версия сервера Windows 2000 Server [только классические приложения]
Целевая платформа Windows
Header wingdi.h (включая Windows.h)
Библиотека Gdi32.lib
DLL Gdi32.dll

См. также раздел

CreateFontIndirect

CreateFontIndirectEx

DeleteObject

EnumFontFamilies

EnumFontFamiliesEx

EnumFonts

Функции шрифта и текста

Общие сведения о шрифтах и тексте

LOGFONT

SelectObject