| 分類:[C# (Windows)]
お世話になっておりますm(_ _)m
C#(VS 2005)でTextBoxを継承したコントロール(Multiline, WordWarp)を作成しています。 このコントロールの仕様の1つとして、「3文字単位で選択範囲を設定する」というものがあり、 KeyDown, KeyUp, MouseDown, MouseUpなどのイベントを使って、 選択範囲(SelectionStartとSelectionLengthの値)を調整しています。
ほとんどのコーディングは上手く終わり、現在、表題の問題だけが解消できずにいます。
現象は次のようなものです。 [前提] ・TextBoxにはスクロールが可能な量の文字列が設定されている ・選択開始時には、Caretは下のほうにあり、上方向にスクロールが可能 [操作] ・選択範囲を上(左)方向に拡張して行き、選択しながら上スクロールを発生させる [現象] ・SetCaretPosでCaretを選択範囲の先頭に設定するのだが、実際にはCaretは選択範囲の末尾に存在する [補足] ・選択範囲の操作は、マウス、キーボードどちらでも現象が発生 ・(同一コードで)上スクロールを発生させなければ、Caretは選択範囲の先頭に設定される
コードは以下のとおりです。 =============================================== // 問題の操作を行っている関数 [DllImport("User32.dll")] public static extern bool SetCaretPos(int X, int Y);
private void setCaretIndex(int index) { Point caretPos = GetPositionFromCharIndex(index); SetCaretPos(caretPos.X, caretPos.Y); ScrollToCaret(); } ===============================================
選択範囲確定後にCaretを先頭に持ってくる必要がある場合だけ、 この関数に引数としてSelectionStartを与えています。
トレースしてみたところ、現象が起きる状況では、 GetPositionFromCharIndexで得られるPointのY値が65535に近い値になっています。
同様に上スクロールしたときのCaret位置をGetCaretPosで取得するとY値がマイナスになっているので、 試しにY値を-65535してマイナスに落としてみたのですが、現象は変わりませんでした。
スクロールさせれば上手くいくか?と思い 「SelctionStart設定→SelectionLength=0に設定→ScrollToCaret()を実行」 の後に再びSelectionLengthを設定して上記関数を呼び出したのですがダメでした。
検索もしてみたのですが、よいキーワードが思いつかず、情報が集まりません。 Caretを正しく設定する方法や、あるいはヒントなどございましたら、是非お願いします。
|