运行时拉伸和移动控件的类。

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值