gc.Clear(this.BackColor)不行吗?背景图放到窗体的Backgroundimage属性里。

解决方案 »

  1.   

    我的背景图是用的image类动态加载的一副图片.我还要试试哈!
      

  2.   

    在输出时才画,也就是Paint事件里,而不是MouseMove事件里。
    你可以先建立个背景图,这个相对固定的。
    在MouseMove事件计算好要画矩形的区域,记录下来。调用Invalidate,触发Paint事件。
    在Paint事件里面,建立一个输出Bitmap,先将背景图画上去,再判断是否要画矩形,和要画矩形的区域,将矩形画上去。将这个输出Bitmap画到Paint事件参数的Graphics上面输出。也就是说每次都只有背景和这次要画的矩形,上次画的矩形被丢弃了。
    进阶一点要求效率的话,调用Invalidate时可以指定重画区域,Paint事件里面画这个区域的内容就可以了。
      

  3.   

    我也试过,可是调用了Invalidate会感觉整个的窗口抖动的非常厉害,不知道可不可以减轻整个窗口的抖动呢?谢谢楼上了!
      

  4.   

    使用双缓冲!
    具体代码见:
    http://blog.csdn.net/zhoufoxcn/archive/2006/12/25/1461090.aspx
      

  5.   

    调用Invalidate时指定重画区域假设你上次画的矩形是lastRectange,MouseMove事件里面:
    Rectange rect = ComputeRectange();  // 计算要画的矩形区域,ComputeRectange你自己定义
    Region r = new Region(rect);
    r.Union(lastRectange);
    lastRectange = rect;
    this.Invalidate(r);
      

  6.   

    Invalidate指定区域之后只会擦掉指定区域,其他地方还是保留。一般情况不会有闪动了。
    但是如果你的区域实在太大或者作图需要太长时间,可以先完成作图再Invalidate。