把绘制代码写在OnPaint()事件下

解决方案 »

  1.   

    OnPaint()事件的代码是重绘整个内容是时候才调用的.比如现在有个800 x 600的窗体,里面自己绘制了很多内容(图片,线等),但是这时只有10 x 10的区域被遮挡,然后显示,一样会进入OnPaint(),但是现在要绘制的只是10 x 10的区域,其他的根本不用啊.可是方法该怎么办.记得win32下好像看见过,现把要重新绘制的区域在后台绘制,然后只绘制失效部分.
      

  2.   

    计算出要重绘的矩形,然后Invalidate(rectangle);
      

  3.   

    用OnPaint()事件可以解决这个问题,但是如果在Button_Click事件中产生picturebox1的Graphics对象,接着picturebox2.Left++(注:初始时picturebox1.top=picturebox2.top &&picturebox1.left>picturebox2.left) 。当picturebox2.left>=picturebox1.right时又该怎样解决重绘问题?
      

  4.   

    qcny()的问题提得很好,你所提到问题也就是我提的,我自己研究了一下,有点心得和大家分享一下。
    1.如果直接用PictureBox的Graphics对象绘制,那么PictureBox就不会自动保持绘制的结果,也就是说一旦被其他遮挡后,再显示的时候内容被清空。
    2.如果内容不是很大,可以考虑使用PictureBox.Image属性,设置后,PictureBox的内容就可以自己保持状态。比如你可以把你在Graphics中绘制的内容保存在Bitmap对象里,然后赋值给PictureBox.Image
    3.难点:如果内容很多,比如是很大,很复杂的图片,不可能保存下来赋值给Image属性。这时应该先把原先可见的只是位置有变化的内容用(BitBlt之类的api)快速移动到新位置,然后再补绘上原先内容上没有的。win32 api下已经实现了的。