次の方法で共有


GetCharacterPlacementA 関数 (wingdi.h)

GetCharacterPlacement 関数は、文字の幅、キャレット配置、文字列内の順序、グリフのレンダリングなど、文字列に関する情報を取得します。 返される情報の種類は、dwFlags パラメーターによって異なり、指定された表示コンテキストで現在選択されているフォントに基づきます。 この関数は、指定した GCP_RESULTS 構造体または構造体で指定された 1 つ以上の配列に情報をコピーします。

この関数は、かつては文字列を操作するのに十分でしたが、ますます多くの言語やスクリプトを操作する必要があるため、廃止されました。 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 は文字列の長さを指定するため、文字列 0 で終わる必要はありません。

[in] nCount

lpStringによって指 文字列の の長さ。

[in] nMexExtent

文字列が処理される最大エクステント (論理単位)。 処理された場合、このエクステントを超える文字は無視されます。 必要な順序またはグリフ配列の計算は、含まれる文字にのみ適用されます。 このパラメーターは、GCP_MAXEXTENT値が dwFlags パラメーターで指定されている場合にのみ使用されます。 関数が入力文字列を処理すると、合計エクステントがまだ最大値を超えない場合にのみ、各文字とそのエクステントが出力、エクステント、およびその他の配列に追加されます。 制限に達すると、処理が停止します。

[in, out] lpResults

関数の結果を受け取る GCP_RESULTS 構造体へのポインター。

[in] dwFlags

文字列を必要な配列に処理する方法を指定します。 このパラメーターには、次の値のうち 1 つ以上を指定できます。

価値 意味
GCP_CLASSIN
lpClass 配列に文字の事前分類が含まれていることを指定します。 分類は出力時と同じにすることができます。 文字の特定の分類がわからない場合は、配列内の対応する位置を 0 に設定する必要があります。 分類の詳細については、GCP_RESULTSを参照してください。 これは、getFontLanguageInfo GCP_REORDER フラグが返された場合にのみ役立ちます。
GCP_DIACRITIC
文字列内の分音記号の処理方法を決定します。 この値が設定されていない場合、分音記号は幅 0 の文字として扱われます。 たとえば、ヘブライ語の文字列には分音記号を含めることができますが、表示したくない場合があります。

GetFontLanguageInfo 使用して、フォントが分音記号をサポートしているかどうかを判断します。 使用する場合は、アプリケーションのニーズに応じて、GetCharacterPlacementする呼び出しでGCP_DIACRITIC フラグを使用するか使用できません。

GCP_DISPLAYZWG
単語内の文字の位置に応じて、並べ替えやグリフの形状が異なる必要がある言語の場合、多くの場合、表示できない文字がコード ページに表示されます。 たとえば、ヘブライ語のコード ページには、出力文字列内の文字の最終的な配置を決定するのに役立つ左To-Right と右To-Left のマーカーがあります。 通常、これらは表示されず、lpGlyphs および lpDx 配列 から削除されます。 GCP_DISPLAYZWG フラグを使用して、これらの文字を表示できます。
GCP_GLYPHSHAPE
現在のコード ページで現在選択されているフォントで定義されている標準図形以外の図形を使用して、文字列内の一部またはすべての文字を表示するように指定します。 アラビア語などの一部の言語では、この値が指定されていない限り、グリフの作成をサポートできません。 一般に、GetFontLanguageInfo 文字列に対してこの値を返す場合は、この値を GetCharacterPlacement使用する必要があります。
GCP_JUSTIFY
文字列の長さが nMaxExtentと同じになるように、lpDx 配列のエクステント 調整します。 GCP_JUSTIFYは、GCP_MAXEXTENTと組み合わせてのみ使用できます。
GCP_KASHIDA
調整されたエクステントと同様に、または代わりに、調整されたエクステントを使用して、文字列の長さを変更して、nMaxExtentで指定された値と等しくなるようにします。 lpDx 配列では、Kashida は負の理由インデックスで示されます。 GCP_KASHIDAは、フォント (および言語) が Kashidas をサポートしている場合にのみ、GCP_JUSTIFYと組み合わせて使用できます。 GetFontLanguageInfo 使用して、現在のフォントが Kashidas をサポートしているかどうかを判断します。

Kashidas を使用して文字列を正当化すると、必要なグリフの数が入力文字列の文字数を超える可能性があります。 このため、Kashidas を使用する場合、アプリケーションでは、配列を入力文字列のサイズに設定するだけで十分であると想定できません。 (可能な最大値は約 dxPageWidth/dxAveCharWidth です。dxPageWidth はドキュメントの幅、dxAveCharWidth は GetTextMetrics 呼び出しから返される平均文字幅です)。

