C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

TextBoxでCaretを上(表示外)に移動させる


(過去ログ 10 を表示中)

[トピック内 1 記事 (1 - 1 表示)]  << 0 >>

■2189 / inTopicNo.1)  TextBoxでCaretを上(表示外)に移動させる
  
□投稿者/ 一羽 (38回)-(2007/03/24(Sat) 20:20:52)

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

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -