VB.NET 控件移动

wangjiankai1109 2010-02-26 11:32:53
Public Class Form1
Dim x As Double
Dim y As Double
Private Sub Form1_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseClick
x = e.X
y = e.Y
Timer1.Enabled = True
End Sub

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
Button1.Left = x - (Button1.Width \ 2)
Button1.Top = y - (Button1.Height \ 2)
Timer1.Enabled = False
End Sub
现在控件可以移动到鼠标点击的位置,但是我想实现动画的那种效果,控件慢慢的移动到鼠标点击的位置,不要一下就移动过去,我要看移动的过程.
...全文
575 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
do_do_tony 2011-05-04
  • 打赏
  • 举报
回复
这个是正解,直接重写控件的这3个事件,MouseMove,MouseUp,MouseDown

[Quote=引用 14 楼 marcellen 的回复:]

举一个无边框窗体移动的例子
private Point mouseOffset; //坐标
private bool isMouseDown = false; //是否鼠标落下

public BaseForm()
{
InitializeComponent();
}
……
[/Quote]
Tosp2012 2011-04-29
  • 打赏
  • 举报
回复
 
Dim x1 As Double '記錄點1的座標
Dim y1 As Double

Dim x2 As Double '記錄點2的座標
Dim y2 As Double

Dim Counts As Double '循環的次數
Dim i As Integer

Private Sub Form1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseDown
x2 = e.X
y2 = e.Y
If x1 <> x2 Or y1 <> y2 Then
Counts = CInt(Math.Sqrt((x1 - x2) ^ 2 + (y1 - y2) ^ 2))
For i = 1 To Counts Step 1
If x1 < x2 Then
If x1 + i <= x2 Then
Button1.Left = x1 + i
End If
Else
If x1 - i >= x2 Then
Button1.Left = x1 - i
End If
End If
If y1 < y2 Then
If y1 + i <= y2 Then
Button1.Top = y1 + i
End If
Else
If y1 - i >= y2 Then
Button1.Top = y1 - i
End If
End If
Next
x1 = x2
y1 = y2
End If
End Sub

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
x1 = Button1.Left
y1 = Button1.Top
End Sub
Tosp2012 2011-04-29
  • 打赏
  • 举报
回复

Dim x1 As Double '記錄點1的座標
Dim y1 As Double

Dim x2 As Double '記錄點2的座標
Dim y2 As Double
Dim Counts As Double '循環的次數
Dim i As Integer

Private Sub Form1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseDown
x2 = e.X
y2 = e.Y
If x1 <> x2 And y1 <> y2 Then
Counts = CInt(Math.Sqrt((x1 - x2) ^ 2 + (y1 - y2) ^ 2))
For i = 1 To Counts
If x1 < x2 Then
If x1 + i <= x2 Then
Button1.Left = x1 + i
End If
Else
If x1 - i >= x2 Then
Button1.Left = x1 - i
End If
End If
If y1 < y2 Then
If y1 + i <= y2 Then
Button1.Top = y1 + i
End If
Else
If y1 - i >= y2 Then
Button1.Top = y1 - i
End If
End If
Next
x1 = x2
y1 = y2
End If
End Sub
hztltgg 2011-04-28
  • 打赏
  • 举报
回复

Public Class Form1

Dim x As Integer
Dim y As Integer

Private Sub Form1_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseClick

x = e.X - (Button1.Width \ 2)
y = e.Y - (Button1.Height \ 2)

Timer1.Enabled = True

End Sub

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick

Button1.Left = Button1.Left + (x - Button1.Left) \ 5
Button1.Top = Button1.Top + (y - Button1.Top) \ 5

End Sub

End Class
marcellen 2011-04-28
  • 打赏
  • 举报
回复
举一个无边框窗体移动的例子
private Point mouseOffset; //坐标
private bool isMouseDown = false; //是否鼠标落下

