この投稿によると、私はの動作を模倣しようとしています
Enabled = False
実際にコントロールを無効にすることなく。(私の場合、複数行のTextBox)
次に私が達成しようとしているのは、無効にされたコントロールのマウスによるフォーカス動作を模倣することです。無効になっているコントロールをクリックしてもフォーカスが得られず、以前にフォーカスがあったコントロールがフォーカスを失うことはありません。
これまでに思いついたのは、WndProcでWM_SETFOCUSメッセージをインターセプトできるため、コントロールがフォーカスを受け取らないことです。
Private Const WM_SETFOCUS = &H7
Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
If Me.ReadOnly AndAlso (m.Msg = WM_SETFOCUS) Then Exit Sub
MyBase.WndProc(m)
End Sub
それに関する問題は、前のコントロールがフォーカスを失ったことです。これは意図されていません。マウスでクリックしてもフォーカス動作に影響が出ないようにするにはどうすればよいですか?これを行う方法はありますか?
更新:06.08.12
Justinが提案したように、自動スクロールパネルのラベルに変更することで問題を解決しました。最小限のコード例は次のとおりです。
Imports System.Windows.Forms
Public Class ScrollableDisabledTextBox
Inherits TextBox
Private xLabel As Label
Private xPanel As Panel
Public Sub New()
InizializeComponent()
End Sub
Private Sub InizializeComponent()
xPanel = New Panel
xPanel.AutoScroll = True
xPanel.BorderStyle = BorderStyle.FixedSingle
xLabel = New Label
xLabel.Enabled = False
xLabel.AutoSize = True
xPanel.Controls.Add(xLabel)
Me.Me_SizeChanged()
End Sub
Private Sub Me_EnabledChanged() Handles Me.EnabledChanged
If Me.Enabled Then
Me.Show()
xPanel.Hide()
Else
xPanel.Show()
Me.SendToBack()
Me.Hide()
End If
End Sub
Private Sub Me_TextChanged() Handles Me.TextChanged
xLabel.Text = Me.Text
End Sub
Private Sub Me_SizeChanged() Handles Me.SizeChanged
xPanel.Size = Me.Size
xLabel.MaximumSize = New System.Drawing.Size(xPanel.Size.Width, 0)
End Sub
Private Sub Me_ParentChanged() Handles Me.ParentChanged
xPanel.Location = Me.Location
'If parent changed multiple times, remember to remove panel from old parent!
If Not Me.Parent.Controls.Contains(xPanel) Then
Me.Parent.Controls.Add(xPanel)
End If
End Sub
エンドクラス