我在我的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();
}
答案 0 :(得分:1)
你绝对不应该像Paint那样在Paint()事件中使用Image.FromFile()
;设置一次并使用Paint()事件中提供的Graphics简单绘制圆圈:
private Image setImage;
private void Form1_Load(object sender, EventArgs e)
{
setImage = Image.FromFile("IMG_1612.png");
pictureBox1.Image = setImage;
}
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
var g = e.Graphics;
foreach (Circles element in _circles)
{
using (SolidBrush B = new SolidBrush(element.Color))
{
g.FillEllipse(B, element.Punt.X, element.Punt.Y, _CIRCLESIZE, _CIRCLESIZE);
}
}
}