public class TankClient : Form
{
int xPos = 30;
int yPos = 30;
public static void Main()
{
TankClient tc = new TankClient();
tc.LaunchForm();
}
protected void LaunchForm()
{
this.Size = new Size(800, 600);
Thread t = new Thread(new ThreadStart(Run));
t.Start();
this.ShowDialog();
}
protected override void OnPaint(PaintEventArgs e)
{
Graphics g = e.Graphics;
SolidBrush sb=new SolidBrush(Color.Red);
g.FillEllipse(sb,xPos, yPos,50,50);
}
private void Run()
{
while (true)
{
yPos += 5;
Thread.Sleep(50);
//怎么重画?
}
}
}我想复习一下C#,现在想实现的是:在窗体上画个圆,每隔一段时间改变这个圆的位置.
加这个 Refresh();
void invokeThread()
{
System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
sw.Reset();
sw.Start();
if (this.InvokeRequired)
{
this.Invoke(new dTest(CreateTreeView));
}
else
{
CreateTreeView();//方法名
}
sw.Stop();
}
{
int xPos = 30;
int yPos = 30; //线程定义
Thread t = null; public Form1()
{
InitializeComponent();
} protected override void OnPaint(PaintEventArgs e)
{
Graphics g = e.Graphics;
SolidBrush sb = new SolidBrush(Color.Red);
g.FillEllipse(sb, xPos, yPos, 50, 50);
} private void Run()
{
while (true)
{
yPos += 5;
Thread.Sleep(50);
//怎么重画?
this.Refresh();
}
} //重绘代理
private delegate void RefreshDele();
//重载一下重绘方法
public override void Refresh()
{
if (!this.IsDisposed && this.InvokeRequired)
{ this.Invoke(new RefreshDele(Refresh));
}
else
{
base.Refresh();
}
} private void Form1_Load(object sender, EventArgs e)
{
//启动线程
this.Size = new Size(800, 600);
t = new Thread(new ThreadStart(Run));
t.Start();
} private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
//关闭线程
if (t.ThreadState != ThreadState.Stopped)
{
t.Abort();
}
} }
{
ISynchronizeInvoke synchronizer = del.Target as ISynchronizeInvoke;
if (synchronizer != null)//Requires thread affinity
{
if (synchronizer.InvokeRequired)
{
synchronizer.Invoke(del, args);
return;
}
}
//Not requiring thread afinity or invoke is not required
del.DynamicInvoke(args);
}
private delegate void RefreshDele();
//重载一下重绘方法
public override void Refresh()
{
if (!this.IsDisposed && this.InvokeRequired)
{
//调用反射方法
this.Invoke(new RefreshDele(Refresh));
}
else
{
base.Refresh();
}
}
PS:这么做的道理也很好理解,举个例子讲:假设你是研发部的小喽罗,如果市场部经理看你不爽,他不能直接训你,他要把情况反映到你们研发部经理那,让你们研发部的经理训你,^_^