在WinForms中模仿禁用焦点行为

时间:2012-07-21 21:04:19

标签: vb.net winforms

根据this Post我试图模仿

的行为
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

结束班

1 个答案:

答案 0 :(得分:1)

我不相信你想做的事情是可能的。如果您没有焦点,则滚动将不起作用。

但是,我认为你应该重新考虑原来的问题。为什么不在要自动滚动的面板中使用AutoSize = true, MaximumSize.Width = ParentWidth标签(可以禁用)。这听起来像你真正想要的。

相关问题