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 中指定的值。
值 | 意義 |
---|---|
|
字型對應程式會將此值轉換成裝置單位,並符合可用字型的資料格高度。 |
|
字型對應程式會在搜尋相符專案時使用預設高度值。 |
|
字型對應程式會將此值轉換成裝置單位,並符合其絕對值與可用字型的字元高度。 |
針對所有高度比較,字型對應器會尋找未超過要求大小的最大字型。
第一次使用字型時,就會發生此對應。
針對MM_TEXT對應模式,您可以使用下列公式來指定具有指定點大小的字型高度:
nHeight = -MulDiv(PointSize, GetDeviceCaps(hDC, LOGPIXELSY), 72);
[in] cWidth
要求字型中字元的平均寬度,以邏輯單位表示。 如果此值為零,字型對應程式會選擇最接近的相符值。 最接近的比對值是藉由比較目前裝置外觀比例與可用字型的數位外觀比例之間的差異絕對值來決定。
[in] cEscapement
逸出向量與裝置 X 軸之間的角度,以十分之一度為單位。 逸出向量與文字列的基底線平行。
當圖形模式設定為GM_ADVANCED時,您可以指定字串的逸出角度,與字串字元的方向角度無關。
當圖形模式設定為 GM_COMPATIBLE 時, nEscapement 會同時指定逸出和方向。 您應該將 nEscapement 和 nOrientation 設定為相同的值。
[in] cOrientation
每一個字元的基底線與裝置 X 軸之間的角度,以十分之一度為單位。
[in] cWeight
範圍 0 到 1000 中的字型粗細。 例如,400 是一般,而 700 是粗體。 如果此值為零,則會使用預設權數。
為了方便起見,定義了下列值。
[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
- JOHAB_CHARSET
- ARABIC_CHARSET
- HEBREW_CHARSET
- THAI_CHARSET
DEFAULT_CHARSET會根據目前的系統地區設定,設定為值。 例如,當系統地區設定為英文 (美國) 時,系統會將其設定為 ANSI_CHARSET。
具有其他字元集的字型可能存在於作業系統中。 如果應用程式使用具有未知字元集的字型,則不應該嘗試轉譯或解譯以該字型轉譯的字串。
若要確保建立字型時的結果一致,請勿指定OEM_CHARSET或DEFAULT_CHARSET。 如果您在 lpszFace 參數中指定字樣名稱,請確定 fdwCharSet 值符合 lpszFace中指定的字樣字元集。
[in] iOutPrecision
輸出有效位數。 輸出有效位數會定義輸出必須符合所要求字型的高度、寬度、字元方向、逸出程式、音調和字型類型有多接近。 它可以是下列值之一。
當作業系統包含多個具有指定名稱的字型時,應用程式可以使用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
裁剪精確度。 裁剪精確度會定義如何裁剪部分超出裁剪區域的字元。 它可以是下列一或多個值。
[in] iQuality
輸出品質。 輸出品質會定義 GDI 必須嘗試將邏輯字型屬性與實際實體字型的屬性相符的方式。 它可以是下列值之一。
如果輸出品質是DEFAULT_QUALITY、DRAFT_QUALITY或PROOF_QUALITY,則如果SPI_GETFONTSMOOTHING系統參數為 TRUE,則字型會反鋸齒。 使用者可以從主控台控制這個系統參數。 ([控制台] 中設定的精確字組取決於 Windows 版本,但它會是「螢幕字型的平滑邊緣」效果的字組。)
[in] iPitchAndFamily
字型的音調和系列。 兩個低序位會指定字型的間距,而且可以是下列其中一個值:
- DEFAULT_PITCH
- FIXED_PITCH
- VARIABLE_PITCH
應用程式可以使用布林值 OR 運算子來聯結音調常數與系列常數,來指定 fdwPitchAndFamily 參數的值。
字型系列會以一般方式描述字型的外觀。 當要求的確切字樣無法使用時,這些字型是用來指定字型。
[in] pszFaceName
指定字型字樣名稱之 Null 終止字串的指標。 此字串的長度不得超過 32 個字元,包括終止的 Null 字元。 EnumFontFamilies函式可用來列舉所有目前可用字型的字樣名稱。 如需詳細資訊,請參閱<備註>一節。
如果 lpszFace 為 Null 或空字串,GDI 會使用符合其他指定屬性的第一個字型。
傳回值
如果函式成功,則傳回值是邏輯字型的控制碼。
如果函式失敗,傳回值為 Null。
備註
當您不再需要字型時,請呼叫 DeleteObject 函式加以刪除。
為了協助保護為 Windows 提供字型的廠商著作權,應用程式應該一律報告所選字型的確切名稱。 由於可用的字型可能會因系統而異,因此請勿假設選取的字型一律與要求的字型相同。 例如,如果您要求名為 Pala,但系統上沒有這類字型可用,字型對應程式會取代具有類似屬性但不同名稱的字型。 一律向使用者報告所選字型的名稱。
若要在不同的作業系統語言版本上取得適當的字型,請使用LOGFONT結構中所需的字型特性呼叫EnumFontFamiliesEx,然後使用CreateFont或CreateFontIndirect擷取適當的字樣名稱並建立字型。
不論地區設定為何, CreateFont、CreateFontIndirect和 CreateFontIndirectEx 的字型對應程式都能辨識英文和當地語系化字樣名稱。
下列情況不支援 ClearType 反鋸齒:
- 在印表機上轉譯的文字。
- 256 種色彩或更少色彩的顯示集。
- 轉譯至終端伺服器用戶端的文字。
- 字型不是 TrueType 字型或具有 TrueType 外框的 OpenType 字型。 例如,下列不支援 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;
}
For another example, see "Setting Fonts for Menu-Item Text Strings" in Using Menus.
注意
wingdi.h 標頭會將 CreateFont 定義為別名,根據 UNICODE 預處理器常數的定義,自動選取此函式的 ANSI 或 Unicode 版本。 混合使用編碼中性別名與非編碼中性的程式碼,可能會導致編譯或執行時間錯誤不符。 如需詳細資訊,請參閱 函式原型的慣例。
規格需求
最低支援的用戶端 | Windows 2000 Professional [僅限傳統型應用程式] |
最低支援的伺服器 | Windows 2000 Server [僅限桌面應用程式] |
目標平台 | Windows |
標頭 | wingdi.h (包含 Windows.h) |
程式庫 | Gdi32.lib |
Dll | Gdi32.dll |
另請參閱
EnumFontFamilies