有时,如果我按住左箭头键,则pictureBox将停止绘制我的角色的坐标。一个典型的例子是用红色环绕的黄点。通过按住左箭头键,pictureBox没有经常绘制我的角色位置,直到我按下另一个键/放开箭头键,然后图片框再次开始更新(因为你可以看到环绕紫色)。
此外,我遇到的另一个错误是它应该只画一个黄点和一个蓝色的漩涡'每个地点;虽然它正在绘制多个(如你所见)。
以下代码是我用来复制图片结果的代码。
private Thread grabValues;
private Bitmap bm;
private Image image1;
private Image image2;
private Graphics gM;
void RGraphics()
{
image1 = Properties.Resources.image1;
image2 = Properties.Resources.image2;
}
void RInvokeMe()
{
while (true)
{
if (this.InvokeRequired)
{
this.Invoke(new UpdateControlsDelegate(MUpdate));
this.Invoke(new UpdateControlsDelegate(CUpdate));
}
else
{
MUpdate();
CUpdate();
}
}
}
void MUpdate()
{
pictureBox1.ImageLocation = "http://urlexample/r/we.png";
}
void CUpdate()
{
bm = new Bitmap(pictureBox1.Image);
gM = Graphics.FromImage(bm);
gM.CompositingMode = CompositingMode.SourceOver;
MDraw.DrawBlueDot(gM, image2, X2, Y2);
MDraw.DrawYellowDot(gM, image1, X1, Y1);
pictureBox1.Image = bm;
pictureBox1.Refresh();
}
public Form2()
{
InitializeComponent();
RGraphics();
grabValues = new Thread(new ThreadStart(RInvokeMe));
grabValues.IsBackground = true;
grabValues.Start();
}
答案 0 :(得分:3)
基本上你开始一个线程(grabValues
,由函数RInvokeMe
实现),它在你的表单方法MUpdate
和CUpdate
上无休止地调用。当您调用方法时,您在Windows消息队列上发布消息,以便让窗口执行给定的函数。但是,当您按下某个键时,即使 keypress 消息也会发布到Windows队列中......但由于您已在表单上执行了大量的调用请求,因此可能无法快速提供。
您可以尝试在Thread.Sleep(500);
循环中引入一个小延迟(RInvokeMe
),看看问题是否存在......
然后如果是这样,我会考虑完全重新设计你的项目以避免这种情况(如果你的角色只在按键时移动,为什么你只是在按键时不重绘场景但是你做了它不断?)