テキスト出力文字列の長さの指定

フォント関数とテキスト出力関数の一部には、テキスト出力文字列の長さを指定するパラメーターがあります。 一般的な例は、 DrawTextEx の cchText パラメーター です

これらの各関数には、"ANSI" バージョンと Unicode バージョン ( それぞれ DrawTextExADrawTextExW など) の両方があります。 各関数の "ANSI" バージョンの場合、長さは BYTE カウントとして指定され、Unicode 関数の場合は WORD カウントとして指定されます。

これを "文字数" と考えるのが従来の方法です。 これは一般的に英語を含む多くの言語では正確ですが、一般的には正確ではありません。 "ANSI" 文字列では、 SBCS コード ページの文字はそれぞれ 1 バイトですが、 DBCS コード ページのほとんどの文字は 2 バイトを取ります。 同様に、現在定義されているほとんどの Unicode 文字は Basic 多言語プレーン (BMP) に存在し、UTF-16 表記は 1 つの WORD に収まりますが、補助文字は Unicode で ''サロゲート' で表され、2 つの WORD が必要です。

これらの各関数は、長さカウントを受け取ります。 各関数の "ANSI" バージョンの場合、 長さは NULL ターミネータを含まない文字列の BYTE カウント長として指定されます。 Unicode 関数の場合、長さカウントはバイト数を sizeof(WCHAR) で除算したものです。これは 2 で、 NULL ターミネータは含まれません。 文字数は文字数であり、文字列の長さカウントと等しくない可能性があります。 場合によっては、ANSI の場合は複数の BYTE ( DBCS 文字など) と Unicode の場合は複数の WORD (サロゲート文字など) が使用されます。 また、1 つのグリフを作成するために複数の文字が合成される可能性があるため、グリフの数が文字数と等しくない場合があります。 長さカウントは、データの量です。 文字数は、1 つのエンティティとして処理される単位の数です。 グリフはレンダリングされます。 たとえば、Unicode では、長さが 3 の文字列を使用できます。これは 2 文字で、結果として 1 つのグリフがレンダリングされます。 ただし、通常、ほとんどの Unicode 文字列の長さ、文字数、およびレンダリングされるグリフの数は等しくなります。

_tcslen() を使用して文字列の長さを取得できます。 ANSI の場合、_tcslen() はバイト数を返します。 Unicode の場合、_tcslen() は WCHAR の数 (つまり、WORD) を返します。

タブやソフト ハイフンなどの特殊な処理文字が、常に描画されない場合は、描画される出力に影響を与える可能性があります。 文字列の長さと文字数に含まれますが、レンダリングされたグリフによって直接表されない場合があります。

これらの関数の一部では、呼び出し元が長さを -1 として指定して、文字列が null で終わることを示すことができます。その場合、関数は文字数を自動的に計算します。 すべての関数でこの機能が提供されるわけではありません。 これは関数ごとに指定されます。個々の関数のドキュメントを参照してください。