- PR -

XPスタイル時のTextBoxコントロールのBackColorについて

1
投稿者投稿内容
さな
ベテラン
会議室デビュー日: 2004/07/27
投稿数: 59
お住まい・勤務地: 大阪・肥後橋
投稿日時: 2006-11-08 11:13
いつも参考にさせていただいております。

VS.NET2003でC#にて開発を行っています。(XP Pro SP2)
XPスタイルを使用し、TextBoxにフォーカスがあたっいた際、BackColorをYellowに変更し、フォーカス喪失時に元の色に戻す処理を行っています。
このとき、TextBoxから他のコントロールへ移動するのにマウス操作(他のコントロールをクリック)で移動すると、TextBoxの内側に黄色の線が残ります。
(残った状態でマウスカーソルを当てると消えます)
TabキーやSelectNextControlメソッドでフォーカス移動したときは綺麗にもとの色に戻ります。
この現象の回避方法をご存知の方がいらっしゃいましたら、お教え願えないでしょうか。
サンプルソースは以下のとおりです。
TextBoxを1つと他のフォーカス移動できるコントロールを1つ配置して
テストしました。
static void Main()
{
Application.EnableVisualStyles();
Application.Run(new Form1());
}
Color BackColor;
private void textBox1_Enter(object sender, System.EventArgs e)
{
Color BackColor = textBox1.BackColor;
textBox1.BackColor = Color.Yellow;
}
private void textBox1_Leave(object sender, System.EventArgs e)
{
textBox1.BackColor = BackColor;
}

private void textBox1_KeyPress(object sender,
System.Windows.Forms.KeyPressEventArgs e)
{
//メソッドによるフォーカス移動テスト
this.SelectNextControl((Control)sender, true,true,true,true);
}
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-11-08 12:42
引用:

さなさんの書き込み (2006-11-08 11:13) より:

TabキーやSelectNextControlメソッドでフォーカス移動したときは綺麗にもとの色に戻ります。


ここが、ちょっと誤っています。

フォーカス アウトさせた方法がマウスかどうかは関係ありません。
むしろ、フォーカス インさせた方法がマウスかどうかが問題なのです。

今回の例で言いますと、textBox1 をマウスで選択してしまった場合は、
その後、どの方法でフォーカス アウトしても当現象が発生します。

Tab キーなどでフォーカス インした時に、Border の内側を見てください。
おそらく、Border の内側は白いままになっているかと思います。
しかし、マウスによって、フォーカス インした場合は、時間差で黄色の枠が描画されます。

根本的には、この動作の差異が原因になっています。

引用:

このとき、TextBoxから他のコントロールへ移動するのにマウス操作(他のコントロールをクリック)で移動すると、TextBoxの内側に黄色の線が残ります。
この現象の回避方法をご存知の方がいらっしゃいましたら、お教え願えないでしょうか。


Form 自体を強制的に再描画すれば、解決するでしょう。
(TextBox の単独描画では、ダメだったと記憶しています)

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
さな
ベテラン
会議室デビュー日: 2004/07/27
投稿数: 59
お住まい・勤務地: 大阪・肥後橋
投稿日時: 2006-11-08 14:51
じゃんぬねっとさん、いつもお世話になっております。
(ホームページも大変参考にさせていただいております)
引用:

じゃんぬねっとさんの書き込み (2006-11-08 12:42) より:
引用:

さなさんの書き込み (2006-11-08 11:13) より:

TabキーやSelectNextControlメソッドでフォーカス移動したときは綺麗にもとの色に戻ります。


ここが、ちょっと誤っています。

フォーカス アウトさせた方法がマウスかどうかは関係ありません。
むしろ、フォーカス インさせた方法がマウスかどうかが問題なのです。

今回の例で言いますと、textBox1 をマウスで選択してしまった場合は、
その後、どの方法でフォーカス アウトしても当現象が発生します。

Tab キーなどでフォーカス インした時に、Border の内側を見てください。
おそらく、Border の内側は白いままになっているかと思います。
しかし、マウスによって、フォーカス インした場合は、時間差で黄色の枠が描画されます。

根本的には、この動作の差異が原因になっています。


確かにそうでした。
マウスでフォーカスインしたあと、マウスが外れる際に内側が設定したバックカラーで
色づけされてます。

引用:

Form 自体を強制的に再描画すれば、解決するでしょう。
(TextBox の単独描画では、ダメだったと記憶しています)


Formの再描画で解決しました。(TextBox再描画は駄目でした・・・)
ただ、コントロールが多いフォームを再描画した場合に、ちらつくのではないかと心配ですが、とりあえず、そのときに考えたいと思います。

ありがとうございました。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-11-08 15:16
引用:

さなさんの書き込み (2006-11-08 14:51) より:

Formの再描画で解決しました。(TextBox再描画は駄目でした・・・)
ただ、コントロールが多いフォームを再描画した場合に、ちらつくのではないかと心配ですが、とりあえず、そのときに考えたいと思います。


もしかして、Form.Refresh メソッドを使われていますか?
Refresh メソッドは、Invalidate(true) と Update() の組み合わせに過ぎません。

Invalidate([System.Drawing.Rectangle], true) のオーバーロードを使用しましょう。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
さな
ベテラン
会議室デビュー日: 2004/07/27
投稿数: 59
お住まい・勤務地: 大阪・肥後橋
投稿日時: 2007-01-10 17:27
引用:

もしかして、Form.Refresh メソッドを使われていますか?
Refresh メソッドは、Invalidate(true) と Update() の組み合わせに過ぎません。

Invalidate([System.Drawing.Rectangle], true) のオーバーロードを使用しましょう。


追加のご回答ありがとうございました。
御礼が遅くなり、申し訳ございませんでした。
これからも、よろしくお願い致します。
1

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