tldr - Textboxのサブクラスを作成しました。それを処理する適切な方法は何ですか?VB.Netのカスタムテキストボックス
私の会社のVB.Netアプリケーションでは、テキストボックスをGoogleのテキストボックスのように動作させるように求められています。つまり、フォーカスがあるときに青い枠線が必要です。しない。私はすでに、テキストボックスのBorderStyleを 'None'に設定し、フォームのPaintイベント内に適切な矩形を描画することでこれを達成できます。しかし、私が使用するテキストボックスごとに、これを行う必要があります。私たちのアプリケーションにはかなりのものがあります。言うまでもなく、これは苦痛であり、むしろ私が呼ぶことができる1つのコードを持っています。
私は2つの選択肢があると考えました。上記のメソッドを使用する1つのテキストボックスを含むユーザーコントロールを作成するか、またはTextBoxクラスを継承し、この動作標準を作成する独自のクラスを作成できます。私は後者のアプローチを使用することを選択し、OnPaintメソッドをオーバーライドして、私が望む動作を達成しました。しかし今、私はいくつかの新しい落とし穴に遭遇しています。
主な問題は、テキストボックスにフォーカスがあるときに、テキストボックス内のテキストが正しく表示されないことです。テキストは別のフォントを使用し、太字で表示され、ハイライト表示がうまく見えます。テキストボックスのフォーカスが失われた場合、テキストは正しく表示されます。私は、強調表示されたテキストの描画を別々に扱う必要があると考えていますが、私は何をする必要があるのかよくわかりません。私はそれをOnPaintメソッドで処理するのですか、それとも別の場所にキャッチする必要がありますか?このアプローチを放棄してユーザーコントロールを行う必要がありますか?
ボーナスに関する質問:カスタムテキストボックスの作成経験がある人は、私が知る必要があるヒントや問題点はありますか?これは私の初めてのカスタムコントロールの作成なので、私は本当にすべてのものを期待するか分からない。
編集:私はUserPaintフラグをtrueに設定しているため、OnPaintをオーバーライドすることができます。私はこれがはっきりしていたと推測していますが、私は徹底したいだけです。
edit2:ここにクラス全体があります。
Imports System.Drawing
Public Class MyCustomTextBox
Inherits TextBox
Public Sub New()
MyBase.New()
Me.BorderStyle = BorderStyle.None
SetStyle(ControlStyles.UserPaint, True)
End Sub
Protected Overrides Sub OnGotFocus(ByVal e As System.EventArgs)
'I want these textboxes to highlight all text by default
Me.SelectAll()
MyBase.OnGotFocus(e)
End Sub
Protected Overrides Sub OnLostFocus(ByVal e As System.EventArgs)
Me.SelectionLength = 0
MyBase.OnLostFocus(e)
End Sub
Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
Dim p As Pen = Nothing
'MyBase.OnPaint(e)
e.Graphics.FillRectangle(Brushes.White, Me.ClientRectangle)
If Me.Focused Then
p = New Pen(Brushes.CornflowerBlue)
Else
p = New Pen(Brushes.Gainsboro)
End If
e.Graphics.DrawRectangle(p, 0, 0, Me.ClientSize.Width - 1, Me.ClientSize.Height - 1)
e.Graphics.DrawString(Me.Text, Me.Font, New SolidBrush(Me.ForeColor), Me.ClientRectangle)
End Sub
End Class
あなたが行った唯一の変更がOnPaintであるとすると、そのコードを投稿できますか? – Timiz0r
TextBoxは基本的にUserPaintスタイルの有効化をサポートしていません。 –