更改(自定义)ProgressBar 颜色

Change (custom) ProgressBar color

我正在创建一个带有 属性

的自定义进度条
Public Class CustomProgressBar : Inherits ProgressBar

    Private _State As ProgressStates

    <DllImport("user32.dll", CharSet:=CharSet.Auto)> _
    Private Shared Function SendMessage(ByVal hWnd As IntPtr, ByVal msg As Integer, ByVal wParam As Integer, <MarshalAs(UnmanagedType.LPWStr)> ByVal lParam As String) As Int32
    End Function

    <Category("Appearance")> _
    <DefaultValue(ProgressStates.Normal)> _
    <Description("The progress state, Red=Error, Yellow=Warning, Green=Normal")> _
    Public Property State As ProgressStates
        Get
            Return _State
        End Get
        Set(value As ProgressStates)
            _State = value
            SendMessage(MyBase.Handle, 1040, value, 0)
        End Set
    End Property

End Class

进度状态

Public Enum ProgressStates

    Normal = 1
    [Error] = 2
    Warning = 3

End Enum

在设计器中我将我的自定义 属性 设置为 Error 并且它工作正常(在设计器中),但是当我 运行 我的应用程序时,进度值自动设置为 0 属性 未应用

它与 属性 完全无关,而是 PInvoke is imperfect either in the source or your conversion. I suspect you started with this old C# answer.

Imports System.Runtime.InteropServices
Class NativeMethods
    <DllImport("user32.dll", CharSet:=CharSet.Auto, SetLastError:=False)>
    Private Shared Function SendMessage(hWnd As IntPtr,
                                        Msg As UInt32,
                                        w As IntPtr,
                                        l As IntPtr) As IntPtr
    End Function

    Private Const PBM_SETSTATE = &H400 + 16
    Friend Enum PBMStates
        Normal = 1
        [Error] = 2
        Paused = 3
    End Enum

    Friend Shared Sub SetProgressState(ctl As ProgressBar, state As PBMStates)
        SendMessage(ctl.Handle, PBM_SETSTATE, New IntPtr(state), IntPtr.Zero)
    End Sub
End Class

根据 MSDN 文档,PBM_SETSTATE returns 之前的状态。我忽略了它并将其设为 Sub。因为它只应该与 ProgressBar 一起使用,所以它只接受 ProgressBar 控件而不是控件句柄(可以来自任何控件)。最后,代码是 SharedNativeMethods class 所以 CA 不会抱怨。用法:

NativeMethods.SetProgressState(ProgressBar1, NativeMethods.PBMStates.Error)

结果: