我在应用程序中,使用了1个Picturebox,其中逻辑如下:
定义了一个全局bitmap1,有一个绘制函数redraw,由Graphics.FromImage产生的Graphics绘图,绘完后再由picturebox.DrawImage画出这幅图,
在Picturebox的paint函数中也是picturebox.DrawImage(bitmap1),然后picturebox.Flush
现在问题是,当有其他窗体在picuturebox上时,移动窗体,picuturebox会出现白色框,过半天才会把白色挖去的部分补上
各位能否帮助一下怎么解决这个问题,能实时把其他窗体产生的背景补上 谢谢
              

解决方案 »

  1.   

    你用了 重写 PictureBox的OnPaint(...) 也不行啊
      

  2.   

    我没有用 PictureBox的OnPaint(...) 的方法,因为这需要重新定义新类,而且我看了Onpaint函数也是引发控件对象paint事件的。
    伪代码代码如下
    form_Load()
    {
    Graphics g0 =pictureBox1.CreateGraphics();//忘了是不是这句,反正g0 是和picturebox1挂在一起
    bitmap1 =new Bitmap(pictureBox1.width,pictureBox1.height);
    Graphics g_bit =Graphics.FromImage(bitmap1);}
    picturebox1_paint(...)
    {
           g0.DrawImage(bitmap1);
           g0.Flush();
    }//自己的redraw函数
    void redraw_all
    {
        g_bit.Draw.....//绘制
       
    }
    像这样的代码写完,有其他窗体在上面挪动时,有一段时间其他窗体会在picturebox上留下白色区域,怎么处理呢?
      

  3.   

    试试这个,任何窗口的移动什么的,都会触发这个事件,那也就不会被其他覆盖了。
    Application.Idle += new EventHandler(Application_Idle);void Application_Idle(object sender, EventArgs e)
    {
                g0.DrawImage(bitmap1); 
                g0.Flush(); 
    }
      

  4.   

    发现 g0 和 e.Graphics 不是同一个对象啊, 下面是我测试的代码        Bitmap bitmap1;
            Graphics g_bit;        public TestPictureBox()
            {
                InitializeComponent();
            }        private void TestPictureBox_Load(object sender, EventArgs e)
            {
                bitmap1 = new Bitmap(pictureBox1.Width, pictureBox1.Height);
                g_bit = Graphics.FromImage(bitmap1);
            }        private void pictureBox1_Paint(object sender, PaintEventArgs e)
            {
                e.Graphics.DrawImage(bitmap1, 0f, 0f);
            }        private void textBox1_TextChanged(object sender, EventArgs e)
            {
                g_bit.DrawString(textBox1.Text, Font, new SolidBrush(Color.Blue), 2f, 2f);
                pictureBox1.Invalidate();
            }
      

  5.   

    我告诉你个好方法:先定义一个事件picChanged 在Picturebox的paint中picturebox.DrawImage(bitmap1)之后激发此事件。然后在主窗体中写事件处理程序,程序里调用窗体本身的refresh(),这样一定行。
      

  6.   

    谢谢各位,我已经解决了,效果还不错,方法如下:
    form_Load() 

    //这句不要了:Graphics g0 =pictureBox1.CreateGraphics();//忘了是不是这句,反正g0 是和picturebox1挂在一起 
    bitmap1 =new Bitmap(pictureBox1.width,pictureBox1.height); 
    Graphics g_bit =Graphics.FromImage(bitmap1); 
    pictureBox1.Image =bitmap1;

    picturebox1_paint(...) 

          //g0.DrawImage(bitmap1); 也不要了
          g0.Flush(); 
    } //自己的redraw函数 
    void redraw_all 

        g_bit.Draw.....//绘制 
      
    } 我分析了一下,把图片的引用直接传给picturebox1的image,然后不管怎样 g_bit都是在bitmap1上绘制,就直接刷新了,谢谢各位