GetFontLanguageInfo がGCP_KASHIDA フラグを返すからといって、GetCharacterPlacementの呼び出しで使用する必要があるわけではありません。オプションが使用可能であるという点に注意してください。

GCP_LIGATE
文字がライゲートする場所であればどこでも結紮を使用します。 結紮は、1 つのグリフが 2 つ以上の文字に使用される場合に発生します。 たとえば、文字 a と e は ?に結び付けることができます。 ただし、これを使用するには、言語サポートとフォントの両方で必要なグリフをサポートする必要があります (この例は、既定では英語では処理されません)。

GetFontLanguageInfo を使用して、現在のフォントがライゲーションをサポートしているかどうかを判断します。 リゲートする文字数に特定の最大値が必要な場合は、lpGlyphs 配列の最初の要素に数値を設定します。 通常の結紮が必要な場合は、この値を 0 に設定します。 GCP_LIGATEが指定されていない場合、結紮は行われません。 詳細については、GCP_RESULTSを参照してください。

通常、文字セットにGCP_REORDER値が必要ですが、指定されていない場合、渡される文字列が既に視覚的な順序になっている場合 (つまり、getCharacterPlacement を 1 回の呼び出しで lpGcpResults-lpOutString に入れる結果が 2 番目の呼び出しの入力文字列 場合) を除き、出力は意味がありません。

getFontLanguageInfo がGCP_LIGATE フラグを返すからといって、GetCharacterPlacementの呼び出しで使用する必要があるわけではありません。オプションが使用可能であるという点に注意してください。

GCP_MAXEXTENT
結果のエクステント (論理単位) が、nMaxExtent パラメーターで指定された値を超えていない限り、文字列のエクステントを計算します。
GCP_NEUTRALOVERRIDE
特定の言語のみ。 ニュートラルの通常の処理をオーバーライドし、文字列の読み取り順序に一致する強力な文字として扱います。 GCP_REORDER フラグでのみ便利です。
GCP_NUMERICOVERRIDE
特定の言語のみ。 数値の通常の処理をオーバーライドし、文字列の読み取り順序に一致する強力な文字として扱います。 GCP_REORDER フラグでのみ便利です。
GCP_NUMERICSLATIN
アラビア語/タイ語のみ。 数値には標準のラテン文字グリフを使用し、システムの既定値をオーバーライドします。 このオプションをフォントの言語で使用できるかどうかを判断するには、GetStringTypeEx 使用して、言語が複数の数値形式をサポートしているかどうかを確認します。
GCP_NUMERICSLOCAL
アラビア語/タイ語のみ。 数値にはローカル グリフを使用し、システムの既定値をオーバーライドします。 このオプションをフォントの言語で使用できるかどうかを判断するには、GetStringTypeEx 使用して、言語が複数の数値形式をサポートしているかどうかを確認します。
GCP_REORDER
文字列の順序を変更します。 SBCS および左から右の読み取り順序ではない言語に使用します。 この値が指定されていない場合、文字列は既に表示順であると見なされます。

このフラグが半言語に設定され、lpClass 配列が使用されている場合、配列の最初の 2 つの要素を使用して、文字列の境界を超える読み取り順序を指定します。 GCP_CLASS_PREBOUNDRTLとGCP_CLASS_PREBOUNDLTRを使用して順序を設定できます。 事前設定された順序が不要な場合は、値を 0 に設定します。 GCPCLASSIN フラグが設定されている場合、これらの値を他の値と組み合わせることができます。

GCP_REORDER値が指定されていない場合、lpString パラメーターは、これが使用されている言語に対して視覚的に並べ替えられると見なされ、lpOutString および lpOrder フィールド は無視されます。

GetFontLanguageInfo 使用して、現在のフォントが並べ替えをサポートしているかどうかを判断します。

GCP_SYMSWAPOFF
半言語のみ。 スワップ可能な文字がリセットされないことを指定します。 たとえば、右から左の文字列では、'(' と ')' は逆になりません。
GCP_USEKERNING
幅配列を作成するときは、フォントでカーニング ペアを使用します (存在する場合)。 GetFontLanguageInfo 使用して、現在のフォントがカーニング ペアをサポートしているかどうかを判断します。

GetFontLanguageInfo がGCP_USEKERNING フラグを返すからといって、GetCharacterPlacementの呼び出しで使用する必要があるわけではありません。オプションを使用できるだけであることに注意してください。 ほとんどの TrueType フォントにはカーニング テーブルがありますが、使用する必要はありません。

 

アプリケーションでは、GetFontLanguageInfo 関数を使用して、GCP_DIACRITIC、GCP_DBCS、GCP_USEKERNING、GCP_LIGATE、GCP_REORDER、GCP_GLYPHSHAPE、およびGCP_KASHIDAの値が現在選択されているフォントに対して有効かどうかを判断することをお勧めします。 無効な場合、GetCharacterPlacement は値を無視します。

