4

重要:記載されている機能が本当に必要なので、代替案の提案を開始しないでください。

テキスト領域と非テキスト領域、つまり最新のキャンバスを含むカスタムWinFormsコントロールにテキストを表示して入力しようとしています。

さまざまなズームレベルでカスタムコントロールにテキストとキャレットを表示し、他のカスタムエフェクトを使用できるようにする必要があります。ただし、キーボードとマウスの入力方式コード、ラインサービスコードなどを記述したくない(またはそのための手段がない)-ソリューションは、標準のTextBoxがサポートするすべての言語をサポートする必要があります。

したがって、私たちが検討しているアプローチは、非表示のテキストボックスを使用し、適切な変換後にキーボードとマウスのイベントをそのテキストボックスにルーティングし、そのパブリックアクセサーを使用して文字の配置方法を決定することです。これにより、理論的には、選択したテキストを強調表示し、カレットを描画し、ユーザーがキーを押したときに適切なアクションを実行できるようになります(キーボードでのテキストの選択と削除を含む)。

つまり、テキスト領域は非表示のテキストボックスのプロキシです。その結果、ズームの欠如などの制限を克服しながら、テキストボックスの機能を構築します。

表示部分は実行可能であると期待していますが、キーボードとマウスの入力はおそらく非常に注意が必要です。

質問:これは以前に試されて成功しましたか?動作するコードはどれでも優れています。

更新:迅速で汚い実験は、TextBoxがマウスメッセージで送信されたマウス座標を尊重しないことを示しているようですが、現在のマウス位置を直接読み取っているようです。したがって、新しい質問:

すべての言語で機能するように、直接TextBoxアクションの観点からすべてのTextBoxマウスイベントをキャストすることは可能ですか?ヒットテストメソッドGetCharIndexFromPositionとテキスト選択メソッドSelectで十分であると推測されます。これは合理的だと思いますか?

4

1 に答える 1

1

提案どおりに非表示の TextBox を使用し、その内容をビットマップに描画するために WM_PRINT メッセージを送信することをお勧めします。次に、そのビットマップを実際の対象領域に描画し、ズームや回転などの変更を適用できます。キーボード メッセージは非表示の TextBox に単純に転送できるため、キャレットとコンテンツはユーザーの期待どおりに更新されます。トリッキーな部分は、マウスの操作だけです。クライアント座標を取得し、逆変換 (ズーム、回転など) を使用して、クライアントから非表示の TextBox の実際の座標を取得する必要があります。

于 2010-09-03T05:17:36.997 に答える