VB.NET Winforms / .Net Framework 4.5.2 ListViewBox Отключить цвет фона - PullRequest
0 голосов
/ 28 июня 2018

У меня есть проект с VB.NET Winforms / .Net Framework 4.5.2, и в настоящее время я использую ListViewBox для отображения определенной информации. Однако он прекрасно работает, когда окно отключено (т.е. у меня есть дочернее окно, которое отключает родительское окно для определенных вещей), цвет фона ListViewBox - серый. Вот пример, чтобы понять, что я имею в виду:

Top one is enabled, bottom is disabled

Как видите, нижнее изображение возникает, когда окно отключено. Я бы хотел предотвратить появление этого светло-серого цвета, но я не знаю, как это решить. Я слышал о некоторых вещах, таких как придание цвету фона фактического цвета (в данном случае черного), который работает как хак, но все добавленные элементы переопределяют это в любом случае, поэтому он не работает.

1 Ответ

0 голосов
/ 29 июня 2018

Вы можете переопределить событие с помощью WNDPROC в элементе управления (пользовательский элемент управления, т. Е. Открытый класс CustomListView наследует ListView), чтобы запретить окну принимать включение / отключение. Затем вы также должны переопределить OnEnableChanged, чтобы вы могли изменить свои собственные цвета. Похоже, что когда вы снова включите и вернетесь к своим исходным / стандартным цветам, он также обновит пользовательские цвета, так что это работает здесь. Вы, вероятно, можете продвинуться дальше, чем это (вероятно, только для чтения), если вам требуется, чтобы он был включен / отключен индивидуально, но потому что, когда вы отключаете всю форму, вы все равно не можете взаимодействовать с ListView, что делает это решение ОК для меня без дополнительного кодирования .

Protected Overrides Sub OnEnabledChanged(e As System.EventArgs)
    MyBase.OnEnabledChanged(e)

    If Me.Enabled Then
        Me.ForeColor = Color.White
        Me.BackColor = Color.Black
    Else
        Me.ForeColor = Color.FromArgb(255, 200, 200, 200)
        Me.BackColor = Color.FromArgb(255, 35, 35, 35)
    End If
End Sub

Protected Overrides Sub WndProc(ByRef m As Message)
    Select Case m.Msg
        Case &HA 'WM_ENABLE
            ' Prevent the message from reaching the control,
            ' so the colors don't get changed by the default procedure.
            Exit Sub ' <-- suppress WM_ENABLE message
        Case Else
            MyBase.WndProc(m)
            Exit Select
    End Select
End Sub

Это приводит к: End Result

И поскольку мы изменяем цвет переднего плана на нормальный, он обновляет вид списка, который я предполагаю, в результате чего все остальные цвета возвращаются к нормальному, как показано на рисунке выше в моем вопросе.

Это может быть не чисто, но я надеюсь, что это поможет кому-то начать в правильном направлении.

...