GCP_NODIACRITICS値は定義されなくなり、使用しないでください。

戻り値

関数が成功した場合、戻り値は論理単位での文字列の幅と高さになります。 幅は下位ワードで、高さは高い単語です。

関数が失敗した場合、戻り値は 0 です。

備考

GetCharacterPlacement 、国際的な設定や使用可能なフォントの種類に関係なく、アプリケーションがテキストを正しく処理できるようにします。 アプリケーションでは、ExtTextOut 関数を使用する前に、GetTextExtentPoint32 関数の代わりにこの関数を使用します (場合によっては、GetCharWidth32 および GetCharABCWidths 関数 の代わりに使用します)。

GetCharacterPlacement を使用して文字間の間隔とインデックス配列を取得する必要はありません。理由付けまたはカーニングが必要な場合を除きます。 ラテン以外のフォントの場合、アプリケーションは、ExtTextOut 関数がテキストをレンダリングする速度を向上させることができます。この速度は、GetCharacterPlacement を使用して、ExtTextOutを呼び出す前に文字間の間隔とインデックス配列 取得します。 これは、同じテキストを繰り返しレンダリングする場合や、文字間の間隔を使用してキャレットを配置する場合に特に便利です。 extTextOutの呼び出しで lpGlyphs 出力配列を使用する場合は、ETO_GLYPH_INDEX フラグを設定する必要があります。

GetCharacterPlacement は、lpOrderlpDXlpCaretPoslpOutString、および lpGlyphs GCP_RESULTS 構造体のメンバー をチェックし、これらのメンバーが NULLに設定されていない場合は、対応する配列 塗りつぶします。 GetCharacterPlacement 配列を埋めることができない場合は、対応するメンバー NULLに設定されます。 有効な情報を確実に取得するために、アプリケーションは、関数を呼び出す前にメンバーを有効なアドレスに設定し、呼び出し後にメンバーの値を確認する必要があります。 GCP_JUSTIFY値またはGCP_USEKERNING値を指定する場合、lpDX または lpCaretPos メンバー に有効なアドレスが必要です。

GCP_RESULTS.lpGlyphs で返されるグリフ インデックスは、デバイス コンテキストの現在のフォントに固有であり、そのフォントが選択されたままデバイス コンテキストでテキストを描画するためにのみ使用する必要があることに注意してください。

理由を計算するときに、文字列の末尾の文字がスペースである場合、関数は文字列の長さを減らし、理由を計算する前にスペースを削除します。 配列がスペースのみで構成されている場合、関数はエラーを返します。

extTextOut は DBCS 文字列の各バイトに対して lpDX エントリを受け取りますが、GetCharacterPlacement は各グリフに対して lpDX エントリを割り当てます。 この関数の組み合わせを使用するときにこの不一致を修正するには、GetGlyphIndices を使用するか、DBCS バイト ペアの対応する 2 番目のバイトの幅が 0 のエントリを持つ lpDX 配列を展開します。

論理幅が入力文字列の先頭文字の幅より小さい場合、GCP_RESULTS.nMaxFit は無効な値を返します。 この場合は、グリフ インデックスと lpDX 配列 GetCharacterPlacement を呼び出します。 次に、lpDX 配列を使用して、各文字の事前幅を使用してエクステント計算を行います。ここで、nMaxFit は、グリフ インデックスの前の幅が先頭文字の幅より小さい文字の数です。

手記

wingdi.h ヘッダーは、Unicode プリプロセッサ定数の定義に基づいて、この関数の ANSI または Unicode バージョンを自動的に選択するエイリアスとして GetCharacterPlacement を定義します。 エンコードに依存しないエイリアスをエンコードに依存しないコードと組み合わせて使用すると、コンパイルエラーやランタイム エラーが発生する不一致が発生する可能性があります。 詳細については、「関数プロトタイプの 規則」を参照してください。

必要条件

要件 価値
サポートされる最小クライアント Windows 2000 Professional [デスクトップ アプリのみ]
サポートされる最小サーバー Windows 2000 Server [デスクトップ アプリのみ]
ターゲット プラットフォーム の ウィンドウズ
ヘッダー wingdi.h (Windows.h を含む)
ライブラリ Gdi32.lib
DLL Gdi32.dll

関連項目

ExtTextOut を する

フォント関数とテキスト関数

フォントとテキストの概要

GCP_RESULTS

GetCharABCWidths の

GetCharWidth32 の

GetFontLanguageInfo を する

GetStringTypeEx の

GetTextExtentPoint32 の

GetTextMetrics を する