界面:button,timer,picturebox
代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Drawing2D;
namespace PictureSport;
{
public partial class Test_Picture_Yuan : Form
 {
 public Test_Picture_Yuan()
 {
 InitializeComponent();
 }
private Graphics g;
 private Bitmap bmp;
 private Pen pen;
 private Point start;
 private Point stop;
 
 Bitmap image1;
 public Point P_lo;
 private void Test_Picture_Yuan_Load(object sender, EventArgs e)
 {
timer1.Enabled = false;
 bmp = new Bitmap(this.Width, this.Height);
 g = Graphics.FromImage(bmp);
 //g = this.CreateGraphics();
 pen = new Pen(Color.Red);
 
 }
 int i = 1;
 private void Test_Picture_Yuan_MouseClick(object sender, MouseEventArgs e)
 {
 if (i == 1)
 {
 start = e.Location;
 i++;
 }
 else
 {
 if (i == 2)
 {
 stop = e.Location;
 g.DrawLine(pen, start, stop);
 i++;
 this.BackgroundImage = bmp;
}
 }
 }
private void button1_Click(object sender, EventArgs e)
 {
 
 // g.DrawLine(pen, start, stop);
 //直线的坐标 横轴坐标不变, 纵轴坐标+ - 50
 //(pen,start,stop) (pen,new Point (start.X,start.Y-50),new Point (stop.X,stop.Y-50)) (pen, new Point(start.X, start.Y +50), new Point(stop.X, stop.Y +50))
 //圆的坐标 横轴坐标不变, 纵轴坐标+ - 50
 //(pen,start.X-15,start.Y-15,30,30); (pen, start.X - 15, start.Y - 65, 30, 30); (pen, start.X - 15, start.Y + 35, 30, 30);
 
 
 g.DrawLine(pen,new Point (start.X,start.Y-50),new Point (stop.X,stop.Y-50));
 g.DrawLine(pen, new Point(start.X, start.Y +50), new Point(stop.X, stop.Y +50));
timer1.Enabled = true;
 try
 {
 // Retrieve the image.
 image1 = new Bitmap(Application.StartupPath + @"/images/black.png", true);
int x, y;
// Loop through the images pixels to reset color.
 for (x = 0; x < image1.Width; x++)
 {
 for (y = 0; y < image1.Height; y++)
 {
 Color pixelColor = image1.GetPixel(x, y);
 Color newColor = Color.FromArgb(pixelColor.B, 0, 0);
 image1.SetPixel(x, y, newColor);
 }
 }
// Set the PictureBox to display the image.
 pictureBox1.Image = image1;
}
 catch (ArgumentException)
 {
 MessageBox.Show("There was an error." +
 "Check the path to the image file.");
 }
 this.BackgroundImage = null;
 this.BackgroundImage = bmp;
}
private void timer1_Tick(object sender, EventArgs e)
 {
 P_lo = pictureBox1.Location;
 P_lo = new Point(start.X, start.Y);
 P_lo.X ++;
 P_lo.Y ++;
 pictureBox1.Location = P_lo;
 }
 }
}
pictureBox1.Location = new Point(pictureBox1.Location.X + 1, pictureBox1.Location.Y + 1)
你说的方案的确是改变picturebox的位置了,但是图片的起始位置定位不到第一条直线的起始位置了。
@随风起舞: 你在load事件中加上这句话
pictureBox1.Location = new Point(start.X, start.Y);
@刘宏玺: 试过了,没有效果,图片的起始位置还是定位不到第一条直线的起始位置。
@随风起舞: 在你改变start的地方加上
pictureBox1.Location = new Point(start.X, start.Y);
@刘宏玺: 图片定位到了直线的起始位置,又不能运动了
@随风起舞: 现在我修改了一下代码,可以运动了。
@刘宏玺: 但是不是沿着直线运动的,求教怎么更改代码,追加20园豆
@随风起舞:
float yAdd = (start.X - stop.X) / (start.Y - stop.Y)
pictureBox1.Location = new Point(pictureBox1.Location.X + 1, pictureBox1.Location.Y + yAdd );
@刘宏玺: 我不知道你后来说的两行代码应该写在哪里
@随风起舞: 就写在timer的事件里面
那两句代码有点问题,忘记判断x的正负了,改成这样
float xAdd = start.X > stop.X ? -1 : 1;
float yAdd = (start.X - stop.X) / (start.Y - stop.Y) ;
pictureBox1.Location = new Point(pictureBox1.Location.X + xAdd , pictureBox1.Location.Y + yAdd );
@刘宏玺: 
@随风起舞: 我记得有个类叫PointF
float xAdd = start.X > stop.X ? -1 : 1;
float yAdd = (start.X - stop.X) / (start.Y - stop.Y) ;
pictureBox1.Location = new PointF(pictureBox1.Location.X + xAdd , pictureBox1.Location.Y + yAdd );
你先试试,如果不行就转换成int类型吧,不过这样也不会按照直线运动
int xAdd = start.X > stop.X ? -1 : 1;
int yAdd = (start.X - stop.X) / (start.Y - stop.Y) ;
pictureBox1.Location = new Point(pictureBox1.Location.X + xAdd , pictureBox1.Location.Y + yAdd );
@刘宏玺: 还是存在转换问题啊,结果就是不能按照直线运动?怎么办?
@随风起舞:
如果走直线,那就需要使用PointF
你这样改造,代码还是写在timer里面
int xAdd = start.X > stop.X ? -1 : 1;
float yAdd = (start.X - stop.X) / (start.Y - stop.Y) ;
if(pictureBox1.Tag == null)
{
pictureBox1.Tag = (float)pictureBox1.Location.Y;
}
pictureBox1.Tag = ((float)pictureBox1.Tag) + yAdd;
pictureBox1.Location = new Point(pictureBox1.Location.X + xAdd , (int)pictureBox1.Tag);
@刘宏玺: 

