Share via


複雑なスクリプト

上記で説明した関数は多くの言語でうまく機能しますが、複雑なスクリプトのニーズには対応できない場合があります。 複雑なスクリプト は、印刷されたフォームが単純な方法でレンダリングされない言語です。 たとえば、複雑なスクリプトでは、双方向レンダリング、グリフのコンテキストシェイプ、または文字の組み合わせが可能になる場合があります。 これらの特別な要件により、テキスト出力の制御は非常に柔軟である必要があります。

テキスト TextOutExtTextOutTabbedTextOutDrawTextGetTextExtentExPoint を表示する関数が、複雑なスクリプトをサポートするように拡張されました。 一般に、このサポートはアプリケーションに対して透過的です。 ただし、複雑なスクリプト シェイプ モジュールがコンテキストを使用してグリフを正しく並べ替えて生成できるように、アプリケーションはバッファーに文字を保存し、テキストの行全体を一度に表示する必要があります。 さらに、グリフの幅はコンテキストによって異なる可能性があるため、アプリケーションでは、キャッシュされた文字幅を使用するのではなく、 GetTextExtentExPoint を 使用して行の長さを決定する必要があります。

さらに、複雑なスクリプト対応アプリケーションでは、アプリケーションに右から左への読み取り順序と右揃えのサポートを追加することを検討する必要があります。 次のコードを使用して、読み取り順序または配置を左と右の間で切り替えることができます。

// Save lAlign (this example uses static variables) 
static LONG lAlign = TA_LEFT;

// When user toggles alignment (assuming TA_CENTER is not supported). 

lAlign = TA_RIGHT;

// When the user toggles reading order. 

lAlign = TA_RTLREADING;

// Before calling ExtTextOut, for example, when processing WM_PAINT  

SetTextAlign (hDc, lAlign);

両方の属性を一度に切り替えるには、次のステートメントを実行し、前に示したように SetTextAlignExtTextOut を呼び出します。

lAlign = TA_RIGHT^TA_RTLREADING;  //pre-inline !

Uniscribe を使用して複雑なスクリプトを処理することもできます。 Uniscribe は、複雑なスクリプトを細かく制御できる一連の関数です。 詳細については、「複雑なスクリプトの一筆記と処理」を参照してください。