我在做一个模拟交通控制的小程序,
里面会用矩形模拟车辆的移动,大家能给一个矩形移动的小例子么?C# winform, 谢谢
里面会用矩形模拟车辆的移动,大家能给一个矩形移动的小例子么?C# winform, 谢谢
解决方案 »
- 问题很SB,我机器上已经装了VS03和05,我现在要装VS08,可以么?
- 如何在各个form中使用同个数组啊?(急)
- 用File.Copy覆盖原来存在的文件,文件名不就,文件的创建时间会不会改变啊?
- 有誰做過帶寬管理(Bandwidth manager )的,請介紹一下實現思路.
- 跪求:因为书写格式不规范,2个月的心血被列为垃圾代码,请问哪位绝顶高人,有没有好工具可以让代码自动规范呀???
- 原来好好的程序现在连不上数据库,错误信息如下:
- sql2008远程链接安全性如何
- 想问下像skype等的通信软件是怎么计时的?
- 多个进程同时读写一个ini文件,谁有用mutex同步的例子。
- 集合属性该怎么写?
- 有NC601A串口服务器C#编程的兄弟们进来,协助一下我!!
- 如何继承DataGridViewRowCollection?
绘制事件处理方法中在指定位置绘制
{
Graphics graph_car = this.CreateGraphics();
this.Show(); Pen erasePen = new Pen(BackColor, 3);
Pen bluePen = new Pen(Color.Blue, 3);
Rectangle rec = new Rectangle(5, 5, 80, 80); for (int i = -100; i < 1000; ++i)
{
graph_car.DrawRectangle(erasePen, rec); Point p = new Point(i, i);
rec.Location.Offset(p); graph_car.DrawRectangle(bluePen, rec);
}
}
{
Graphics graph_car = this.CreateGraphics();
this.Show(); Pen erasePen = new Pen(BackColor, 3);
Pen bluePen = new Pen(Color.Blue, 3);
Rectangle rec = new Rectangle(5, 5, 80, 80); for (int i = -100; i < 1000; ++i)
{
graph_car.DrawRectangle(erasePen, rec); Point p = new Point(i, i);
//将下面这句改掉,是移动矩形,不是矩形左上角的点的移动
//rec.Location.Offset(p);
rec.Offset(p); graph_car.DrawRectangle(bluePen, rec);
}
}
Duping9626, 那如果不采用背景色覆盖原来的位置,还有别的办法么?
private void button1_Click(object sender, EventArgs e)
{
timer1.Enabled = !timer1.Enabled;
}Point carPoint = new Point(0, 0);
private void timer1_Tick(object sender, EventArgs e)
{
Graphics graph_car = CreateGraphics();
graph_car.DrawRectangle(new Pen(BackColor, 3),
new Rectangle(carPoint.X, carPoint.Y, 80, 80));
carPoint.Offset(2, 2);
graph_car.DrawRectangle(new Pen(Color.Blue, 3),
new Rectangle(carPoint.X, carPoint.Y, 80, 80));
graph_car.Dispose();
}参考我写的方块绘制速度还可以。
什么意思
直接移动就是呀 public partial class Form3 : Form
{
Rectangle rec = new Rectangle(5, 5, 80, 80);
private int i = 0; public Form3()
{
InitializeComponent();
} private void button1_Click(object sender, EventArgs e)
{
Graphics graph_car = this.CreateGraphics(); Pen bluePen = new Pen(Color.Blue, 3);
rec.Offset(i, i);
graph_car.DrawRectangle(bluePen,rec);
i+=10;
}
}
{
Rectangle rec = new Rectangle(5, 5, 80, 80);
private int i = 0; public Form3()
{
InitializeComponent();
} private void button1_Click(object sender, EventArgs e)
{
Graphics graph_car = this.CreateGraphics();
//加重绘就行了
this.Refresh();
Pen bluePen = new Pen(Color.Blue, 3);
rec.Offset(i, i);
graph_car.DrawRectangle(bluePen,rec);
i+=10;
}
}
Button的Click事件里还是启用Timer
Timer的Tick事件里修改pt的值,再this.Invalidate();
加一个Form的Paint事件处理方法,在此方法中完成绘制,这里只需要绘制,不需要擦除
Graphics对象可以从事件参数中获得,不需要再创建。
那不同速度的多个矩形该怎么做,设置多个timer么?
你的意思是zswang的code里,每次都新创建了一个Graphics实例,对么?那么这个graph_car的初始化写在那个位置?以及作为事件参数,如何传递?对不起第一次用C#的绘图功能,所以问的问题比较浅。
class RectList
{
private ArrayList list;
pubic RectList()
{
list=new ArrayList();
} public void Add(Rectangle rect,int v)
{
Rect r=new Rect();
r.Rectangle=rect;
r.V=v;
list.Add(r);
} public Rectangle GetRect(int index)
{
Rect r=list[index] as Rect;
if(r==null) return null;
return r.Rectangle;
} public int GetV(int index);
{
Rect r=list[index] as Rect;
if(r==null) return -1;
return r.V;
} public void SetV(int index,int v)
{
...
}
class Rect
{
private Rectangle rc;
private int v; public Rectangle Rectangle
{
get
{
return rc;
}
set
{
rc=value;
}
} public int V
{
get
{
return v;
}
set
{
v=value;
}
} }
}
至于矩形的绘制位置,另外在Form的定义中加上一个Point,在Timer的Tick事件中更改它的值,在Form的Paint事件中根据它的值来绘制
这个其实与C#没有太大关系,Windows本身的机制
但是好像在一个timer中绘制和更新的速度是相同的,
在你写的类里,比如,我创建了两个rect的实例,r1.V = 1; r2.V = 5;
那么这个速度的控制,是在哪儿进行的呢?
用C#实现.
楼上的方法大都用Graph draw 来完成, 这样感觉不太好控制.如车辆的速度,轨迹等.而且车辆只是个矩形色块, 也不好看.
可采用picturebox来放车辆的图片.然后移动 picturebox 参考(http://topic.csdn.net/u/20080318/10/308b6685-1bc9-4f38-a704-41ab6277efe3.html)
public partial class Form3 : Form
{
Rectangle rec = new Rectangle(5, 5, 80, 80);
private int i = 0; public Form3()
{
InitializeComponent();
} private void button1_Click(object sender, EventArgs e)
{
Graphics graph_car = this.CreateGraphics();
this.Refresh();
Pen bluePen = new Pen(Color.Blue, 3);
rec.Offset(i, i);
graph_car.DrawRectangle(bluePen,rec);
i+=10;
}
}
汽车实现IShape接口,实现Paint方法,Paint中按这些属性进行绘制
一个List<IShape>存所有的形状
窗体的Paint中遍历列表中的所有IShape,并按照Level画到Bitmap上,然后一次性将Bitmap画到窗体上。
然后用Timer改变这些Shape的属性,刷新窗体
1. 如何更改tick事件发生的频率?2. 在同一个timer里面呢,如何使得不同的汽车表现出不同的移动速度呢?
有没有可能,每一个矩形分配一个对应速率的timer, 当这个矩形消亡时,控制它重绘的timer也一起消失?
Timer不会自动消亡,需要Dispose手动销毁
这个Timer有一个Tag属性,可以用来保存与之相联系的矩形及移动速度
当一个矩形应该消失在窗体之外的时候,你可以:更改其大小、位置、速度,再使之重新出现,就如一个新矩形,也可以创建一个新矩形,指定速度之后,赋给刚才消失的那个矩形使用的Timer的Tag。
{
Graphics _g = e.Graphics;
foreach(Rectangle rect in lstRectangle)
{
_g.FillRectangle(new Pen(Red), rect);
}
}
Timer_OnTick()
{
Invalidate();
}