問題タブ [directwrite]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
delphi - DelphiでDirectWriteを使用してリストボックスのキャンバスにテキストを描画する方法は?
リストボックスの各項目を描画する所有者に TDirect2DCanvas を使用する簡単な例を探しています。DirectWrite をグーグルで検索すると、サンプルの例に結果が表示され、フォームにテキストがレンダリングされます。学生だったので、私の Delphi スキルはチュートリアルを正しくキャッチできませんでした。キャンバスにテキストを描画するための簡単な例または参照は、私にとって素晴らしい出発点です。
これがコード(古い古典的な方法)です。DirectWriteを使用して実装しようとしています:
internationalization - あいまいな文字の方向性を IDWriteTextLayout に指定するにはどうすればよいですか?
空白や句読点など、一部の文字は方向性があいまいです。これにより、あいまいさを解決するための追加データにアクセスしないと、単一の正しいレイアウトがないように見えるテキスト レイアウトの状況が発生する可能性があります。次のテキストを検討してください。
これは、4 つのヘブライ文字 (明確に右から左)、4 つの英語の文字 (明確に左から右)、および 1 つの句読点 (曖昧) です。IDWriteTextLayout
その文字列をwithにレイアウトするとDWRITE_READING_DIRECTION_RIGHT_TO_LEFT
、次のようになります。
句読点は、英語の左側にある新しい右から左のブロックを開始する右から左の文字として扱われるように見えます。これは、特に右から左が指定された読み方であったことを考えると、完全に合理的です。方向。ただし、句読点が、埋め込まれた左から右の英語テキストに関連付けられた左から右の文字として扱われることを期待することも完全に合理的です。つまり、句読点は「d」の右側に表示される必要があります。
私のアプリは、このキャラクターをどのように扱うべきかを正確に知っています。IDWriteTextLayout
このあいまいさを解決するためにそのデータを渡すにはどうすればよいですか?
メソッドを見つけて、SetLocaleName
それが答えに違いないと思ったのですが、結果にまったく影響を与えていないようです。localeName
を作成するときにパラメーターも見つけましたIDWriteTextFormat
(これは、を作成するために使用されますIDWriteTextLayout
)。
私の目標が、一般的に米国英語の文字列が埋め込まれたヘブライ語のテキストになることである場合、 でロケールを使用してから、文字範囲 [4-9]でロケールhe
をオーバーライドするために使用したいと思います。ただし、これを行っても効果はありません。実際、これらの場所で使用されているロケールの組み合わせがレイアウトにまったく影響を与えることはありません。それらを部分範囲に制限するか、文字列全体に適用するかは関係ありません。IDWriteTextFormat
SetLocaleName
en-US
これらの API がこの目的を果たすべきだと考えるのは間違っていますか? その場合、どの API を使用すればよいですか? それとも、IDWriteTextLayout
このあいまいさを別の方法で解決するように指示する方法は本当にありませんか? APIの使い方が間違っているのでしょうか?これを作成するために使用しているテストコードは次のIDWriteTextLayout
とおりです。
c++ - Directwrite TextLayout で幅とレイアウト幅を同じに設定できる方法はありますか?
テキスト レイアウト オブジェクトを使用してテキストをレンダリングするときはいつでも、テキスト ラッピングの有効化オプションによっては、テキストの実際の幅がレイアウトの幅と同じでないことは明らかです。
とにかく幅とレイアウト幅を同じに設定するためにできることがあるかどうか知りたいですか?
そのため、テキスト レイアウト オブジェクトの作成で幅と高さを渡すと、指定した正確な寸法でテキストをレンダリングする必要があります。
c++ - この例を DirectWrite から取得して V2015 で実行することはできません
MS のこのページから以下の例を取得しましたが、このメッセージが原因でコードがリンクしません。
エラー LNK2019: 関数 _wmain で参照されている未解決の外部シンボル __imp__DWriteCreateFactory@12
読みやすくするために、以下のコードを繰り返します。
これらは DirectWrite での最初の手順であるため、上記のエラー メッセージについてはわかりません。
winapi - Windows のカスタム コントロールで任意のテキスト入力を処理する正しい最新の方法は何ですか? WM_CHAR? IMM? TSF?
カスタム Windows コントロールでテキスト入力をサポートできるようにしたいのですが、EDIT およびリッチ エディット コントロールが既に行っているように、それらのいずれもサブクラス化しません。コントロールは現在、Direct2D と DirectWrite を使用してテキストを描画し、Platform Update 以降を適用した Windows Vista SP1 で動作します (より新しい Direct2D と DirectWrite 機能が必要であると判断した場合は、Platform Update を適用した Windows 7 SP1 以降に変更する可能性があります。そこまたは Windows 8 でのみ利用可能ですが、それは別の問題です...)
価値があるのは、OS XI ではNSTextInputClientを使用し、GTK+ ではGtkIMContextを使用することです。私が話しているのは、これらのようなことです。
当然の選択は を使用することWM_CHAR
です。正しく収集すると、ウィンドウ クラスが に登録されている場合はネイティブに UTF-16 になるRegisterClassW()
ため、場所に関係なく「正常に動作する」はずです。ただし、WM_CHAR
は によって生成されTranslateMessage()
、そのドキュメントには、常に非ゼロを返すため、 aWM_CHAR
が生成されたかどうかを判断する方法はないと書かれています。TranslateMessage()
現在のキーボード メッセージがテキスト システムによって処理されるかどうか (したがって、無視する必要があるかどうか) を判断できる必要があります。テキスト以外のすべてのキーは、レイアウトに依存しない方法で処理する必要があるため、これは特に当てはまります (私は既に持っています)。
IMM API とテキスト サービス フレームワークの両方の Windows 7 サンプル コードも確認しました。どちらが優れているかはわかりませんが、どちらも同じことをしているようです。彼らは?
IMM の場合、WM_IMM_xxx
無視すべきかどうかわからないメッセージが多数あり、Unicode ウィンドウでそれらを処理する必要があるかどうかについて、私が見つけたすべての参照が一致していないようです。 .. また、特定のキー イベントが IMM によって処理されるかどうかを知るという上記の問題は、まだ未解決です。方法はありますか?
TSF には ACP と呼ばれる概念があり、実際に使用するテキスト (つまり、進行中の構成ではない) を格納するために必要なテキスト格納形式を使用できるようです。これは本当ですか?テキストを属性付きの UTF-8 として保存し、描画時に (DirectWrite の場合) UTF-16 に変換できるようにしたいと考えています。他の API の選択肢でもこれを実行できますか?
または、私は完全に間違った道を進んでいますか?
そして、それをすべて行ったら、どのようにスクリーン キーボードをオプトイン し ますか?
私が使用した他の参考文献:
ありがとう。
2016 年 11 月 7 日更新
TsfPad のサンプルをもう一度見てみると、単にWM_CHAR
;を使用しているように見えることに気付きました。今では、TSFをどのように使用しているのかさえわかりません.
c++ - ID2D1RenderTarget::DrawTextLayout() の呼び出しが機能しない
基本的に、次のテストコードが与えられます:
target->DrawTextLayout メソッドは何も描画していません。ただし、DrawTextW への次の呼び出しは機能します。
ここに私が知っていることの要約があります:
- TextFactory は IDWriteFactory オブジェクトへのポインター、TextFormat は IDWriteTextFormat オブジェクト、target は有効な ID2D1HwndRenderTarget です。
- DrawTextW メソッドを使用して適切にテキストを描画できるため、TextFormat は有効な IDWriteTextFormat オブジェクトです。
- CreateTextLayout の呼び出しはエラー コードを返さず、S_OK 成功コードを返します。
- TextFormat とテキスト レイアウト オブジェクトは両方とも、同じ DirectWrite ファクトリを使用して作成されました。これは、アプリケーションに存在する唯一の DirectWrite ファクトリでもあります。
- ID2D1SolidColorBrush textBrush は、不透明度 1.0 の有効なブラシで、色が黒に設定されています。DrawTextW はこのブラシを使用してウィンドウに正常に描画しているため、これが問題ではないことはわかっています。
- ID2D1TextLayout オブジェクトの GetMetrics メソッドを呼び出すと、有効なメトリックが返されます。つまり、オブジェクトに格納されているテキストの幅と高さは 0 または負ではありません。
- ID2D1RenderTarget::EndDraw() の呼び出しは、エラー コードを返さず、S_OK 成功コードを返します。
- 私のコードの別のセクション (たまたま別の dll ファイルにある) で最も困惑しているのは、DrawTextLayout の呼び出しが機能することです。このコードは dll ファイルにありますが、同じ DirectWrite ファクトリを使用しています。別のdllファイルにいることが違いを生むとは本当に思いません。
私が提供した両方のコード サンプルは、次々に実行され、両方ともテキストを正常に描画するはずです。ただし、テキストを描画しているのは DrawTextW だけです。Direct 2D Effects を使用するなど、描画に関して複雑なことは何もしていません。コードは、私が提供したサンプルほど複雑ではありません。今のところ、DrawTextW メソッドを使用できますが、単純に IDWriteTextLayout オブジェクトを作成して描画し、オブジェクトを破棄する方法をどこかで読んだので、使用したくありません。これは多くの不要な作業ですが、テキスト レイアウト オブジェクトを自分で使用することで軽減できます。
なぜこれが起こっているのか誰にも分かりますか?なぜこれが起こっているのか、私にはまったくわかりませんが、どこかで接続を見つけようとし続けます.
c++ - DirectWrite でのテキストのランダムなトリミングを修正するには?
アプリケーションの fps を表示しています。テキストのサイズまたは位置を変更すると、適切にレンダリングされず、レイアウト四角形が十分に大きい場合があります。
誰でもこれを修正する方法を知っていますか?
コード例、スニペットのみ:
変数:
コンストラクタ:
描く:
レンダーターゲット:
すべてが非常に正常です。これは何らかのスムージングで解決されるか、何かを忘れただけかもしれません。
directwrite - IDWriteFontFace が複数のファイルを持つことができるのはいつですか?
IDWriteFontFace.GetFiles()
フォント ファイルのコレクションを返します。単一のフォント フェイスを複数のファイルに分割できるフォント形式を知らないため、これは私を困惑させます。(逆は当てはまりません。フォント コレクション ファイルは複数のフォント フェイスを保持できます。)
実際、私のコンピューターにインストールされているフォントをテストしたところ、このメソッドは常に 1 つのファイルを含むコレクションを返すことがわかりました。
IDWriteFontFace.GetFiles()
質問:複数のファイルを返す場合はありますか?