我在数据库中拿出了多张图要显示在picimage(picturebox控件)上,在图上点一下在此位置画出十字架,再别的地方点又多了个十字架,我想把第一次的十字架清掉怎么处理。
  private void DrawCross()
        {
            try
            {                Bitmap bitmap = new Bitmap(picimage.image.Width, picimage.image.Height , System.Drawing.Imaging.PixelFormat.Format24bppRgb);
                Graphics graphics = Graphics.FromImage(bitmap);                
                int colorTransparence=100;
                Pen opqPen = new Pen(Color.FromArgb(colorTransparence, Color.White), 3);
                graphics.DrawImage(picimage.image, 0, 0, bitmap.Width, bitmap.Height);
                graphics.DrawLine(opqPen, 0, msDownPtY, bitmap.Width - 1, msDownPtY);
                graphics.DrawLine(opqPen, msDownPtX, 0, msDownPtX, bitmap.Height - 1);                picImage.Image = bitmap;
 
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error: " + ex.ToString());
            }
        }

解决方案 »

  1.   

    调用picImage.Refresh()或者picImage.Invalidate();
      

  2.   

    双缓冲
    namespace WindowsFormsApplication10
    {
        public partial class Form1 : Form
        {
            Bitmap OrgBmp = null;
            Bitmap CacheBmp = null;
            public Form1()
            {
                InitializeComponent();            pictureBox1.Image = new Bitmap(400, 400);
                pictureBox1.Size = new Size(400, 400);
                Graphics g = Graphics.FromImage(pictureBox1.Image);
                g.FillEllipse(new SolidBrush(Color.Red), new Rectangle(0, 0, 400, 400));
                g.Dispose();
                OrgBmp = new Bitmap(pictureBox1.Image);
            }        private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
            {
                CacheBmp = new Bitmap(OrgBmp);
                Graphics g = Graphics.FromImage(CacheBmp);
                g.FillRectangle(new SolidBrush(Color.Black), new Rectangle(e.Location, new Size(30, 30)));
                g.Dispose();
                pictureBox1.Image = CacheBmp; 
            }
        }
    }
      

  3.   

    如果我在程序前边加这么一句 只能是在当前图实现我的功能,但是我要翻页到下一张图,再点的话虽然十字架画上去了但是背景图成了数据库中第一张了
    this.picImage.Image = (Image)origalImage.Clone();//origalImage这个是数据库第一条记录
     Bitmap bitmap = new Bitmap(picimage.image.Width,picimage.image.Height ,System.Drawing.Imaging.PixelFormat.Format24bppRgb); 
    Graphics graphics = Graphics.FromImage(bitmap); 
      

  4.   

    最好是把画的内容用矢量图的方式记录下来,比如十字架,就是2条直线,做个直线类,记录2个点坐标、颜色、粗细、虚实、边框、箭头等信息,然后每次都用重画的办法,使用我上面贴的双缓冲的方法,如果某个十字架不要了,就从需要绘画的列表中去掉这2条直线的记录,那下次重画时等于消掉了这个十字,而且完全没有闪烁的问题,以前的directx里的directdraw也是这么干的,direct3d估计也差不多
      

  5.   

    用新的坐标再执行一遍DrawCross() 
      

  6.   

    翻到有下一页就把背景换掉
    重新赋值this.picImage.Image = (Image)origalImage.Clone();//origalImage 数据库第N条记录
      

  7.   

    private void btnPrevious_Click(object sender, EventArgs e)
            {
                try
                {
                    if (i == 0)
                    {
                        MessageBox.Show("这已经是第一张图片!");                }
                    else
                    {
                        i--;
                        string path = queryimgtable.Rows[i]["Wafer_Image_Path"].ToString();
                        //this.picImage.Image = Image.FromFile(path);
                        Image tempImg = Image.FromFile(path);
                        this.picImage.Image = (Image)tempImg.Clone();
                        origiImage = (Image)tempImg.Clone();
                        tempImg.Dispose();
                       
                    }
                }
                catch (Exception ex)
                {
                   
                    MessageBox.Show("Error: " + ex.ToString());
                }        }        private void btnNext_Click(object sender, EventArgs e)
            {
                try
                {
                    if (i < queryimgtable.Rows.Count - 1)
                    {
                        i++;
                        string path = queryimgtable.Rows[i]["Wafer_Image_Path"].ToString();
                        Image tempImg = Image.FromFile(path);
                        this.picImage.Image = (Image)tempImg.Clone();
                        origiImage = (Image)tempImg.Clone();
                        tempImg.Dispose();
                    }
                    else
                    {
                        MessageBox.Show("这已经是最后一张图片!");
                    }
                 
                }
                catch (Exception ex)
                {
                   
                    MessageBox.Show("Error: " + ex.ToString());
                }
            }
    我在两个按钮加了如上类容实现了
      

  8.   

     string path = queryimgtable.Rows[0]["Wafer_Image_Path"].ToString();
                        if (System.IO.File.Exists(path))
                        {
                            this.picImage.Image = Image.FromFile(path);
                            origiImage = (Image)this.picImage.Image.Clone();
                            i = 0;//i记录当前位置
                        }
    还得多思考啊 谢谢各位