TextBoxコントロールのEnabledプロパティをFalseにしても前景色と背景色を変えないようにする: .NET Tips: C#, VB.NET
System.Windows.Forms.TextBoxコントロールのEnabledプロパティをFalseにすると、文字の色と背景が灰色になりますが、ここではEnabledプロパティをFalseにしても文字の色と背景色が変わらないようにする方法を紹介します。
BackColorを変更する
TextBoxの背景色だけであれば、EnabledプロパティをFalseにした後、BackColorプロパティを設定するだけで、色を変更できます。ただし、ForeColorはこの方法では変更できないようです。(.NET Framework 1.1、2.0で確認)
TextBox1.Enabled = False TextBox1.BackColor = TextBox1.BackColor
TextBox1.Enabled = false; TextBox1.BackColor = TextBox1.BackColor;
ReadOnlyにする
TextBoxの前景色を変えないようにするには、EnabledプロパティをFalseにする代わりに、ReadOnlyプロパティをTrueにするという方法があります。ReadOnlyプロパティをTrueにしても背景色は灰色となりますが、上の例と同様にBackColorプロパティを設定すれば、背景色を変えなくすることもできます。
11×17を行いますカラーLaserJetプリンタ
自分で描画する
ReadOnlyを使うのではなく、どうしてもEnabledプロパティをFalseにしても前景色と背景色が変わらないようにしたいということであれば、TextBoxクラスから派生したクラスを作成し、OnPaintメソッドをオーバーライドすることにより自分で文字列を描画するという方法があります。この方法は、「Windows Forms FAQ - 27.15 When I set a TextBox to Readonly or set Enabled to false, the text color is gray. How can I force it to be the color specified in the ForeColor property of the TextBox.」で紹介されています。しかし残念ながらここに紹介されている方法では、TextBoxのEnabledがTrueの時に別のフォント(システムフォント?)でTextが表示されてしまいます。
これを防ぐには、TextBoxのEnabledがFalseの時だけ自分で描画するようにします。次の例ではOnEnabledChangedメソッドをオーバーライドすることにより、EnabledがTrueの時のみ独自に描画するようにしています。このクラスはTextAlignやRightToLeftなどのプロパティを一切無視していますので、あくまで参考としてご覧ください。
私は、サーブレットで画像を呼び出すことができますか
Class MyTextBox Inherits TextBox Protected Overrides Sub OnEnabledChanged(ByVal e As EventArgs) MyBase.OnEnabledChanged(e) If Me.Enabled Then Me.SetStyle(ControlStyles.UserPaint, False) Else Me.SetStyle(ControlStyles.UserPaint, True) End If Me.Invalidate() End Sub Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs) MyBase.OnPaint(e) Dim b As New System.Drawing.SolidBrush(Me.ForeColor) e.Graphics.DrawString(Me.Text, Me.Font, b, -1, 1) b.
スプラッターブラシを作る方法Dispose() End Sub End Class
class MyTextBox : TextBox { protected override void OnEnabledChanged(EventArgs e) { base.OnEnabledChanged(e); if (this.Enabled) this.SetStyle(ControlStyles.UserPaint, false); else this.SetStyle(ControlStyles.UserPaint, true); this.Invalidate(); } protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); System.Drawing.Brush b = new System.Drawing.SolidBrush(this.ForeColor); e.Graphics.DrawString(this.Text, this.Font, b, -1, 1); b.Dispose(); } }
このような方法を無理して使うよりも、できることならReadOnlyプロパティを使うか、別のもっと簡単な方法を考える方がよいでしょう。
(この記事は、「.NETプログラミング研究 第49号」で紹介したものを基にしています。)
注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。
0 コメント:
コメントを投稿