- PR -

【C#】 カーソルのちらつきを止めたい

投稿者投稿内容
mia
会議室デビュー日: 2005/10/16
投稿数: 12
投稿日時: 2006-01-26 04:25
いつもお世話になっております。
現在プログラミングエディタを開発しており、TextBoxに入力を途中まで行うと、入力支援(?)用のListBoxが開いて、入力をショートカットしてくれるような機能を実装しようとしています。

このとき、入力中に出てくるListBoxの項目をマウスでクリックすると、ソースコードが書かれているTextBoxのフォーカスが離れてしまいます。ListBoxのMouseClickイベントハンドラが呼び出されるたびにFocusを毎回テキストボックスに戻す処理をしたところ、いちおうの動作はしてくれたのですが、クリックするたびにテキストボックスのカーソルがちらつくのが気になってます。

VisualStudioなどのエディタを見ると、入力支援のListBoxをクリックしてもTextBoxのカーソルはまったく微動だにしていないです。
細かい点ですが、ぜひこれを実現したいです。


調べたところ、マウスクリックをしてFocusが移動する場合のイベントは

TextBox: (LostFocus)→ Leave → Validating → Validated
 ↓
ListBox: Enter → (GotFocus)

のように発生すると知りました。
ListBoxそのものにフォーカスを移動させないで、マウス座標からListBoxのindexを取得しようとするにも、TextBoxのLeaveイベントが発生してからではもう遅く、ちらつきが起こってしまいました。ListBoxをクリックしても、Focusの移動そのものが起こらないようにする方法(プロパティの設定など)はあるのでしょうか?

他の手段として、別の新しいスレッドをつくり、本体とは違うところからListBoxの表示をしてくれる仕組みを考えてみました。ところが、Formクラスを継承したスレッド上で、ListBoxインスタンスを生成しても、コンパイルは通るがリストボックスが表示されない始末・・もう行き詰ってます(苦笑)

どんな方法でも、どなたかご教授ください。
よろしくお願いします。
加納正和
ぬし
会議室デビュー日: 2004/01/28
投稿数: 332
お住まい・勤務地: 首都圏
投稿日時: 2006-01-26 07:56
>TextBoxに入力を途中まで行うと、入力支援(?)用のListBoxが開いて、

要するに、データを入力している最中に、そのデータにあわせてGUI表示したいんですよね。

普通にデータバインディング使えばいいのでは。TextBox.Textになんかの
データバインディングクラスを作って、くみこめば、例えばTextBoxに「A」と
入れたListBoxが出力するようにすればいいような、、、違うかな。

.NET frameworkは自慢ではありませんが、お勉強中でよく分かっていせません。
でも、データバインディング自体は、意外と楽ですよ。

じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-01-26 08:48
私は DropDown スタイルの ComboBox でいいと思います。
そのためのものですから、直感的にわかりやすいです。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-01-26 09:10
これだけでは何ですので解決策を。
  1. System.Windows.Forms.TextBox の派生クラスを作ります。
  2. WndProc で条件に応じて WM_KILLFOCUS を捕捉し破棄します。
これでとりあえずできますが、別のコントロールへ渡った場合の復帰が面倒臭いです。
派生クラスで色々と工夫する必要があります。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
iStation
大ベテラン
会議室デビュー日: 2003/12/08
投稿数: 158
投稿日時: 2006-01-26 09:29
インテリセンスの実装なら下記のサイトが参考になると思います。

DIY Intellisense - The Code Project - C# Programming
http://www.codeproject.com/csharp/DIY-Intellisense.asp
_________________
IEEE-CSDP 2004-2007
mia
会議室デビュー日: 2005/10/16
投稿数: 12
投稿日時: 2006-01-26 17:30
>加納正和さん
説明に誤解があったみたいです、分かりにくくてすみません。
データを入力している最中に、その入力にあわせてGUI表示をする部分は、加納さんがおっしゃるような方法でもうすでに実装はできています。
私が今実現したいことをもっと短的に言うならば、


《フォーカスの移動》

  テキストボックス(*1) → リストボックス(*2) → テキストボックス(*3)

  *1. カレットが出現
  *2. カレットが消失
  *3. カレットが出現 

の一連の流れで、テキストボックスのカレットが不自然に点滅することを防ぎたいのです。こちらの説明の方が分かっていただけるでしょうか(>_<)


>iStationさん
サイトの紹介、ありがとうございます。
さっそくサンプルソースを見てみましたが、

private void listBoxAutoComplete_SelectedIndexChanged(object sender, System.EventArgs e)
{
this.richTextBox1.Focus();
}

とあり、リストボックスの中身をクリックするたびに、カレットがちらつくのは解決されていないようです。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-01-26 17:37
引用:

miaさんの書き込み (2006-01-26 17:30) より:

テキストボックスのカレットが不自然に点滅することを防ぎたいのです。
こちらの説明の方が分かっていただけるでしょうか(>_<)


わかっているつもりで、私はカレットをそのまま残す方法を書きました。
VS のインテリセンスを見るとカレットは "そのまま" だったので。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-01-26 17:39
すいません、入れ違いでしたね。(*_ _)

引用:

miaさんの書き込み (2006-01-26 17:36) より:

ご指摘いただいた解決策を試しているところなので、結果が出次第すぐに結果を報告させていただきます。
もしも良い結果が出なかったときには、また助言をいただけると幸いです。


第三者となるコントロールへ遷移する場合を考えると結構面倒です。
HideSelection プロパティの HideCaret 版があるといいんですけどねw

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌

スキルアップ/キャリアアップ(JOB@IT)