Guten Tag,
ich möchte ein UserControl schreiben das ich auch zur Laufzeit resizen kann, das funktioniert soweit auch, nur das einzigste Problem ist, das er jetzt nicht mehr meine Form zeichnet, könntet ihr mir vielleicht verraten warum?
ich möchte ein UserControl schreiben das ich auch zur Laufzeit resizen kann, das funktioniert soweit auch, nur das einzigste Problem ist, das er jetzt nicht mehr meine Form zeichnet, könntet ihr mir vielleicht verraten warum?
VB.NET-Quellcode
- Public Class UserControl1
- Private cl_cmsLabel As New ContextMenuStrip
- Private WithEvents cl_Control As Control
- Private WithEvents cl_OwnerForm As Form
- Private cl_nGRS As Integer = 6
- Private cl_bInResizeMode As Boolean
- Private cl_bMoveControl As Boolean
- Private cl_pLastMousePos As Point
- Private cl_nMinWidth As Integer = 20
- Private cl_nMinHeigth As Integer = 20
- Private cl_bActive As Boolean
- Private cl_cGrabRects() As Control = { _
- New Control, _
- New Control, _
- New Control, _
- New Control, _
- New Control, _
- New Control, _
- New Control, _
- New Control}
- Public Sub Deactivate()
- RemoveHandler cl_OwnerForm.Paint, AddressOf ControlPaint
- RemoveHandler cl_Control.MouseMove, AddressOf ControlMouseMove
- cl_Control.Cursor = Cursors.Default
- For nCount As Integer = 0 To cl_cGrabRects.Length - 1
- RemoveHandler cl_cGrabRects(nCount).Paint, AddressOf GrabRectPaint
- RemoveHandler cl_cGrabRects(nCount).MouseClick, AddressOf GrabRectMouseClick
- RemoveHandler cl_cGrabRects(nCount).MouseMove, AddressOf GrabRectMouseMove
- RemoveHandler cl_cGrabRects(nCount).MouseDown, AddressOf GrabRectMouseDown
- RemoveHandler cl_cGrabRects(nCount).MouseUp, AddressOf GrabRectMouseUp
- RemoveHandler cl_cGrabRects(nCount).Move, AddressOf GrabRectMove
- cl_cGrabRects(nCount).Visible = False
- Next
- cl_bActive = False
- cl_OwnerForm.Refresh()
- End Sub
- Sub New(ByVal frmOwnerForm As Form)
- cl_Control = Me
- cl_OwnerForm = frmOwnerForm
- End Sub
- Public Sub Activate()
- AddHandler cl_OwnerForm.Paint, AddressOf ControlPaint
- AddHandler cl_Control.MouseMove, AddressOf ControlMouseMove
- cl_Control.Cursor = Cursors.SizeAll
- For nCount As Integer = 0 To cl_cGrabRects.Length - 1
- AddHandler cl_cGrabRects(nCount).Paint, AddressOf GrabRectPaint
- AddHandler cl_cGrabRects(nCount).MouseClick, AddressOf GrabRectMouseClick
- AddHandler cl_cGrabRects(nCount).MouseMove, AddressOf GrabRectMouseMove
- AddHandler cl_cGrabRects(nCount).MouseDown, AddressOf GrabRectMouseDown
- AddHandler cl_cGrabRects(nCount).MouseUp, AddressOf GrabRectMouseUp
- AddHandler cl_cGrabRects(nCount).Move, AddressOf GrabRectMove
- cl_cGrabRects(nCount).Visible = True
- Next
- cl_bActive = True
- cl_OwnerForm.Refresh()
- End Sub
- Private Sub ControlMouseDown(ByVal sender As Object, ByVal e As MouseEventArgs) Handles Me.MouseDown
- If e.Button = Windows.Forms.MouseButtons.Left Then
- cl_bMoveControl = True
- cl_pLastMousePos = New Point(e.X, e.Y)
- For nCount As Integer = 0 To cl_cGrabRects.Length - 1
- If cl_bActive = True Then cl_cGrabRects(nCount).Visible = False
- Next
- cl_OwnerForm.Refresh()
- ElseIf e.Button = Windows.Forms.MouseButtons.Right Then
- AddHandler cl_cmsLabel.Opening, AddressOf cmsLabel_Opening
- ContextMenuStrip = cl_cmsLabel
- End If
- End Sub
- Private Sub ControlMouseMove(ByVal sender As Object, ByVal e As MouseEventArgs) 'Handles Me.MouseMove
- If cl_bMoveControl = True Then
- cl_Control.Left = cl_Control.Left + e.X - cl_pLastMousePos.X
- cl_Control.Top = cl_Control.Top + e.Y - cl_pLastMousePos.Y
- cl_OwnerForm.Refresh()
- End If
- End Sub
- Private Sub ControlMouseUp(ByVal sender As Object, ByVal e As MouseEventArgs) Handles Me.MouseUp
- cl_bMoveControl = False
- For nCount As Integer = 0 To cl_cGrabRects.Length - 1
- If cl_bActive = True Then cl_cGrabRects(nCount).Visible = True
- Next
- cl_OwnerForm.Refresh()
- End Sub
- Private Sub cmsLabel_Opening(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs)
- cl_cmsLabel.Items.Clear()
- If cl_bActive = False Then
- cl_cmsLabel.Items.Add("Activate Control", Nothing, New System.EventHandler(AddressOf SelectedChildMenu_OnClick))
- Else
- cl_cmsLabel.Items.Add("Deactivate Control", Nothing, New System.EventHandler(AddressOf SelectedChildMenu_OnClick))
- End If
- RemoveHandler cl_cmsLabel.Opening, AddressOf cmsLabel_Opening
- e.Cancel = False
- End Sub
- Private Sub SelectedChildMenu_OnClick(ByVal sender As Object, ByVal e As System.EventArgs)
- If sender.ToString = "Activate Control" Then
- Activate()
- ElseIf sender.ToString = "Deactivate Control" Then
- Deactivate()
- End If
- End Sub
- Public Sub ControlPaint(ByVal sender As Object, ByVal e As PaintEventArgs)
- If cl_bInResizeMode = True Or cl_bMoveControl = True Then Exit Sub
- With e.Graphics
- 'Rahmen
- .DrawRectangle(Pens.Gray, New Rectangle( _
- cl_Control.Location.X - (cl_nGRS / 2), _
- cl_Control.Location.Y - (cl_nGRS / 2), _
- cl_Control.Width + cl_nGRS, _
- cl_Control.Height + cl_nGRS))
- 'Positionen für die Rects in der Reihenfolge:
- 'TopLeft, TopMiddle, TopRight, MiddleLeft, MiddleRight, BottomLeft,BottomMiddle,BottomRight
- Dim GrabRectPos() As Point = { _
- New Point(cl_Control.Location.X - cl_nGRS, cl_Control.Location.Y - cl_nGRS), _
- New Point(cl_Control.Location.X + (cl_Control.Width / 2) - (cl_nGRS / 2), cl_Control.Location.Y - cl_nGRS), _
- New Point(cl_Control.Location.X + cl_Control.Width, cl_Control.Location.Y - cl_nGRS), _
- New Point(cl_Control.Location.X - cl_nGRS, cl_Control.Location.Y + (cl_Control.Height / 2) - (cl_nGRS / 2)), _
- New Point(cl_Control.Location.X + (cl_Control.Width), cl_Control.Location.Y + (cl_Control.Height / 2) - (cl_nGRS / 2)), _
- New Point(cl_Control.Location.X - cl_nGRS, cl_Control.Location.Y + (cl_Control.Height)), _
- New Point(cl_Control.Location.X + (cl_Control.Width / 2) - (cl_nGRS / 2), cl_Control.Location.Y + (cl_Control.Height)), _
- New Point(cl_Control.Location.X + cl_Control.Width, cl_Control.Location.Y + (cl_Control.Height))}
- For nCount As Integer = 0 To cl_cGrabRects.Length - 1
- cl_cGrabRects(nCount).Location = GrabRectPos(nCount)
- cl_cGrabRects(nCount).Size = New Size(cl_nGRS, cl_nGRS)
- cl_cGrabRects(nCount).BackColor = Color.LightGray
- cl_cGrabRects(nCount).Parent = cl_OwnerForm
- Next
- End With
- End Sub
- Private Sub GrabRectPaint(ByVal sender As Object, ByVal e As PaintEventArgs)
- e.Graphics.DrawRectangle(Pens.Black, New Rectangle(0, 0, cl_nGRS - 1, cl_nGRS - 1))
- End Sub
- Private Sub GrabRectMove(ByVal sender As Object, ByVal e As System.EventArgs)
- Dim cCurrControl As Control = CType(sender, Control)
- Dim nIndex As Integer = GetCurrIndex(sender)
- End Sub
- Private Sub GrabRectMouseClick(ByVal sender As Object, ByVal e As MouseEventArgs)
- Dim cCurrControl As Control = CType(sender, Control)
- Dim nIndex As Integer = GetCurrIndex(sender)
- End Sub
- Private Sub GrabRectMouseMove(ByVal sender As Object, ByVal e As MouseEventArgs)
- Dim cCurrControl As Control = CType(sender, Control)
- Dim nIndex As Integer = GetCurrIndex(sender)
- Dim MousePos As Point
- Static cnRight As Integer
- Static cnBottom As Integer
- Select Case nIndex
- Case 0 : cCurrControl.Cursor = Cursors.SizeNWSE
- Case 1 : cCurrControl.Cursor = Cursors.SizeNS
- Case 2 : cCurrControl.Cursor = Cursors.SizeNESW
- Case 3 : cCurrControl.Cursor = Cursors.SizeWE
- Case 4 : cCurrControl.Cursor = Cursors.SizeWE
- Case 5 : cCurrControl.Cursor = Cursors.SizeNESW
- Case 6 : cCurrControl.Cursor = Cursors.SizeNS
- Case 7 : cCurrControl.Cursor = Cursors.SizeNWSE
- End Select
- If cl_bInResizeMode = True Then
- MousePos = cl_OwnerForm.PointToClient(Windows.Forms.Cursor.Position)
- cCurrControl.Left = cl_OwnerForm.PointToClient(Windows.Forms.Cursor.Position).X 'cCurrControl.Left + e.X
- cCurrControl.Top = cl_OwnerForm.PointToClient(Windows.Forms.Cursor.Position).Y 'cCurrControl.Top + e.Y
- Dim nTmpHeigth As Integer
- Dim nTmpWidth As Integer
- Dim nTmpDelta As Integer
- Select Case nIndex
- Case 0 'TopLeft GrabButton
- nTmpDelta = cl_Control.Top - cCurrControl.Top
- nTmpHeigth = cl_Control.Height + nTmpDelta
- nTmpDelta = cl_Control.Left - cCurrControl.Left
- nTmpWidth = cl_Control.Width + nTmpDelta
- If nTmpHeigth < cl_nMinHeigth Then Exit Select
- If nTmpWidth < cl_nMinWidth Then Exit Select
- cl_Control.Size = New Size(nTmpWidth, nTmpHeigth)
- cl_Control.Top = cCurrControl.Top
- cl_Control.Left = cCurrControl.Left
- Case 1 'TopMiddle GrabButton
- nTmpDelta = cl_Control.Top - cCurrControl.Top
- nTmpHeigth = cl_Control.Height + nTmpDelta
- If nTmpHeigth < cl_nMinHeigth Then Exit Select
- cl_Control.Height = nTmpHeigth
- cl_Control.Top = cCurrControl.Top
- Case 2 'TopRight GrabButton
- nTmpDelta = cl_Control.Top - cCurrControl.Top
- nTmpHeigth = cl_Control.Height + nTmpDelta
- nTmpWidth = cCurrControl.Left - cl_Control.Left
- If nTmpHeigth < cl_nMinHeigth Then Exit Select
- If nTmpWidth < cl_nMinWidth Then nTmpWidth = cl_nMinWidth
- cl_Control.Size = New Size(nTmpWidth, nTmpHeigth)
- cl_Control.Top = cCurrControl.Top
- Case 3 'MiddleLeft GrabButton
- nTmpDelta = cl_Control.Left - cCurrControl.Left
- nTmpWidth = cl_Control.Width + nTmpDelta
- If nTmpWidth < cl_nMinWidth Then Exit Select
- cl_Control.Width = nTmpWidth
- cl_Control.Left = cCurrControl.Left
- Case 4 'MiddleRight GrabButton
- nTmpWidth = cl_cGrabRects(4).Left - cl_Control.Left
- If nTmpWidth < cl_nMinWidth Then nTmpWidth = cl_nMinWidth
- cl_Control.Width = nTmpWidth
- Case 5 'BottomLeft GrabButton
- nTmpHeigth = cCurrControl.Top - cl_Control.Top
- nTmpDelta = cl_Control.Left - cCurrControl.Left
- nTmpWidth = cl_Control.Width + nTmpDelta
- If nTmpHeigth < cl_nMinHeigth Then nTmpHeigth = cl_nMinHeigth
- If nTmpWidth < cl_nMinWidth Then Exit Select
- cl_Control.Size = New Size(nTmpWidth, nTmpHeigth)
- cl_Control.Left = cCurrControl.Left
- Case 6 'BottomMiddle GrabButton
- nTmpHeigth = cCurrControl.Top - cl_Control.Top
- If nTmpHeigth < cl_nMinHeigth Then nTmpHeigth = cl_nMinHeigth
- cl_Control.Height = nTmpHeigth
- Case 7 'BottomcnRight GrabButton
- nTmpHeigth = cCurrControl.Top - cl_Control.Top
- nTmpWidth = cCurrControl.Left - cl_Control.Left
- If nTmpHeigth < cl_nMinHeigth Then nTmpHeigth = cl_nMinHeigth
- If nTmpWidth < cl_nMinWidth Then nTmpWidth = cl_nMinWidth
- cl_Control.Size = New Size(nTmpWidth, nTmpHeigth)
- End Select
- cl_OwnerForm.Refresh()
- Else
- cnRight = cl_Control.Right
- cnBottom = cl_Control.Bottom
- End If
- End Sub
- Private Sub GrabRectMouseDown(ByVal sender As Object, ByVal e As MouseEventArgs)
- cl_bInResizeMode = True
- For nCount As Integer = 0 To cl_cGrabRects.Length - 1
- cl_cGrabRects(nCount).Visible = False
- Next
- cl_OwnerForm.Refresh()
- End Sub
- Private Sub GrabRectMouseUp(ByVal sender As Object, ByVal e As MouseEventArgs)
- cl_bInResizeMode = False
- For nCount As Integer = 0 To cl_cGrabRects.Length - 1
- cl_cGrabRects(nCount).Visible = True
- Next
- cl_OwnerForm.Refresh()
- End Sub
- Private Function GetCurrIndex(ByVal sender As Object) As Integer
- Dim CurrControl As Control = CType(sender, Control)
- For nCount As Integer = 0 To cl_cGrabRects.Length
- If cl_cGrabRects(nCount) Is CurrControl Then
- Return nCount
- End If
- Next
- End Function
- End Class