请问怎样实现类似CAD的橡皮擦功能?

ydbonline 2004-12-13 10:20:59
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!
...全文
1808 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
liqi 2004-12-19
  • 打赏
  • 举报
回复
首先要保存所有画的图形,如果有删除操作的话就在数据结构中删除它的数据,然后重画。
lockriver 2004-12-19
  • 打赏
  • 举报
回复
这样的操作涉及到许多步骤:

1.首先,鼠标需用捕捉到直线,圆等几何;

2.得到捕捉几何,执行删除;

3.如果考虑详细的话,当然要进行undo_redo预先处理;同时捕捉机制的设置和交换操作的设置都应该事先考虑周到;

如果你只是单纯的鼠标点下删除。那么点下鼠标事件后去判断是否捕捉到直线,找到最近的一个删去就可以了。
zhuyie 2004-12-14
  • 打赏
  • 举报
回复
To I_Love_CPP(我爱C++):

第二点认为不妥,Undo/Redo是有顺序性的,也就是只能一步步回到前面的状态,但用橡皮檫显然可以只檫除第一步插入的对象而保留第二步插入的对象。
ydbonline 2004-12-14
  • 打赏
  • 举报
回复
我是楼主

所指的擦除不只是指把颜色抺掉,而指,如:
 画了一直线,当鼠标点到直线的任意部分时就把整条直线删除,就好比AUTO-K(CAD)里面的功能一样。
sdwalnut1 2004-12-14
  • 打赏
  • 举报
回复
在cdc上绘制线条,同样的位置,第一遍是绘制,第二遍是擦除。利用这个特性,就可以实现向批条功能了
I_Love_CPP 2004-12-13
  • 打赏
  • 举报
回复
好,就第1个问题。
有2个方法:
1、实现普通的擦除功能(用指定宽度和形状的白色的刷子就可实现,
这也是我们常见的画图程序中的擦除功能)。
2、用Undo(也就是撤消当前操作),参考:
http://community.csdn.net/Expert/topic/3171/3171998.xml?temp=.8656122
ydbonline 2004-12-13
  • 打赏
  • 举报
回复
第2个问题已搞定,
请看看第1个问题的算法怎么写吧!

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