我用GDI在控件上画线因为要做画线更随鼠标的缘故,故每次鼠标的move,都必须带来2件事:
1)控件的refresh(目的是清除以前的画线)
2)drawline(在鼠标位置画新的线)这样就达到了画线更随鼠标的缘故
但是这样带来以一个严重的问题:
鼠标拖动画线的时候屏幕很卡,估计是每次画线之前都要热refresh的缘故;
如果我把refresh去掉,则屏幕内会出现N跳线(因为没有去掉以前的线了),但是这时候屏幕就不卡了(没有了refresh)所以我想了一个变通的办法:
就是依然不用每次画线之前refresh,但是每次画线之前把GDI之前画的线的颜色全部改成透明,只有最新的线的颜色才是显现的颜色(比如红色),这样的话虽然是个假象,但是好看多了我想能不能GDi画的之前的线能不能改颜色?或者还有什么其他的方法能保证GDI更随鼠标画线的时候(上述情况下),画线流畅,屏幕又不卡?谢谢啦额

解决方案 »

  1.   

    第一 我尝试了一下双缓存 但是要达到我的目标 还是要每次将图像贴到控件上之前要refresh一次啊,那不等于是没效果吗?
    第二 怎么在C#里面 异或画线啊请高手指导
      

  2.   

    最主要的是要减少绘制区域你画新线的时候正真需要“刷新”的其实只有两个地方,新画的那条线和需要消除的那条线,那么就只绘制这两个地方。如果你的绘制操作都是在OnPaint中根据无效区域进行的,那就应该使无效区域尽可能小,也就是只Invalidate需要的区域(然后Update),而不是用Refresh导致整个控件都无效、重绘。如果你是在鼠标事件中直接绘制到控件上(用bitmap做备份,重绘时刷到控件上),那就绘制那两条线对应的区域。
      

  3.   

    双缓存代码:Bitmap bmp=new Bitmap(1000, 1000);
    Graphics gpshuang=Graphics.FromImage(bmp);
    gpshuang.Clear(Color.Transparent);mousemove事件里写:
    {
    gpshuang.DrawLine(XXXX);
    this.tuxiang1.CreateGraphics().DrawImage(bmp, 0, 0);
    }发现画了一条线后,拖动鼠标的时候,线条全部都在,以前画过的历史全部都在,整个屏幕内全是画的线! 
    还是要调用控件的refresh,那不是更原来的一样? 什么用没有?