我用mfc做的很简单的用菜单写的然后建个class写画法的那种,因为我要做橡皮擦擦掉我前面画的图形,所以我要保留前面的图形,怎么办呢.最好详细我,我很笨的

解决方案 »

  1.   

    定义一个CArray <CRect,CRect> m_Ellipse;
    因为用Ellipse画圆时只要记录圆所在的矩形就行了,所以你每画一个圆将将相应的矩形用m_Ellipse.Add(..);加入到m_Ellipse中去,然后在OnPaint中用:
    for(int i=0;i<m_Ellipse.GetCount();i++)
     {
       CRect =m_Ellipse.GetAt(i);
       Ellipse(....);//画圆 }
      

  2.   

    对前1张图,拷贝到内存,下张图画在内存上,然后paint到scrren
      

  3.   

    创建一个设备兼容DC,然后把图拷贝到DC中,需要的时候就可以直接操作了,
      

  4.   

    我想楼主的做法应该是只在ONPAINT里面Ellipse画一次圆,只不过每次画的RECT是通过菜单选择后在界面上用通过鼠标拖动的范围来确定的,然后通过Invalidate来更新界面,ONPAINT就会执行。楼主最好把你画圆的代码和逻辑发出来,否则很难定位。假设你是在ONPAINT里面只用Ellipse画一次圆,那么不要调用Invalidate,换成InvalidateRect,只更新这次画圆的RECT,这样以外的地方就不会更新,一个RECT矩形区域,而不是椭圆区域,另外如果窗口自己更新调用ONPAINT时也会把以前更新掉。假设你是在ONPAINT里面掉用Ellipse画一次圆之前,还用FILLRECT来把整个客户区域都填充了,那肯定以前就没有了,上面的方法不行。你可以采用 ([兔子党党委机关处长])的方法,就是每次都保存,麻烦点,但很给力。简单点考虑,就是你写个自己的画圆函数,不要在ONPAINT里面画。通过GETDC()来得到显示DC,可以采用双缓冲,还可以实现拖动鼠标的时候实时更新椭圆。这样可以保证系统调用ONPAINT前不会被刷掉。啰嗦了这么多,其实就是一句话,
    直接画在窗口显示DC上的数据会在系统更新界面的时候刷掉,所以你需要在ONPAINT里把以前所有画的都重画一编, 而你画在窗口显示DC兼容的MEMDC上的数据不会被刷掉,所以你只要每次画的时候先画在MEMDC上,然后再拷贝到窗口显示DC就可以了,在ONPAINT里你也只需要把当前MEMDC的数据拷贝到窗口显示DC就行了。如有什么误人的地方,请各位大大指教。
      

  5.   

    对前1张图,拷贝到内存,下张图画在内存上,然后paint到scrren
      

  6.   

    看看CRectTracker是怎么做的吧,拖动矩形的时候,之前覆盖的内容制动恢复,并没有调用OnPaint()函数进行重绘,我也正在看CRectTracker的绘制的代码,上次CSDN上发了贴没人回复,所以最近正像找点时间自己看代码呢。