1。程序有画直线,圆,和矩形的功能,我想在点了橡皮擦菜单项后擦掉所画的图形,请问算法怎样实现? 来个程序段或者网址都可以
   其中每画一个直线,圆,或矩形,我都分别把它们的坐标保存在各自的 CArray<CPoint,CPoint> 里。
2. 为什么不能透明画图,如:画两个矩形的话,下面的那个就被盖住了,程序选段如下:void CdrawView::OnLButtonUp(UINT nFlags, CPoint point)
{
if(GetCapture()!=this)
return ;
if(draw_Type==d_Nothing)
return ;    // //程序刚开始时没有选定绘图类型,所以不做任何操作。
CdrawDoc* pDoc = GetDocument();
CClientDC dc(this) ;
CPen *pOldPen=dc.SelectObject(pDoc->GetCurrentPen()) ;

dc.SetBkMode(TRANSPARENT) ;  ///  这里设置了透明还是不行???
switch(draw_Type)  //  draw_Type 是个枚举
{
case d_Line:
dc.MoveTo(m_ptPrev) ;
dc.LineTo(point) ;
m_pLineCur->m_pointArray.Add(point) ;
break ;
case d_Rectangle:
dc.Rectangle(m_ptPrev.x,m_ptPrev.y,point.x,point.y) ;
m_pRectangleCur->m_pointArray.Add(point) ;
break ;
default:
break ;
}
dc.SelectObject(pOldPen) ;
 
ReleaseCapture() ;
// CView::OnLButtonUp(nFlags, point);
}Thanks!

解决方案 »

  1.   

    好,就第1个问题。
    有2个方法:
    1、实现普通的擦除功能(用指定宽度和形状的白色的刷子就可实现,
       这也是我们常见的画图程序中的擦除功能)。
    2、用Undo(也就是撤消当前操作),参考:
       http://community.csdn.net/Expert/topic/3171/3171998.xml?temp=.8656122
      

  2.   

    To I_Love_CPP(我爱C++):第二点认为不妥,Undo/Redo是有顺序性的,也就是只能一步步回到前面的状态,但用橡皮檫显然可以只檫除第一步插入的对象而保留第二步插入的对象。
      

  3.   

    在cdc上绘制线条,同样的位置,第一遍是绘制,第二遍是擦除。利用这个特性,就可以实现向批条功能了
      

  4.   

    这样的操作涉及到许多步骤:1.首先,鼠标需用捕捉到直线,圆等几何;2.得到捕捉几何,执行删除;3.如果考虑详细的话,当然要进行undo_redo预先处理;同时捕捉机制的设置和交换操作的设置都应该事先考虑周到;如果你只是单纯的鼠标点下删除。那么点下鼠标事件后去判断是否捕捉到直线,找到最近的一个删去就可以了。