GetCharacterPlacementA 函式 (wingdi.h)
GetCharacterPlacement 函式會擷取字元字串的相關信息,例如字元寬度、插入號定位、字元串內的排序,以及字元轉譯。 傳回的信息類型取決於 dwFlags 參數,並根據指定顯示內容中目前選取的字型。 函式會將資訊複製到指定的 GCP_RESULTS 結構,或複製到 結構指定的一或多個數位。
雖然此函式曾經足以處理字元字串,但需要處理越來越多的語言和腳本,使其過時。 它已被 Uniscribe 模組的功能所取代。 如需詳細資訊,請參閱 Uniscribe。
建議應用程式使用 GetFontLanguageInfo 函式來判斷GCP_DIACRITIC、GCP_DBCS、GCP_USEKERNING、GCP_LIGATE、GCP_REORDER、GCP_GLYPHSHAPE和GCP_KASHIDA值是否適用於目前選取的字型。 如果無效,GetCharacterPlacement 會忽略值。
GCP_NODIACRITICS值已不再定義,因此不應使用。
語法
DWORD GetCharacterPlacementA(
[in] HDC hdc,
[in] LPCSTR lpString,
[in] int nCount,
[in] int nMexExtent,
[in, out] LPGCP_RESULTSA lpResults,
[in] DWORD dwFlags
);
參數
[in] hdc
裝置內容的句柄。
[in] lpString
要處理的字元字串指標。 字串不需要以零結束,因為 nCount 會指定字串的長度。
[in] nCount
[in] nMexExtent
處理字串的最大範圍(以邏輯單位為單位)。 如果已處理,則會忽略超出此範圍的字元。 任何必要排序或字元陣列的計算僅適用於包含的字元。 只有在 dwFlags 參數中指定了GCP_MAXEXTENT值時,才會使用此參數。 當函式處理輸入字串時,只有當總範圍尚未超過最大值時,才會將每個字元及其範圍新增至輸出、範圍和其他陣列。 達到限制之後,處理將會停止。
[in, out] lpResults
接收函式結果之 GCP_RESULTS 結構的指標。
[in] dwFlags
指定如何將字串處理至所需的陣列。 此參數可以是下列其中一或多個值。
價值 | 意義 |
---|---|
|
指定 lpClass 陣列包含字元的預設分類。 分類可能與輸出時相同。 如果未知字元的特定分類,陣列中的對應位置必須設定為零。 如需分類的詳細資訊,請參閱GCP_RESULTS。 只有當 GetFontLanguageInfo 傳回GCP_REORDER旗標時,這個值才有用。 |
|
決定如何處理字串中的音調。 如果未設定此值,讀音符號會被視為零寬度字元。 例如,希伯來文字符串可能包含變音符號,但您可能不想顯示它們。
使用 GetFontLanguageInfo 來判斷字型是否支援讀音符號。 如果這樣做,您可以根據應用程式的需求,在呼叫 GetCharacterPlacement中使用或不使用 GCP_DIACRITIC 旗標。 |
|
對於需要重新排序或不同字元圖形的語言,視字元在單字中的位置而定,不可顯示字元通常會出現在代碼頁中。 例如,在希伯來文代碼頁中,有 Left-To-Right 和 Right-To-Left 標記,以協助判斷輸出字串中字元的最終位置。 這些通常不會顯示,而且會從 lpGlyphs 和 lpDx 陣列中移除。 您可以使用GCP_DISPLAYZWG旗標來顯示這些字元。 |
|
指定字串中的部分或所有字元會使用目前代碼頁目前選取字型中定義之標準圖形以外的圖形來顯示。 某些語言,例如阿拉伯文,除非指定此值,否則無法支援圖像建立。 一般規則是,如果 |
|
調整 lpDx 陣列中的範圍,使字元串長度與 nMaxExtent 相同。 GCP_JUSTIFY只能與GCP_MAXEXTENT搭配使用。 |
|
使用 Kashidas 以及 或 ,而不是調整範圍來修改字串的長度,使其等於 nMaxExtent 所指定的值。 在 lpDx 陣列中,Kashida 會以負理由索引表示。 GCP_KASHIDA只能與GCP_JUSTIFY搭配使用,而且只有在字型(和語言)支援 Kashidas 時才使用。 使用 GetFontLanguageInfo 來判斷目前字型是否支援 Kashidas。
使用 Kashidas 來證明字串的合理性,可能會導致所需的字元數目大於輸入字串中的字元數。 因此,使用 Kashidas 時,應用程式無法假設將數位設定為輸入字串的大小就已足夠。 (可能的最大值大約是 dxPageWidth/dxAveCharWidth,其中 dxPageWidth 是檔的寬度,而 dxAveCharWidth 是從 getTextMetrics 呼叫傳 請注意,因為 |
|
使用連字元的連字元。 發生連字元,其中一個字元用於兩個或多個字元。 例如,字母 a 和 e 可以訴訟至 ?。 不過,若要使用此功能,語言支援和字型都必須支援必要的字元(本範例預設不會以英文處理)。
使用 GetFontLanguageInfo 來判斷目前字型是否支援連字。 如果這樣做,而且需要限制字元數目的特定最大值,請在數位 lpGlyphs 陣列的第一個元素中設定數位。 如果需要一般連字,請將此值設定為零。 如果未指定GCP_LIGATE,則不會執行任何連字。 如需詳細資訊,請參閱GCP_RESULTS。 如果字元集通常需要GCP_REORDER值,但未指定,除非傳入的字元串已經以視覺順序傳入,否則輸出會毫無意義(也就是,在一次呼叫 getCharacterPlacement 的 請注意,由於 GetFontLanguageInfo 傳回GCP_LIGATE旗標並不表示必須在 呼叫 getCharacterPlacement中使用,只要有選項可用。 |
|
只要產生的範圍以邏輯單位計算字串的範圍,就不會超過 nMaxExtent 參數所指定的值。 |
|
僅限特定語言。 覆寫中性專案的一般處理,並將其視為符合字串讀取順序的強字元。 僅適用於 GCP_REORDER 旗標。 |
|
僅限特定語言。 覆寫數位的一般處理,並將其視為符合字串讀取順序的強字元。 僅適用於 GCP_REORDER 旗標。 |
|
僅限阿拉伯文/泰文。 針對數位使用標準拉丁字元,並覆寫系統預設值。 若要判斷這個選項是否以字型的語言提供,請使用 GetStringTypeEx 來查看語言是否支援一個以上的數位格式。 |
|
僅限阿拉伯文/泰文。 使用數位字元的本機字元,並覆寫系統預設值。 若要判斷這個選項是否以字型的語言提供,請使用 GetStringTypeEx 來查看語言是否支援一個以上的數位格式。 |
|
重新排序字串。 用於不是 SBCS 和由左至右閱讀順序的語言。 如果未指定此值,則會假設字串已依顯示順序排列。
如果針對 Semitic 語言設定此旗標,並使用 lpClass 陣列,則會使用數位的前兩個元素來指定超出字串界限的閱讀順序。 GCP_CLASS_PREBOUNDRTL和GCP_CLASS_PREBOUNDLTR可用來設定順序。 如果不需要預設順序,請將值設定為零。 如果設定 GCPCLASSIN 旗標,這些值可以與其他值結合。 如果未指定GCP_REORDER值,則會使用 lpString 參數,以可視化方式排序使用這個值的語言,並忽略 lpOutString 和 lpOrder 字段。 使用 GetFontLanguageInfo 來判斷目前字型是否支援重新排序。 |
|
僅限半音符號語言。 指定不會重設可交換的字元。 例如,在由右至左的字串中,不會反轉 '(' 和 ')'。 |
|
建立寬度陣列時,請使用字型中的字型(如果有的話)。 使用 GetFontLanguageInfo 來判斷目前的字型是否支援字距字組。
請注意, |
建議應用程式使用 GetFontLanguageInfo 函式來判斷GCP_DIACRITIC、GCP_DBCS、GCP_USEKERNING、GCP_LIGATE、GCP_REORDER、GCP_GLYPHSHAPE和GCP_KASHIDA值是否適用於目前選取的字型。 如果無效,GetCharacterPlacement 會忽略值。
GCP_NODIACRITICS值已不再定義,因此不應使用。
傳回值
如果函式成功,傳回值會是邏輯單元中字串的寬度和高度。 寬度是低序字,而高度是高序字。
如果函式失敗,傳回值為零。
言論
GetCharacterPlacement 可確保應用程式可以正確地處理文字,而不論可用的國際設定和字型類型為何。 應用程式先使用這個函式,再使用 ExtTextOut 函式,並取代 GetTextExtentPoint32 函式(偶爾會取代 GetCharWidth32 和 GetCharABCWidths 函式)。
使用 GetCharacterPlacement 擷取字元間距和索引數位,除非需要理由或 kerning,否則不一定是必要的。 對於非拉丁字型,應用程式可以改善 ExtTextOut 函式 使用 getCharacterPlacement 來擷取字元間距和索引數組的速度,再呼叫 ExtTextOut。 當重複轉譯相同的文字,或使用字元間距定位插入號時,這特別有用。 如果在呼叫 extTextOut中使用 lpGlyphs 輸出數位,則必須設定ETO_GLYPH_INDEX旗標。
GetCharacterPlacement 會檢查 lpOrder、 lpDXlpCaretPoslpOutString, 和 lpGlyphsGCP_RESULTS 結構的成員,如果這些成員未設定為 NULL,則會填滿對應的數組。 如果 GetCharacterPlacement 無法填滿陣列,則會將對應的成員設定為 NULL。 為了確保擷取有效的資訊,應用程式負責在呼叫函式之前將成員設定為有效的位址,並在呼叫之後檢查成員的值。 如果指定GCP_JUSTIFY或GCP_USEKERNING值,lpDX 和/或 lpCaretPos 成員必須具有有效的位址。
請注意,GCP_RESULTS.lpGlyphs 中所傳回的字元索引是裝置內容中目前字型特有的,而且應該只用來在裝置內容中繪製文字,而該字型仍保持選取狀態。
計算理由時,如果字串中的尾端字元是空格,函式會減少字串的長度,並在計算理由之前移除空格。 如果陣列只包含空格,則函式會傳回錯誤。
ExtTextOut 預期 DBCS 字串的每個位元組 lpDX 專案,而 GetCharacterPlacement 會為每個字元指派 lpDX 專案。 若要在使用此函式組合時更正此不相符狀況,請使用 GetGlyphIndices,或針對 DBCS 位元組對應的第二個字節展開具有零寬度專案的 lpDX 陣列。
如果邏輯寬度小於輸入字串中前置字元的寬度,GCP_RESULTS.nMaxFit 會傳回不正確的值。 在此情況下,針對字元索引和 lpDX 陣列呼叫 getCharacterPlacement。 然後使用 lpDX 陣列,使用每個字元的進階寬度來執行範圍計算,其中 nMaxFit 是字元數,其圖像索引前導寬度小於前置字元的寬度。
注意
wingdi.h 標頭會根據 UNICODE 預處理器常數的定義,將 GetCharacterPlacement 定義為自動選取此函式的 ANSI 或 Unicode 版本。 混合使用編碼中性別名與非編碼中性的程序代碼,可能會導致編譯或運行時間錯誤不符。 如需詳細資訊,請參閱函式原型的
要求
要求 | 價值 |
---|---|
最低支援的用戶端 | Windows 2000 Professional [僅限傳統型應用程式] |
支援的最低伺服器 | Windows 2000 Server [僅限傳統型應用程式] |
目標平臺 | 窗戶 |
標頭 | wingdi.h (包括 Windows.h) |
連結庫 | Gdi32.lib |
DLL | Gdi32.dll |