字型建立和選取

[ 字型 通用] 對話方塊可簡化建立和選取字型的程式。 藉由初始化CHOOSEFONT 結構和呼叫 CHOOSEFONT函式,應用程式可以支援先前需要許多行自訂程式碼的相同字型選取介面。 (如需 字型 通用對話方塊的詳細資訊,請參閱 Common Dialog Box Library.)

使用者選取

大部分的字型建立和選取作業都牽涉到使用者。 例如,文字處理應用程式可讓使用者選取標題、註腳和本文的唯一字型。 當使用者使用 [ 字型 ] 對話方塊選取字型並按下 [ 確定 ] 按鈕之後, CHOOSEFONT 函式會使用所要求字型的屬性,初始化 LOGFONT 結構的成員。 若要將此字型用於文字輸出作業,應用程式必須先建立邏輯字型,然後將該字型選取到其裝置內容中。 邏輯字型是理想字型的應用程式提供描述。 開發人員可以呼叫 CreateFontCreateFontIndirect 函式來建立邏輯字型。 在此情況下,應用程式會呼叫CreateFontIndirect,並提供CHOOSEFONT 初始化之 LOGFONT結構的指標。 一般而言,呼叫 CreateFontIndirect 更有效率,因為 CreateFont 需要數個參數,而 CreateFontIndirect 只需要 LOGFONT的一個指標。

在應用程式實際可以使用邏輯字型開始繪製文字之前,它必須從裝置內部儲存的字型,以及資源已載入作業系統的字型中找到最接近的相符專案。 儲存在裝置或作業系統中的字型稱為 實體字型。 尋找最符合指定邏輯字型之實體字型的程式稱為字型對應。 當應用程式呼叫 SelectObject 函式並提供識別邏輯字型的控制碼時,就會發生此程式。 字型對應是使用內部演算法來執行,此演算法會比較所要求邏輯字型的屬性與可用實體字型的屬性。 當字型對應器演算法完成搜尋並判斷最接近的相符專案時, SelectObject 函式會傳回 ,而應用程式可以使用新的字型開始繪製文字。

SetMapperFlags 函式會指定字型對應器演算法是否只搜尋符合實體裝置外觀比例的實體字型。 裝置的外觀比例是由該裝置上圖元的寬度和高度所形成的比例。

系統字型 (也稱為殼層或預設字型) 是標題列、功能表和對話方塊中文字所使用的字型。

特殊字型選取考慮

雖然大部分的字型選取作業都牽涉到使用者,但有一些情況不是真的。 例如,開發人員可能會想要在應用程式中使用唯一的字型,在控制項視窗中繪製文字。 若要選取適當的字型,應用程式必須能夠判斷可用的字型、建立描述其中一個可用字型的邏輯字型,然後將該字型選取到適當的裝置內容中。

應用程式可以使用 EnumFontsEnumFontFamilies 函式來列舉可用的字型。 建議使用 EnumFontFamilies,因為它會列舉與系列名稱相關聯的所有樣式。 這適用于具有許多或不尋常的樣式的字型,以及跨國際框線的字型。

一旦應用程式列舉了可用的字型並找到適當的相符專案,它應該使用字型列舉函式傳回的值來初始化 LOGFONT 結構的成員。 然後,它可以呼叫 CreateFontIndirect 函式,並將指標傳遞至初始化的 LOGFONT 結構。 如果 CreateFontIndirect 函式成功,應用程式就可以呼叫 SelectObject 函式來選取邏輯字型。 初始化 LOGFONT 結構的成員時,請務必在 lfCharSet 成員中指定特定的字元集。 這個成員在字型對應程式中很重要,如果此成員未正確初始化,結果將會不一致。 如果您在LOGFONT結構的lfFaceName成員中指定字樣名稱,請確定lfCharSet值符合lfFaceName中指定的字樣字元集。 例如,如果您想要選取 MS Mincho 之類的字型, lfCharSet 必須設定為預先定義的值SHIFTJIS_CHARSET。

許多東亞語言的字型有兩個字樣名稱:英文名稱和當地語系化名稱。 CreateFontCreateFontIndirect 和 CreateFontIndirectEx會針對符合語言的系統地區設定採用當地語系化的字樣名稱,但它們會採用所有其他系統地區設定的英文字樣名稱。 最佳方法是嘗試一個名稱,並在失敗時嘗試另一個名稱。 請注意,如果系統地區設定不符合字型的語言,EnumFontFamilies 和 EnumFontFamiliesEx會傳回英文字型名稱。 從 Windows 2000 開始,這不再是問題,因為CreateFontCreateFontIndirect 和 CreateFontIndirectEx的字型對應器會辨識任一個字樣名稱,而不論地區設定為何。