public BaseForm()
{
InitializeComponent();
}
//窗体移动事件
private void BaseForm_MouseMove(object sender, MouseEventArgs e)
{

if (isMouseDown)
{
Point mousePos = Control.MousePosition;
mousePos.Offset(mouseOffset.X, mouseOffset.Y);
Location = mousePos;
}
}
//鼠标放下事件
private void BaseForm_MouseUp(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
isMouseDown = false;
}
}
//鼠标按下的事件
private void BaseForm_MouseDown(object sender, MouseEventArgs e)
{
int xOffset;
int yOffset;

if (e.Button == MouseButtons.Left)
{
xOffset = -e.X - SystemInformation.FrameBorderSize.Width;
yOffset = -e.Y - SystemInformation.CaptionHeight -
SystemInformation.FrameBorderSize.Height;
mouseOffset = new Point(xOffset, yOffset);
isMouseDown = true;
}
}
神之泪花 2010-03-12
  • 打赏
  • 举报
回复
Mark..........

学习了
ouzui 2010-03-03
  • 打赏
  • 举报
回复
学习了!回复内容太短了!
清晨曦月 元老 2010-03-01
  • 打赏
  • 举报
回复
c.Left = l.X + i * xspeed
c.Top = l.Y + i * yspeed
不要用c.Left+=……去代替,因为Left是个整数,会导致移动速度的浮点被舍入,终点与目标点不吻合。
清晨曦月 元老 2010-03-01
  • 打赏
  • 举报
回复

''' <summary>
''' 将指定控件移动到指定位置
''' </summary>
''' <param name="c">控件</param>
''' <param name="p">目标位置(父容器坐标系)</param>
''' <param name="movestep">移动次数</param>
''' <param name="time">移动耗时</param>
''' <remarks></remarks>
Sub MoveTo(ByVal c As Control, ByVal p As Point, ByVal movestep As Integer, ByVal time As Integer)
Dim l As Point = c.Location
Dim xspeed As Single = (p.X - l.X) / movestep
Dim yspeed As Single = (p.Y - l.Y) / movestep
Dim steptime As Single = 1000 * time / movestep
For i As Integer = 1 To movestep
c.Left = l.X + i * xspeed
c.Top = l.Y + i * yspeed
Threading.Thread.Sleep(steptime)
My.Application.DoEvents()
Next
End Sub

测试代码


Private Sub Form1_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseClick
MoveTo(Button1, e.Location, 100, 2)
End Sub
wang_wei_jie 2010-03-01
  • 打赏
  • 举报
回复
Public Class Form1
Dim x, y As Double
Dim ay, ax As Double
Private Sub Form1_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseClick
x = e.X
y = e.Y
ax = e.X - btnMove.Location.X
ay = e.Y - btnMove.Location.Y
Timer1.Enabled = True
End Sub

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
Dim m As Double
m = Math.Sqrt(ax * ax + ay * ay) * (0.001 * Timer1.Interval)

If Math.Abs(x - btnMove.Left) < m Or Math.Abs(y - btnMove.Top) < m Then
btnMove.Left = x
btnMove.Top = y
Timer1.Enabled = False
Exit Sub
End If
If btnMove.Left = x And btnMove.Top = y Then
Timer1.Enabled = False
Exit Sub
End If

btnMove.Top += (m * ay) / Math.Sqrt(ax * ax + ay * ay)
btnMove.Left += (m * ax) / Math.Sqrt(ax * ax + ay * ay)
End Sub
End Class
xingyuebuyu 2010-03-01
  • 打赏
  • 举报
回复
引用 3 楼 zcsor 的回复:
    ''' <summary>
    ''' 将指定控件移动到指定位置
    ''' </summary>
    ''' <param name="c">控件 </param>
    ''' <param name="p">目标位置(父容器坐标系) </param>
    ''' <param name="movestep">移动次数 </param>
    ''' <param name="time">移动耗时 </param>
    ''' <remarks> </remarks>
    Sub MoveTo(ByVal c As Control, ByVal p As Point, ByVal movestep As Integer, ByVal time As Integer)
        Dim l As Point = c.Location
        Dim xspeed As Single = (p.X - l.X) / movestep
        Dim yspeed As Single = (p.Y - l.Y) / movestep
        Dim steptime As Single = 1000 * time / movestep
        For i As Integer = 1 To movestep
            c.Left = l.X + i * xspeed
            c.Top = l.Y + i * yspeed
            Threading.Thread.Sleep(steptime)
            My.Application.DoEvents()
        Next
    End Sub

