|
分類:[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を正しく設定する方法や、あるいはヒントなどございましたら、是非お願いします。
|