@随风起舞:
如果直接报错就这样改
pictureBox1.Location = new Point(pictureBox1.Location.X + xAdd , (int)((float)pictureBox1.Tag));
如果是可以执行,但是过会才报错,那就在网面加一个try catch
加了try catch 后,图片不能沿着直线动
@随风起舞: 那看来不能把中间值放在tag里面
这样弄
float pictureBox1_Y = -1;//这句话写在timer外面,就是全局变量
int xAdd = start.X > stop.X ? -1 : 1;
float yAdd = (start.X - stop.X) / (start.Y - stop.Y) ;
if(pictureBox1_Y = -1)
{
pictureBox1_Y = (float)pictureBox1.Location.Y;
}
pictureBox1_Y += yAdd;
pictureBox1.Location = new Point(pictureBox1.Location.X + xAdd , (int)pictureBox1_Y);
@刘宏玺: 还是不能沿着直线运动,而且鼠标点击后形成的直线与显示出来的直线长度不一致
@随风起舞: 你把项目代码发出来吧,我帮你调试一下,不然我也不知道你说的效果是啥样的
@刘宏玺: 好的。
@刘宏玺:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Drawing2D;
namespace PictureSport
{
 public partial class Test_Picture_Yuan : Form
 {
 public Test_Picture_Yuan()
 {
 InitializeComponent();
 }
private Graphics g;
 private Bitmap bmp;
 private Pen pen;
 private Point start;
 private Point stop;
 
 Bitmap image1;
 