测试代码


    Private Sub Form1_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseClick
        MoveTo(Button1, e.Location, 100, 2)
    End Sub


就是这个了。
shan1119 2010-03-01
  • 打赏
  • 举报
回复
引用 2 楼 wangjiankai1109 的回复:
先谢谢xingyuebuyu的回复 但是如果改变移动速度BUTTON 上下跳动 以前我写出过这个的 在timer计时器里用了两行代码 但是忘了算法  很模糊了 我写下
button1.left=button1.left+(x-(me.Width -button1.Width ))\2
button1.top=button1.top+(x-(me.Height -button1.Height ))\2
虽然写的不对 但是 就用了两行这样的代码 最后加上了
Timer1.Enabled = False
我会加分数 直到结贴 有多少分 送多少 送给回答正确的
Public Class Form1
'鼠标点击时的坐标
Dim x1 As Integer
Dim y1 As Integer

''鼠标点击时button的坐标
Dim x2 As Integer
Dim y2 As Integer
Private Sub Form1_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseClick
x1 = e.X
y1 = e.Y

x2 = Button1.Location.X
y2 = Button1.Location.Y
Timer1.Enabled = True
End Sub


Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
Button1.Left = IIf(x1 = Button1.Left, x2, x1)
Button1.Top = IIf(y1 = Button1.Top, y2, y1)

End Sub
End Class
shan1119 2010-03-01
  • 打赏
  • 举报
回复
Public Class Form1
'鼠标点击时的坐标
Dim x1 As Integer
Dim y1 As Integer

Private Sub Form1_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseClick
x1 = e.X
y1 = e.Y

Timer1.Enabled = True
End Sub


Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
Button1.Left += IIf(x1 = Button1.Left, 0, IIf(x1 > Button1.Left, 1, -1))
Button1.Top += IIf(y1 = Button1.Top, 0, IIf(y1 > Button1.Top, 1, -1))

End Sub
End Class
fina1982 2010-03-01
  • 打赏
  • 举报
回复
代码号多哦 眼花了 如果还不知道 我在贴
wangjiankai1109 2010-02-27
  • 打赏
  • 举报
回复
先谢谢xingyuebuyu的回复 但是如果改变移动速度BUTTON 上下跳动 以前我写出过这个的 在timer计时器里用了两行代码 但是忘了算法 很模糊了 我写下
button1.left=button1.left+(x-(me.Width -button1.Width ))\2
button1.top=button1.top+(x-(me.Height -button1.Height ))\2
虽然写的不对 但是 就用了两行这样的代码 最后加上了
Timer1.Enabled = False
我会加分数 直到结贴 有多少分 送多少 送给回答正确的
xingyuebuyu 2010-02-27
  • 打赏
  • 举报
回复
Public Class Form1
'鼠标点击时的坐标
Dim x1 As Integer
Dim y1 As Integer

''鼠标点击时button的坐标
Dim x2 As Integer
Dim y2 As Integer
Private Sub Form1_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseClick
x1 = e.X
y1 = e.Y

x2 = Button1.Location.X
y2 = Button1.Location.Y
Timer1.Enabled = True
End Sub


Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
If x1 < x2 Then
x2 -= 1
ElseIf x1 > x2 Then
x2 += 1
End If

If y1 < y2 Then
y2 -= 1
ElseIf y1 > y2 Then
y2 += 1
End If

Button1.Left = x2
Button1.Top = y2

If y2 = y1 AndAlso x2 = x1 Then
''到达目标地方,停止工作
Timer1.Enabled = False
End If
End Sub
End Class



改变x2,y2的变化规律可以得到不同的移动路线.

16,557

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