我在picturebox_paint事件中有一些绘图指令,picturebox的anchor绑定窗体的四条边,如果我放大窗体,就会引发paint事件,但是我缩小却不行,请问我想放大或缩小都要引发paint的话,该怎么做?

解决方案 »

  1.   

    在缩小事件里调用pricturebox的Control.Invalidate
      

  2.   

    缩小事件? 只有resize啊,我不是要最小化,只是改小窗体尺寸
      

  3.   

    在picturebox的Resize事件调用picturebox_paint就行啊
      

  4.   

    在窗体的SizeChanged事件中重新调用一下
      

  5.   

    SizeChanged或是Resize里再调用,那放大窗体时,绘制语句就被触发两遍了,效果就差了
      

  6.   

    缩小当然不会引发PAINT事件。因为缩小的时候窗体只要丢弃像素就可以了,没有必要重绘。
    如果一定想收到paint消息,那么可以捕获SizeChanged事件,手动使窗体无效来解决
      

  7.   

    如果我在picturebox_paint和sizechanged中都加入相同的绘图语句,那缩小的时候只触发一次,但放大的时候会触发两次,如何避免?
      

  8.   

    SizeChanged事件中放入一句代码试试private void pictureBox1_SizeChanged(object sender, EventArgs e)
            {
                this.pictureBox1.Refresh();
            }
      

  9.   

    sizechanged中不要加绘制代码,直接加一句
    this.pictureBox1.Refresh();
      

  10.   

    有很多种方法
    1.this.pictureBox1.Refresh();是窗体无效,并且重绘所有的子控件
    2.this.pictureBox1.Invalidate();可以传一个矩形和bool参数,决定使多少空间重绘和是否重绘子控件
      

  11.   

    我试了Refresh和Invalidate,的确都只画一次了,但是拖的时候闪烁严重,我是用BufferedGraphics的双缓冲来防止闪烁,不用refresh的时候效果是非常好的.我猜可能是Refresh把BufferedGraphics的双缓冲作用给抵消了,晕.....
    请教walkingmu,还有其它方法吗?
      

  12.   

    看来是跟不上刷新的节奏。你少发几个。
    设置一个bool bRefresh变量.if(!bRefresh)
        bRefresh=true;
    else
    {
     bRefresh=false;
     this.pictureBox1.Refresh();
    }
    这样应该就可以减少一半的闪烁。
    比较好的做法应该是用线程控制。
    sizechanged事件中判断线程是否启动,如果已经启动了就不启动
    线程中用
    Thread.sleep(500);
    这样可以控制至少半秒钟才刷新一次
    然后再用this.pictureBox1.Refresh();
    这样就能保证每次大小变化后都会刷新,而且500毫秒内不会重复刷新
      

  13.   

    但是不管是bRefresh或是sleep,都还是会闪烁,哎~~,似乎不太可能完美解决此问题,谢谢大家的回答,特别是walkingmu,谢谢
      

  14.   

    我设了new old两个全局size,用来保存窗体的变化尺寸,然后在sizechanged中赋值这两个变量并判断窗体是放大还是缩小,缩小才重绘,效果不错,结贴了,谢谢大家