我正在创建一个带有属性的自定义进度栏
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在源代码或转换中都不完美。我怀疑您是从这个旧的C#答案开始的。
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
返回以前的状态。我忽略了这一点,并将其作为Sub。由于只应该将其与ProgressBar
I一起使用,因此它仅接受ProgressBar
控件而不是控件句柄(可以来自任何控件)。最后,代码是Shared
and在一个NativeMethods
类中,因此CA不会抱怨。用法:
NativeMethods.SetProgressState(ProgressBar1, NativeMethods.PBMStates.Error)
结果:
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句