 public Point P_lo;
 private void Test_Picture_Yuan_Load(object sender, EventArgs e)
 {
timer1.Enabled = false;
 bmp = new Bitmap(this.Width, this.Height);
 g = Graphics.FromImage(bmp);
 //g = this.CreateGraphics();
 pen = new Pen(Color.Red);
 
 }
 int i = 1;
 private void Test_Picture_Yuan_MouseClick(object sender, MouseEventArgs e)
 {
 if (i == 1)
 {
 start = e.Location;
 i++;
 }
 else
 {
 if (i == 2)
 {
 stop = e.Location;
 g.DrawLine(pen, start, stop);
 i++;
 this.BackgroundImage = bmp;
 pictureBox1.Location = new Point(start.X, start.Y);
 }
 }
 }
private void button1_Click(object sender, EventArgs e)
 {
 
 // g.DrawLine(pen, start, stop);
 //直线的坐标 横轴坐标不变, 纵轴坐标+ - 50
 //(pen,start,stop) (pen,new Point (start.X,start.Y-50),new Point (stop.X,stop.Y-50)) (pen, new Point(start.X, start.Y +50), new Point(stop.X, stop.Y +50))
 //圆的坐标 横轴坐标不变, 纵轴坐标+ - 50
 //(pen,start.X-15,start.Y-15,30,30); (pen, start.X - 15, start.Y - 65, 30, 30); (pen, start.X - 15, start.Y + 35, 30, 30);
 
 
 g.DrawLine(pen,new Point (start.X,start.Y-50),new Point (stop.X,stop.Y-50));
 g.DrawLine(pen, new Point(start.X, start.Y +50), new Point(stop.X, stop.Y +50));
timer1.Enabled = true;
 try
 {
 // Retrieve the image.
 // image1 = new Bitmap(@"C:/Users/Administrator/Desktop/black.png", true);
 image1 = new Bitmap(Application.StartupPath + @"/images/black.png", true);
int x, y;
// Loop through the images pixels to reset color.
 for (x = 0; x < image1.Width; x++)
 {
 for (y = 0; y < image1.Height; y++)
 {
 Color pixelColor = image1.GetPixel(x, y);
 Color newColor = Color.FromArgb(pixelColor.B, 0, 0);
 image1.SetPixel(x, y, newColor);
 }
 }
// Set the PictureBox to display the image.
 pictureBox1.Image = image1;
}
 catch (ArgumentException)
 {
 MessageBox.Show("There was an error." +
 "Check the path to the image file.");
 }
 this.BackgroundImage = null;
 this.BackgroundImage = bmp;
}
 public float pictureBox1_Y = -1;
 private void timer1_Tick(object sender, EventArgs e)
 {
 //
 //P_lo = new Point(pictureBox1.Location.X + 1, pictureBox1.Location.Y + 1);
 // pictureBox1.Location = P_lo;
 // pictureBox1.Location = new Point(start.X, start.Y);
 // float xAdd = start.X > stop.X ? -1 : 1;
 //float yAdd = (start.X - stop.X) / (start.Y - stop.Y);
 
 //PointF pf=(PointF)(pictureBox1.Location.X + xAdd);
 // pictureBox1.Location = new Point(, pictureBox1.Location.Y + yAdd);
// float xAdd = start.X > stop.X ? -1 : 1;
// float yAdd = (start.X - stop.X) / (start.Y - stop.Y);
// //pictureBox1.Location = new PointF(pictureBox1.Location.X + xAdd, pictureBox1.Location.Y + yAdd);
 // Point p = new Point(50, 50);
 // PointF pf = (PointF)p;
 //try
 //{
 // int xAdd = start.X > stop.X ? -1 : 1;
 // float yAdd = (start.X - stop.X) / (start.Y - stop.Y);
 // if (pictureBox1.Tag == null)
 // {
 // pictureBox1.Tag = (float)pictureBox1.Location.Y;
 // }
 // pictureBox1.Tag = ((float)pictureBox1.Tag) + yAdd;
 // pictureBox1.Location = new Point(pictureBox1.Location.X + xAdd, (int)(float)pictureBox1.Tag);
 //}
 
 //catch (ArgumentException)
 //{
 // MessageBox.Show("111");
 //}
 int xAdd = start.X > stop.X ? -1 : 1;
float yAdd = (start.X - stop.X) / (start.Y - stop.Y);
if (pictureBox1_Y ==-1)
 {
pictureBox1_Y = (float)pictureBox1.Location.Y;
}
pictureBox1_Y += yAdd;
pictureBox1.Location = new Point(pictureBox1.Location.X + xAdd, (int)pictureBox1_Y);
 
 }
 }
}
@随风起舞: 改成这样
 public float pictureBox1_X = -1;
 public float pictureBox1_Y = -1;
 private void timer1_Tick(object sender, EventArgs e)
 {
 int xAdd = start.X > stop.X ? -1 : 1;
 float yAdd = (float)(stop.Y - start.Y) / (float)(stop.X - start.X);
 yAdd *= xAdd;
if (pictureBox1_X == -1)
 {
 pictureBox1_X = (float)pictureBox1.Location.X;
 }
 if (pictureBox1_Y == -1)
 {
 pictureBox1_Y = (float)pictureBox1.Location.Y;
 }
 pictureBox1_X += xAdd;
 pictureBox1_Y += yAdd;
 pictureBox1.Location = new Point((int)pictureBox1_X, (int)pictureBox1_Y);
}
@刘宏玺: 圆的确是沿着直线动的,请问当点移动到直线终点时如何使圆停止运动?
@随风起舞: 加判断呗!
private void timer1_Tick(object sender, EventArgs e)
{
if(pictureBox1_X == stop.X)
{
timer1.Enabled = false;
return;
}
...
@刘宏玺: 问题已经解决了,只是个别代码不晓得啥意思,要仔细琢磨一下。谢谢啦!等下就结贴,然后把答应送你的20园豆给你
@随风起舞: 剩下的豆你留着吧,这个只是象征,没有什么用的,我也不缺豆!
@刘宏玺: 额,我还没找到怎么赠送别人园豆!那谢谢啦!请问你收徒么?
@随风起舞: 有问题你就问呗,我有时间的话都会帮你解决的!
@刘宏玺: 好啊!那我还有个问题,在博问里,等下发链接,求解决!
@刘宏玺: 问题链接:http://q.cnblogs.com/q/81393/