Public Class Resize
'移动了吗?
Private IsMoving As Boolean = False
'控件最后的宽
Private ctrlLastWidth As Integer = 0
'控件最后的高
Private ctrlLastHeight As Integer = 0
'控件原来的宽
Private ctrlWidth As Integer
'最后的左侧坐标
Private ctrlLastLeft As Integer
'最后的顶部坐标
Private ctrlLastTop As Integer
'控件原来的高
Private ctrlHeight As Integer
'控件的左侧坐标
Private ctrlLeft As Integer
'控件的顶部坐标
Private ctrlTop As Integer
'光标的左侧坐标
Private cursorL As Integer
'光标的顶部坐标
Private cursorT As Integer
'
Private Htap As Integer
Private Wtap As Integer
Private ctrlIsResizing As Boolean = False
'控件的大小矩形
Private ctrlRectangle As System.Drawing.Rectangle = New System.Drawing.Rectangle()
Private ctrl As Control '操作的控件
Private frm As Form '控件的父亲窗体
'构造函数
Public Sub New(ByVal c As Control, ByVal frm As Form)
ctrl = c
Me.frm = frm
'标题栏和横向滚动条以及边框的宽
Me.Htap = Me.frm.Height - Me.frm.ClientRectangle.Height
'纵向滚动条和边框的宽
Me.Wtap = Me.frm.Width - Me.frm.ClientRectangle.Width
AddHandler ctrl.MouseDown, AddressOf MouseDown
AddHandler ctrl.MouseMove, AddressOf MouseMove
AddHandler ctrl.MouseUp, AddressOf MouseUp
End Sub
'鼠标按下后的处理
Private Sub MouseDown(ByVal sender As Object, ByVal e As MouseEventArgs)
If frm Is Nothing Then
Return
End If
MessageBox.Show(e.Y.ToString)
MessageBox.Show((Me.ctrl.Height - 10).ToString)
MessageBox.Show(e.X.ToString)
MessageBox.Show((Me.ctrl.Width - 10).ToString)
'设置第一次有效单击的范围
If e.X < Me.ctrl.Width - 10 OrElse e.Y < Me.ctrl.Height - 10 Then
Me.IsMoving = True
'指定要绘制的虚线框的坐标(相对屏幕)
Me.ctrlLeft = Me.frm.DesktopLocation.X + Me.Wtap + Me.ctrl.Left
Me.ctrlTop = Me.frm.DesktopLocation.Y + Me.Htap + Me.ctrl.Top
'光标的位置
Me.cursorL = Cursor.Position.X
Me.cursorT = Cursor.Position.Y
'控件的原来宽与高
Me.ctrlWidth = Me.ctrl.Width
Me.ctrlHeight = Me.ctrl.Height
End If
ctrlRectangle.Location = New System.Drawing.Point(Me.ctrlLeft, Me.ctrlTop)
ctrlRectangle.Size = New System.Drawing.Size(ctrlWidth, ctrlHeight)
'绘制框架(矩形大小,背景色,边框风格(这里是虚线框))
ControlPaint.DrawReversibleFrame(ctrlRectangle, Color.Empty, System.Windows.Forms.FrameStyle.Dashed)
End Sub
Private Sub MouseMove(ByVal sender As Object, ByVal e As MouseEventArgs)
If frm Is Nothing Then
Return
End If
'如果是鼠标左键
If e.Button = MouseButtons.Left Then
If Me.IsMoving Then
'
If ctrlLastLeft = 0 Then
ctrlLastLeft = ctrlLeft
End If
'
If ctrlLastTop = 0 Then
ctrlLastTop = ctrlTop
End If
Dim locationX As Integer = (Cursor.Position.X - Me.cursorL + Me.frm.DesktopLocation.X + Me.Wtap + Me.ctrl.Location.X)
Dim locationY As Integer = (Cursor.Position.Y - Me.cursorT + Me.frm.DesktopLocation.Y + Me.Htap + Me.ctrl.Location.Y)
If locationX < Me.frm.DesktopLocation.X + Me.Wtap Then
locationX = Me.frm.DesktopLocation.X + Me.Wtap
End If
If locationY < Me.frm.DesktopLocation.Y + Me.Htap Then
locationY = Me.frm.DesktopLocation.Y + Me.Htap
End If
Me.ctrlLeft = locationX
Me.ctrlTop = locationY
ctrlRectangle.Location = New System.Drawing.Point(Me.ctrlLastLeft, Me.ctrlLastTop)
ctrlRectangle.Size = New System.Drawing.Size(ctrlWidth, ctrlHeight)
ControlPaint.DrawReversibleFrame(ctrlRectangle, Color.Empty, System.Windows.Forms.FrameStyle.Dashed)
ctrlLastLeft = ctrlLeft
ctrlLastTop = ctrlTop
ctrlRectangle.Location = New System.Drawing.Point(ctrlLeft, ctrlTop)
ctrlRectangle.Size = New System.Drawing.Size(ctrlWidth, ctrlHeight)
ControlPaint.DrawReversibleFrame(ctrlRectangle, Color.Empty, System.Windows.Forms.FrameStyle.Dashed)
Return
End If
Dim sizeageX As Integer = (Cursor.Position.X - Me.frm.DesktopLocation.X - Me.Wtap - Me.ctrl.Location.X)
Dim sizeageY As Integer = (Cursor.Position.Y - Me.frm.DesktopLocation.Y - Me.Htap - Me.ctrl.Location.Y)
If sizeageX < 2 Then
sizeageX = 1
End If
If sizeageY < 2 Then
sizeageY = 1
End If
ctrlWidth = sizeageX
ctrlHeight = sizeageY
If ctrlLastWidth = 0 Then
ctrlLastWidth = ctrlWidth
End If
If ctrlLastHeight = 0 Then
ctrlLastHeight = ctrlHeight
End If
If ctrlIsResizing Then
ctrlRectangle.Location = New System.Drawing.Point(Me.frm.DesktopLocation.X + Me.ctrl.Left + Me.Wtap, Me.frm.DesktopLocation.Y + Me.Htap + Me.ctrl.Top)
ctrlRectangle.Size = New System.Drawing.Size(ctrlLastWidth, ctrlLastHeight)
End If
ctrlIsResizing = True
ControlPaint.DrawReversibleFrame(ctrlRectangle, Color.Empty, System.Windows.Forms.FrameStyle.Dashed)
ctrlLastWidth = ctrlWidth
ctrlLastHeight = ctrlHeight
ctrlRectangle.Location = New System.Drawing.Point(Me.frm.DesktopLocation.X + Me.Wtap + Me.ctrl.Left, Me.frm.DesktopLocation.Y + Me.Htap + Me.ctrl.Top)
ctrlRectangle.Size = New System.Drawing.Size(ctrlWidth, ctrlHeight)
ControlPaint.DrawReversibleFrame(ctrlRectangle, Color.Empty, System.Windows.Forms.FrameStyle.Dashed)
End If
End Sub
Private Sub MouseUp(ByVal sender As Object, ByVal e As MouseEventArgs)
If frm Is Nothing Then
Return
End If
ctrlIsResizing = False
If Me.IsMoving Then
ctrlRectangle.Location = New System.Drawing.Point(Me.ctrlLeft, Me.ctrlTop)
ctrlRectangle.Size = New System.Drawing.Size(ctrlWidth, ctrlHeight)
ControlPaint.DrawReversibleFrame(ctrlRectangle, Color.Empty, System.Windows.Forms.FrameStyle.Dashed)
Me.ctrl.Left = Me.ctrlLeft - Me.frm.DesktopLocation.X - Me.Wtap
Me.ctrl.Top = Me.ctrlTop - Me.frm.DesktopLocation.Y - Me.Htap
Me.IsMoving = False
Me.ctrl.Refresh()
Return
End If
ctrlRectangle.Location = New System.Drawing.Point(Me.frm.DesktopLocation.X + Me.Wtap + Me.ctrl.Left, Me.frm.DesktopLocation.Y + Me.Htap + Me.ctrl.Top)
ctrlRectangle.Size = New System.Drawing.Size(ctrlWidth, ctrlHeight)
ControlPaint.DrawReversibleFrame(ctrlRectangle, Color.Empty, System.Windows.Forms.FrameStyle.Dashed)
Me.ctrl.Width = ctrlWidth
Me.ctrl.Height = ctrlHeight
Me.ctrl.Refresh()
End Sub
End Class