电脑故障

位置:IT落伍者 >> 电脑故障 >> 浏览文章

编程必学:控件的拖动和缩放技术全解


发布日期:2019/12/24
 

光标的指示

当光标移动到要拖动或缩放的控件上时应显示相应的动作箭头定义一个枚举的变量来标识对应的状态

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改变光标

上一篇:颜色#RRGGBB与string 相互转换

下一篇:VC运行程序文件