0

この投稿によると、私はの動作を模倣しようとしています

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

エンドクラス

4

1 に答える 1

1

私はあなたがやりたいことが可能だとは思いません。フォーカスがない場合、スクロールは機能しません。

ただし、元の問題を再考する必要があると思います。AutoSize = true, MaximumSize.Width = ParentWidth自動スクロールするパネル内でラベル(無効になっている可能性があります)を使用してみませんか。これはあなたが本当に探しているもののように聞こえます。

于 2012-07-22T04:30:51.443 に答える