5

この写真は私の苦境を示しています。

画像1

すべての文字は同じサイズに見えますが、RichEdit コントロールで表示した場合と ExtTextOut を使用した場合では、文字間のスペースが異なります。

ラップ位置を維持するために、(理想的には) RichEdit コントロールと同じように文字を表示したいと思います。

誰でも教えてもらえますか:

a)より正しい表現はどれですか?

b)リッチエディット コントロールがアジア文字間に隙間なくテキストを表示するのはなぜですか?

c)これらの文字を描画するときに、ExtTextOut に RichEdit コントロールの動作を再現させる方法はありますか?

d)アジア版の Windows で作業していた場合、これは何か違いますか?

私は楽観的かもしれませんが、何かヒントがあれば、ぜひ聞いてみたいです。

それが役立つ場合:

これが私のテキストです:

快的棕色狐狸跳在懶惰狗1 2 3 4 5 6 7 8 9 0

アジアの読者には申し訳ありませんが、これは単に Unicode の実装をテストするためのものであり、文字がどの言語から取得されたのか、ましてや意味があるのか​​どうかさえわかりません。

これらの文字をリッチエディット コントロール (ワードパッドなど) に貼り付けて効果を表示するには、文字をスワイプしてフォントを「Arial」に設定する必要がある場合があります。

私が取得したリッチテキストは次のとおりです。

{\rtf1\ansi\ansicpg1252\deff0\deflang2057{\fonttbl{\f0\fnil\fcharset0 Arial;}}{\colortbl ;\red0\green0\blue0;}\viewkind4\uc1\pard\sa200\sl276\slmult1\ lang9\fs22\u24555?\u30340?\u26837?\u33394?\u29392?\u29432?\u36339?\u22312?\u25078?\u24816?\u29399?1 2 3 4 5 6 7 8 9 0\par\pard \'a3 $$ \'80\'80\cf1\lang2057\fs16\par}

私の最初の考えだった文字の「ピッチ」の値が含まれていないようです。

4

3 に答える 3

3

答えはわかりませんが、疑わしいことがいくつかあります。

  • リッチ エディット コントロールにはいくつかのバージョンがあります。おそらく、最新のタイポグラフィの改善がすべて含まれていない古いものを使用している可能性があります。
  • リッチ エディット コントロールの動作に影響を与える多くのスタイルとフラグがあるため、設定されているものとその機能を調べる必要がある場合があります。たとえば、EM_GETEDITSTYLEを見てください。
  • Windows では、多くのアジア フォントが 2 つのバージョンで提供されます。1 つは水平レイアウト用に最適化され、もう 1 つは垂直レイアウト用に最適化されています。後者は通常同じ名前ですが、@先頭に追加されています。リッチ エディット コントロールで間違ったものを使用している可能性があります。

更新: ワードパッドをいじることで、リッチ エディット コントロールの混雑したテキストの問題を再現することができました。

  1. Windows 7 のワードパッドで新しいドキュメントを開きます。選択したフォントは Calibri であることに注意してください。
  2. サンプル テキストをドキュメントに貼り付けます。
  3. テキストは正しく表示されますが、ワードパッドによってフォントが SimSun に変更されました。
  4. テキストを選択し、フォントを Calibri または Arial に戻します。

あなたの例と非常によく似た、テキストが過密になります。したがって、基本的な問題はフォントのリンクとフォールバックにあるようです。 ExtTextOutおそらくスクリプトに適したフォントを自動的に選択しています。あなたの課題は、スクリプトに適したフォントを特定し、そのフォントをリッチ エディット コントロールに設定する方法を見つけ出すことです。

于 2011-02-24T18:28:13.060 に答える
1

これは問題の一部にしか役立ちませんが、リッチエディットとまったく同じように見える DC にテキストを描画する方法があります。これは、ウィンドウレス リッチエディット コントロールと呼ばれるものです。使い方は簡単ではありません。数年前にCodeProject の記事を書きました。これを使用して、テキストのブロックのスクロール可能な表示の問題を解決しました。各ブロックはクリックして編集できます。通常の描画はウィンドウのないリッチエディットで行われ、「実際の」リッチエディット コントロールを表示することで編集が行われます。その上。

これにより、少なくとも両方のケースで同じように見えるテキストが得られますが、残念ながらどちらのケースでも文字間隔が小さすぎます。

もう 1 つ考えてみましょう。インストールされている Microsoft Office に依存できる場合は、Office に付属している新しいバージョンの RichEdit を試すこともできます。これらについては、Murray Sargent のブログや、フォント バインドに関する興味深い記事が参考になるかもしれません。

于 2011-03-01T08:49:28.293 に答える
1

ExtTextOut を使用すると、レコード間の論理的な間隔を指定できます。隣接する文字セルの原点間の距離を示す値の配列への const ポインターであるパラメーターlpDxがあります。Microsoft API のドキュメントには、設定しない場合、独自の既定の間隔が設定されることが記載されています。そのため、ExtTextOut が正常に機能していると言わざるを得ません。

特に、EMF で EMR_EXTTEXTOUTW レコードを作成すると、EMR_TEXT 構造体にこの DX 配列が取り込まれます。これにより、コメントの 1 つを見ると、RichEdit がレコードに含まれる情報を使用して EMF を挿入できるようになりました。フォント バインドを設定すると、RTF レコードは、使用するフォントを決定するために何らかの照合を行います。

RichEdit コントロールに関しては、次の記事が役立つ場合があります。

リッチ エディット コントロールでフォント バインディングを使用する

文字セットが割り当てられると、Rich Edit は挿入ポイント周辺のテキストを前後にスキャンして、その文字セットに使用されている最も近いフォントを見つけます。文字セットのフォントが見つからない場合、Rich Edit はクライアントがその文字セットに選択したフォントを使用します。クライアントが文字セットのフォントを指定していない場合、Rich Edit はその文字セットのデフォルト フォントを使用します。クライアントが他のフォントを必要とする場合、クライアントはいつでもそれを変更できますが、このアプローチはほとんどの場合うまくいきます。現在の既定のフォントの選択肢は、次の表に基づいています。デフォルトのフォントはプロセスごとに設定されており、UI での使用と非 UI での使用には別のリストがあることに注意してください。

文字セットを設定していない場合は、ANSI_CHARSET にフォールバックすることがさらに説明されています。ただし、 Murray Sargent (Microsoft のプログラマー) によるブログ記事が示すように、それよりもはるかに複雑であることは間違いありません。

于 2015-01-15T01:13:25.097 に答える