【发布时间】:2017-10-18 05:39:59
【问题描述】:
我在我的 C# 代码中使用带有给定图像的图片框。 我在 Pain 事件中做所有的绘画动作(见下面的代码)。 当需要更新图像(在其上添加点)时,我调用 Invalidate 使其重新绘制。但是一段时间后,图像和点消失了,取而代之的是红色边框中的大红色 X,填满了图片框。 请注意,图像作为 exe 文件保存在保存文件夹中。并且一开始看起来还不错(与点相同)。
我做错了什么? 跨线程问题?
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
setImage = Image.FromFile("IMG_1612.png");
Pen p = new Pen(Color.Red);
var g = Graphics.FromImage(setImage);//e.Graphics;
g.DrawImage(setImage,0,0);
foreach (Circles element in _circles)
{
g.FillEllipse(new SolidBrush(element.color), element.Punt.X, element.Punt.Y, _CIRCLESIZE, _CIRCLESIZE);
}
this.pictureBox1.Image = setImage;
g.Dispose();
}
delegate void PicturBoxUpdate(Control control);
private void UpdatePictureBox(Control control)
{
// InvokeRequired required compares the thread ID of the
// calling thread to the thread ID of the creating thread.
// If these threads are different, it returns true.
if (control.InvokeRequired)
{
PicturBoxUpdate d = new PicturBoxUpdate(UpdatePictureBox);
this.Invoke(d, new object[] { control});
}
else
{
control.Invalidate();
control.Update();
}
}
private void DataProcessing(string data)
{
data = data.Replace('<', ' ').Replace('>',' ').Trim();
string[] processingdata = data.Split(';');
Circles tempCircle;
for (int i = 0; i < processingdata.Length-2;i++)
{
_data[i] = Convert.ToByte(processingdata[i], 16);
BitArray localdata = new BitArray(BitConverter.GetBytes(_data[i]).ToArray());
switch(i)
{
case 0:
if (_data[i] == 0xAA)
{
tempCircle = _circles[5];
tempCircle.color = Color.Green;
_circles[5] = tempCircle;
tempCircle = _circles[4];
tempCircle.color = Color.Green;
_circles[4] = tempCircle;
}
else
{
if (localdata.Get(1) & !localdata.Get(2))
{
tempCircle = _circles[5];
tempCircle.color = Color.Orange;
_circles[5] = tempCircle;
tempCircle = _circles[4];
tempCircle.color = Color.Orange;
_circles[4] = tempCircle;
}
if (localdata.Get(3) & !localdata.Get(0))
{
tempCircle = _circles[5];
tempCircle.color = Color.Blue;
_circles[5] = tempCircle;
}
if (localdata.Get(5) & !localdata.Get(4))
{
tempCircle = _circles[4];
tempCircle.color = Color.Blue;
_circles[4] = tempCircle;
}
if (localdata.Get(7) & !localdata.Get(6))
{
tempCircle = _circles[4];
tempCircle.color = Color.Purple;
_circles[4] = tempCircle;
tempCircle = _circles[5];
tempCircle.color = Color.Purple;
_circles[5] = tempCircle;
}
}
break;
case 1:
break;
default:
break;
}
}
UpdatePictureBox(pictureBox1);
GC.Collect();
}
【问题讨论】:
-
Big red x 表示
Paint事件处理程序中未处理的异常。要查看哪一个:将其包含在try/catch(Exception e) {}中并在catch中设置断点。 -
规则是,对于持久结果,您应该仅使用
Paintevent 及其e.Graphics对象来在PBox 表面上绘制 .然而,对于到图像位图,您可以并且应该编写一些其他事件/方法,因为该位图将始终存在!Paint事件会在各种场合被系统调用,所以不要在里面放不属于那里的东西!
标签: c# image picturebox