一光标的指示 当光标移动到要拖动或缩放的控件上时应显示相应的动作箭头定义一个枚举的变量来标识对应的状态 Enum EnumMousePointPosition MouseSizeNone = 无 MouseSizeRight = 拉伸右边框 MouseSizeLeft = 拉伸左边框 MouseSizeBottom = 拉伸下边框 MouseSizeTop = 拉伸上边框 MouseSizeTopLeft = 拉伸左上角 MouseSizeTopRight = 拉伸右上角 MouseSizeBottomLeft = 拉伸左下角 MouseSizeBottomRight = 拉伸右下角 MouseDrag = 鼠标拖动 End Enum Dim m_MousePointPosition As EnumMousePointPosition 在MouseMove事件中读取进入控件的光标位置用下面函数判断光标的状态 m_MousePointPosition = MousePointPosition(senderSize e) 按对应的状态显示光标形状 Select Case m_MousePointPosition Case EnumMousePointPositionMouseSizeNone MeCursor = CursorsArrow 箭头 Case EnumMousePointPositionMouseDrag MeCursor = CursorsSizeAll 四方向 Case EnumMousePointPositionMouseSizeBottom MeCursor = CursorsSizeNS南北 Case EnumMousePointPositionMouseSizeTop MeCursor = CursorsSizeNS南北 Case EnumMousePointPositionMouseSizeLeft MeCursor = CursorsSizeWE东西 Case EnumMousePointPositionMouseSizeRight MeCursor = CursorsSizeWE东西 Case EnumMousePointPositionMouseSizeBottomLeft MeCursor = CursorsSizeNESW东北到南西 Case EnumMousePointPositionMouseSizeBottomRight MeCursor = CursorsSizeNWSE东南到西北 Case EnumMousePointPositionMouseSizeTopLeft MeCursor = CursorsSizeNWSE东南到西北 Case EnumMousePointPositionMouseSizeTopRight MeCursor = CursorsSizeNESW东北到南西 End Select 如果光标离开控件MouseMove事件将不响应因此用需用MouseLeave事件来接力完成光标状态的标识和显示 Private Sub MyMouseLeave(ByVal sender As Object ByVal e As SystemEventArgs) m_MousePointPosition = EnumMousePointPositionMouseSizeNone MeCursor = CursorsArrow End Sub 二拖动 拖动的原理是移动控件的Location到当前光标的位置并保持控件的高度和宽度不变如果记录起始光标点为p当前光标点为e那么x方向的移动距离是eX pXx方向的移动距离是eY pY 在鼠标按下时即是拖动的开始在MouseDown事件中记录光标开始拖动点 p = New Point(eX eY) 在MouseMove事件检测是否持续按着鼠标左键如果是则更新控件的起点位置 If eButton = MouseButtonsLeft Then senderLocation = New Point(senderLeft + eX pX senderTop + eY pY) End If 三缩放 缩放的原理和拖动类似如果缩放底边就是根据光标的移动改变控件的高度而不改变控件的起点位置 同样如果缩放底边在鼠标按下时即是缩放的开始在MouseDown事件中记录光标开始拖动点 p = New Point(eX eY) 在MouseMove事件检测是否持续按着鼠标左键如果是则更新控件的高度 If eButton = MouseButtonsLeft Then senderSize = New Size(senderWidth senderHeight + eY pY) p = New Point(eX eY) 记录光标拖动的当前点 End If 这里和拖动有些区别就是高度的变化会导致光标位置数值的变化因此需重新用p定位光标起始点的位置所有涉及控件底边和右边的缩放都要这样处理而左边和顶边则不用 其它所有各方向的拖动都可以类推 四委派 所有的操作一共总结为三个函数MyMouseDownMyMouseMoveMyMouseLeave 动态创建控件后需委派相应的事件到这三个函数如果创建一个按钮 Dim Button As New Button ControlsAdd(Button) AddHandler ButtonMouseDown AddressOf MyMouseDown AddHandler ButtonMouseMove AddressOf MyMouseMove AddHandler ButtonMouseLeave AddressOf MyMouseLeave 五源码 建立一个窗体放置一个按钮点击该按钮创建动态建立一个可以拖动和缩放的按钮全部源码如下 Public Class Form Inherits SystemWindowsFormsForm Enum EnumMousePointPosition MouseSizeNone = 无 MouseSizeRight = 拉伸右边框 MouseSizeLeft = 拉伸左边框 MouseSizeBottom = 拉伸下边框 MouseSizeTop = 拉伸上边框 MouseSizeTopLeft = 拉伸左上角 MouseSizeTopRight = 拉伸右上角 MouseSizeBottomLeft = 拉伸左下角 MouseSizeBottomRight = 拉伸右下角 MouseDrag = 鼠标拖动 End Enum Dim m_MousePointPosition As EnumMousePointPosition Dim p p As Point Private Sub MyMouseDown(ByVal sender As Object ByVal e As SystemWindowsFormsMouseEventArgs) p = New Point(eX eY) 记录光标开始拖动点 p = New Point(eX eY) End Sub Private Sub MyMouseLeave(ByVal sender As Object ByVal e As SystemEventArgs) m_MousePointPosition = EnumMousePointPositionMouseSizeNone MeCursor = CursorsArrow End Sub Private Sub MyMouseMove(ByVal sender As Object ByVal e As SystemWindowsFormsMouseEventArgs) If eButton = MouseButtonsLeft Then Select Case m_MousePointPosition Case EnumMousePointPositionMouseDrag senderLocation = New Point(senderLeft + eX pX senderTop + eY pY) Case EnumMousePointPositionMouseSizeBottom senderSize = New Size(senderWidth senderHeight + eY pY) p = New Point(eX eY) 记录光标拖动的当前点 Case EnumMousePointPositionMouseSizeBottomRight senderSize = New Size(senderWidth + eX pX senderHeight + eY pY) p = New Point(eX eY) Case EnumMousePointPositionMouseSizeRight senderSize = New Size(senderWidth + eX pX senderHeight) p = New Point(eX eY) Case EnumMousePointPositionMouseSizeTop senderLocation = New Point(senderLeft senderTop + (eY pY)) senderSize = New Size(senderWidth senderHeight (eY pY)) Case EnumMousePointPositionMouseSizeLeft senderLocation = New Point(senderLeft + eX pX senderTop) senderSize = New Size(senderWidth (eX pX) senderHeight) Case EnumMousePointPositionMouseSizeBottomLeft senderLocation = New Point(senderLeft + eX pX senderTop) senderSize = New Size(senderWidth (eX pX) senderHeight + eY pY) p = New Point(eX eY) Case EnumMousePointPositionMouseSizeTopRight senderLocation = New Point(senderLeft senderTop + (eY pY)) senderSize = New Size(senderWidth + (eX pX) senderHeight (eY pY)) p = New Point(eX eY) Case EnumMousePointPositionMouseSizeTopLeft senderLocation = New Point(senderLeft + eX pX senderTop + (eY pY)) senderSize = New Size(senderWidth (eX pX) senderHeight (eY pY)) End Select Else m_MousePointPosition = MousePointPosition(senderSize e)判断光标的位置状态 Select Case m_MousePointPosition改变光标 |