本程序運行需要在窗體上添加一個TreeView、一個Panel、一個PropertyGrid控件。
在TreeView、Panel控件上使用右鍵可爲其添加子控件。
程序主要爲了測試類的特性,同時也有運行時動態改變控件位置的實現方法,對於不同控件屬性保持一致、動態添加的控件添加事件等功能實現兼而有之,值得初學者一看。
主要源碼:
(1) BaseClass Code:
Private mName As String = "默認"
Private mStatus As DevStatus = DevStatus.Default
Private mId As Guid = Guid.NewGuid
Public Event NameChanged(ByVal NewName As String)
Public Event StatusChanged(ByVal NewStatus As DevStatus)
Public Enum DevStatus
[Default] = 0
Normal = 1
Warn = 2
[Error] = 3
Unknown = 4
End Enum
Property Name() As String
Get
Return Me.mName
End Get
Set(ByVal value As String)
If Not value.Equals(Me.mName) Then
Me.mName = value
RaiseEvent NameChanged(value)
End If
End Set
End Property
Property Status() As DevStatus
Get
Return Me.mStatus
End Get
Set(ByVal value As DevStatus)
If Not value.Equals(Me.Status) Then
Me.mStatus = value
RaiseEvent StatusChanged(value)
End If
End Set
End Property
Property ID() As Guid
Get
Return Me.mId
End Get
Set(ByVal value As Guid)
Me.mId = value
End Set
End Property
End Class
(2) Otd Code:
Inherits BaseClass
Private mPower As Integer
Property Power() As Integer
Get
Return Me.mPower
End Get
Set(ByVal value As Integer)
Me.mPower = value
End Set
End Property
Sub New()
MyBase.New()
Me.Name = "光發送機"
End Sub
End Class
(3) Upor Code :
Inherits BaseClass
Private mCurrent As Integer
Property Current() As Integer
Get
Return Me.mCurrent
End Get
Set(ByVal value As Integer)
Me.mCurrent = value
End Set
End Property
Sub New()
MyBase.new()
Me.Name = "光接收機"
End Sub
End Class
(4) MyPic Code :
Inherits PictureBox
Private MouseDownPoint As Point
Private mMeSelect As Boolean
Public WithEvents Device As BaseClass
Public Event PicClick(ByVal Device As BaseClass)
Public Property MeSelect() As Boolean
Get
Return Me.mMeSelect
End Get
Set(ByVal value As Boolean)
Me.mMeSelect = value
If value Then
Me.BorderStyle = Windows.Forms.BorderStyle.Fixed3D
Else
Me.BorderStyle = Windows.Forms.BorderStyle.FixedSingle
End If
End Set
End Property
Sub New(ByVal ThisDevice As BaseClass)
MyBase.New()
Me.BorderStyle = Windows.Forms.BorderStyle.FixedSingle
Me.Device = ThisDevice
End Sub
Private Sub mDevice_StatusChanged(ByVal NewStatus As BaseClass.DevStatus) Handles Device.StatusChanged
Select Case NewStatus
Case BaseClass.DevStatus.Default : Me.BackColor = Color.Transparent
Case BaseClass.DevStatus.Error : Me.BackColor = Color.Red
Case BaseClass.DevStatus.Normal : Me.BackColor = Color.LightGreen
Case BaseClass.DevStatus.Unknown : Me.BackColor = Color.Blue
Case BaseClass.DevStatus.Warn : Me.BackColor = Color.Yellow
End Select
End Sub
Private Sub MyPic_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Click
RaiseEvent PicClick(Me.Device)
End Sub
Private Sub MyPic_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown
If e.Button = Windows.Forms.MouseButtons.Left Then
Me.Cursor = Cursors.Hand
MouseDownPoint = New Point(e.X, e.Y)
End If
End Sub
Private Sub MyPic_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
If e.Button = Windows.Forms.MouseButtons.Left Then
Dim dx As Integer = e.X - MouseDownPoint.X
Dim dy As Integer = e.Y - MouseDownPoint.Y
Me.Location = New Point(Me.Left + dx, Me.Top + dy)
End If
End Sub
Private Sub MyPic_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseUp
Me.Cursor = Cursors.Arrow
End Sub
End Class
(5) MyNode Code :
Inherits TreeNode
Public WithEvents Device As BaseClass
Sub New(ByVal ThisDevice As BaseClass)
MyBase.New()
Me.Device = ThisDevice
Me.Text = Me.Device.Name
End Sub
Private Sub mDevice_NameChanged(ByVal NewName As String) Handles Device.NameChanged
Me.Text = NewName
End Sub
Private Sub mDevice_StatusChanged(ByVal NewStatus As BaseClass.DevStatus) Handles Device.StatusChanged
Select Case NewStatus
Case BaseClass.DevStatus.Default : Me.ForeColor = Color.Black
Case BaseClass.DevStatus.Error : Me.ForeColor = Color.Red
Case BaseClass.DevStatus.Normal : Me.ForeColor = Color.LightGreen
Case BaseClass.DevStatus.Unknown : Me.ForeColor = Color.Blue
Case BaseClass.DevStatus.Warn : Me.ForeColor = Color.Yellow
End Select
End Sub
End Class
(6) Form Code :
Private Sub NewOtdToolStripMenuItem1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NewOtdToolStripMenuItem1.Click
AddPicCtrl(New Otd).Device = AddNodeCtrl(New Otd).Device
End Sub
Private Sub NewUporToolStripMenuItem1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NewUporToolStripMenuItem1.Click
AddPicCtrl(New Upor).Device = AddNodeCtrl(New Upor).Device
End Sub
Private Sub NewOtdToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NewOtdToolStripMenuItem.Click
AddNodeCtrl(New Otd).Device = AddPicCtrl(New Otd).Device
End Sub
Private Sub NewUporToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NewUporToolStripMenuItem.Click
AddPicCtrl(New Upor).Device = AddNodeCtrl(New Upor).Device
End Sub
Private Function AddNodeCtrl(ByVal Cls As BaseClass) As MyNode
Dim NodeCtrl As New MyNode(Cls)
TreeView1.Nodes.Add(NodeCtrl)
Return NodeCtrl
End Function
Private Function AddPicCtrl(ByVal Cls As BaseClass) As MyPic
Dim PicCtrl As New MyPic(Cls)
AddHandler PicCtrl.PicClick, AddressOf Me.PicClick
Panel1.Controls.Add(PicCtrl)
Return PicCtrl
End Function
Private Sub PicClick(ByVal Device As BaseClass)
Me.PropertyGrid1.SelectedObject = Device
For Each Pic As MyPic In Panel1.Controls
Pic.MeSelect = Pic.Device.ID.Equals(Device.ID)
Next
For Each node As MyNode In TreeView1.Nodes
If node.Device.ID.Equals(Device.ID) Then
TreeView1.SelectedNode = node
Exit For
End If
Next
End Sub
Private Sub TreeView1_NodeMouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.TreeNodeMouseClickEventArgs) Handles TreeView1.NodeMouseClick
Me.PropertyGrid1.SelectedObject = CType(e.Node, MyNode).Device
For Each Pic As MyPic In Panel1.Controls
Pic.MeSelect = Pic.Device.ID.Equals(CType(e.Node, MyNode).Device.ID)
Next
End Sub
End Class