更改(自定义)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
控件而不是控件句柄(可以来自任何控件)。最后,代码是 Shared
和 NativeMethods
class 所以 CA 不会抱怨。用法:
NativeMethods.SetProgressState(ProgressBar1, NativeMethods.PBMStates.Error)
结果:
我正在创建一个带有 属性
的自定义进度条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
控件而不是控件句柄(可以来自任何控件)。最后,代码是 Shared
和 NativeMethods
class 所以 CA 不会抱怨。用法:
NativeMethods.SetProgressState(ProgressBar1, NativeMethods.PBMStates.Error)
结果: