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
<span