CreateFontA 函式 (wingdi.h)

CreateFont 函式會建立具有指定特性的邏輯字型。 邏輯字型隨後可以選取為任何裝置的字型。

語法

HFONT CreateFontA(
  [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] LPCSTR pszFaceName
);

參數

[in] cHeight

字型字元儲存格或字元的高度,以邏輯單位表示。 字元高度值 (也稱為 em height) 是字元儲存格高度值減去內部前置值。 字型對應程式會以下列方式解譯 nHeight 中指定的值。

意義
> 0
字型對應程式會將此值轉換成裝置單位,並將其與可用字型的單元格高度相符。
0
字型對應程式會在搜尋相符專案時使用預設高度值。
< 0
字型對應程式會將此值轉換成裝置單位,並將其絕對值與可用字型的字元高度相符。
 

對於所有高度比較,字型對應程式會尋找未超過要求大小的最大字型。

第一次使用字型時,就會發生此對應。

針對MM_TEXT對應模式,您可以使用下列公式來指定具有指定點大小的字型高度:


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

[in] cWidth

要求字型中字元的平均寬度,以邏輯單位表示。 如果此值為零,字型對應程式會選擇最接近的相符值。 最接近的比對值是藉由比較目前裝置外觀比例與可用字型數字外觀比例之間的差異絕對值來決定。

[in] cEscapement

逸出向量與裝置 X 軸之間的角度,以十分之一度為單位。 逸出向量與文字列的基底線平行。

當圖形模式設定為GM_ADVANCED時,您可以指定字串的逸出角度,而不受字串字元的方向角度。

當圖形模式設定為 GM_COMPATIBLE 時, nEscapement 會同時指定逸出和方向。 您應該將 nEscapementnOrientation 設定為相同的值。

[in] cOrientation

每一個字元的基底線與裝置 X 軸之間的角度,以十分之一度為單位。

[in] cWeight

範圍 0 到 1000 的字型粗細。 例如,400 是正常的,而 700 是粗體。 如果此值為零,則會使用預設權數。

為了方便起見,定義了下列值。

Weight
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

輸出有效位數。 輸出有效位數會定義輸出必須符合要求字型的高度、寬度、字元方向、逸出、音調和字型類型有多接近。 它可以是下列值之一。

意義
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值來控制當操作系統包含多個具有指定名稱的字型時,字型對應程式如何選擇字型。 例如,如果操作系統在點陣和 TrueType 窗體中包含名為 Symbol 的字型,則指定OUT_TT_PRECIS會強制字型對應程式選擇 TrueType 版本。 指定OUT_TT_ONLY_PRECIS會強制字型對應程序選擇 TrueType 字型,即使它必須取代另一個名稱的 TrueType 字型也一樣。

[in] iClipPrecision

裁剪精確度。 裁剪精確度會定義如何裁剪部分超出裁剪區域的字元。 它可以是下列一或多個值。

意義
CLIP_CHARACTER_PRECIS
未使用。
CLIP_DEFAULT_PRECIS
指定預設裁剪行為。
CLIP_DFA_DISABLE
Windows XP 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
新式字型。 例如古英文的字體。
FF_DONTCARE
使用預設字型。
FF_MODERN
具有常數筆劃寬度的字型,具有或不含 serifs。 Pica、Elite 和 Courier New 是範例。
FF_ROMAN
具有可變筆劃寬度和 serifs 的字型。 例如 MS Serif。
FF_SCRIPT
設計為看起來像手寫的字型。 例如 Script 和 Cursive。
FF_SWISS
具有可變筆劃寬度且不含 serifs 的字型。 女士?Sans Serif 是範例。
 

應用程式可以使用布爾值 OR 運算符,將間距常數與系列常數聯結,以指定 fdwPitchAndFamily 參數的值。

字型系列會以一般方式描述字型的外觀。 當要求的確切字型無法使用時,這些字型是用於指定字型。

[in] pszFaceName

指定字型之以 Null 結尾字串的指標。 此字串的長度不能超過 32 個字元,包括終止的 Null 字元。 EnumFontFamilies 函式可用來列舉所有目前可用字型的字型名稱。 如需詳細資訊,請參閱<備註>一節。

如果 lpszFaceNULL 或空字串,GDI 會使用符合其他指定屬性的第一個字型。

傳回值

如果函式成功,則傳回值是邏輯字型的句柄。

如果函式失敗,則傳回值為 NULL

備註

當您不再需要字型時,請呼叫 DeleteObject 函式來刪除它。

為了協助保護為 Windows 提供字型的廠商著作權,應用程式應該一律報告所選字型的確切名稱。 由於可用的字型可能會因系統而異,因此請勿假設選取的字型一律與要求的字型相同。 例如,如果您要求名為Pala才能使用的字型,但系統上沒有這類字型,字型對應器會取代具有類似屬性但不同名稱的字型。 一律向使用者報告選取的字型名稱。

若要在不同的操作系統語言版本上取得適當的字型,請使用LOGFONT結構中所需的字型特性呼叫EnumFontFamiliesEx,然後使用 CreateFontCreateFontIndirect 擷取適當的字型名稱並建立字型。

不論地區設定為何, CreateFontCreateFontIndirect和 CreateFontIndirectEx 的字型對應程式都會辨識英文和本地化的字樣名稱。

下列情況不支援 ClearType 反鋸齒:

  • 在印表機上轉譯的文字。
  • 256 種色彩或更少色彩的顯示集。
  • 轉譯至終端伺服器用戶端的文字。
  • 字型不是 TrueType 字型或具有 TrueType 外框的 OpenType 字型。 例如,下列專案不支援 ClearType 反鋸齒:類型 1 字型、沒有 TrueType 外框、位圖字型、向量字型和裝置字型的 Postscript OpenType 字型。
  • 字型已微調內嵌位圖,僅適用於包含內嵌位圖的字型大小。 例如,這通常發生在東亞字型中。

範例

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 定義為別名,根據 UNICODE 預處理器常數的定義,自動選取此函式的 ANSI 或 Unicode 版本。 混合使用編碼中性別名與非編碼中性的程序代碼,可能會導致編譯或運行時間錯誤不符。 如需詳細資訊,請參閱 函式原型的慣例

規格需求

需求
最低支援的用戶端 Windows 2000 專業版 [僅限傳統型應用程式]
最低支援的伺服器 Windows 2000 Server [僅限傳統型應用程式]
目標平台 Windows
標頭 wingdi.h (包含 Windows.h)
程式庫 Gdi32.lib
Dll Gdi32.dll

另請參閱

CreateFontIndirect

CreateFontIndirectEx

DeleteObject

EnumFontFamilies

EnumFontFamiliesEx

EnumFonts

字型和文字函式

字型和文字概觀

LOGFONT

SelectObject