1

アプリケーションにMSHTMLベースのコントロールが埋め込まれていて、ContentEditableモードを使用してその中のドキュメントを編集しています。HTMLドキュメントの本文には、最初は次の行が含まれています。

<div></div>
<div id="signature"></div>

カレットは、ドキュメントの先頭、つまり最初のDIV要素内に配置されます。これで、ユーザーがコントロール内の最後の行の下の場所でマウスをクリックすると、カレットは2番目のDIV要素に移動します。これは、ユーザーがクリックしたポイントに最も近い要素であるためです。

マウスクリックで最初のDIVの終わりにポインタを移動したいと思います。これで、キャレットの意図された位置をととして計算するコードができましIMarkupPointerIDisplayPointer。私が知る必要があるのは、実際のカレット移動を行うためにMSHTMLイベントパイプラインをインターセプトする場所です。

IHTMLEditDesignerを使用してカレットを実装IHTMLCaret.MoveCaretToPointerし、目的の位置に移動するコードを作成しました。問題は、イベントをインターセプトする場所(PreHandleEvent、PostHandleEvent、またはPostEditorEventNotify)に関係なく、シングルクリックで最終的にカレットの位置がデフォルトの位置に戻ることです(ただし、マウスの左ボタンをしばらく押したままにした場合、またはマウスの右ボタンでクリックします)。

4

5 に答える 5

3

IEコントロールにロードするHTML内でjscriptを使用します。HTMLとjscriptをよく知らない場合、このタスクは非常に苦痛になります。

私がこのようなことを試みたときの私の経験については、これらの質問を参照してください。

また、他にも多くの問題がありました。たとえば、HTMLエディターをWinFormフォームと一緒にサイズ変更するためにjscriptでサイズ変更ロジックを記述しなければならず、デフォルトのフォーム/制御色をHTMLエディターに渡して、書き込みのように見せてからユーザーを変更する必要がありました。 Windowsの配色。

HTMLエディターを見つけてIEコントロールにロードするだけでも、標準のウィンドウの色などを自分でコーディングする必要があります。

使用できるサードパーティのwinformsHTMLエディターもあります。ContentEditableは実際の生活でははるかに難しいので、可能であればソリューションを購入する必要があると思います。

クイックグーグルが見つかりました。

于 2009-09-10T09:49:24.327 に答える
2

タイムアウトが0のwinformsタイマーを使用してみましたか?

  • マウスダウンイベントが発生したら、タイマーを開始します。
  • 次に、MSHTMLコントロールがイベントを処理します
  • その後、Windowsメッセージループに戻ります
  • メッセージキュー内の他のすべてのメッセージは、タイマーの前に処理されます
  • うまくいけば、MSHTMLはシングルクリックでデフォルトのキャレット位置を設定しました
  • その後、タイマーが作動したときに、自分でキャレットの位置を移動できます

Spy ++を見て、MSHTMLコントロールのさまざまなウィンドウ間で送信されているイベントを確認して、他の理想を取得してください。MSHTMLコントロールは、他のWinFormsコントロールとは異なり、CおよびWin32プログラミングの時代に使用したすべてのトリックに戻る必要があります。

于 2009-09-11T10:12:24.867 に答える
1

たぶん、mouseDownmouseUpとmouseClickには別々のイベントがあります。

mouseClickをインターセプトしますが、デフォルトの動作はmouseUpで実行されます。

于 2009-09-09T16:26:27.380 に答える
1

「フォーカス」の設定を最初のdivに結び付けて、そのdomアイテムを見つけ、setFocus(またはそれが呼ばれるもの)のdomメソッドを呼び出しましたか?カレットは、fosusがある場所に移動する必要があります。

(MSHTMLがdomアイテムを検索し、それらのメソッドを呼び出すために公開するインターフェイスがあります。申し訳ありませんが、これを行う方法の詳細を思い出せません)

于 2009-09-11T14:33:32.133 に答える
0

SelectStartプロパティを変更し、SelectionLength = 0のままにする必要があると思います。これにより、キャレットが新しい位置に移動します。

于 2009-09-12T01:36:40.290 に答える