当前位置:文档之家› 橡皮筋技术

橡皮筋技术

CRectTracker类可以方便的实现这些功能CRectTracker是一个很有用的类,可以通过调用CRectTracker::TrackRubberBand 响应WM_LBUTTONDOWN消息来创建一个橡皮区矩形。

相应三个消息:鼠标按下,移动,松开按下的时候得到矩形的一个点移动过程中鼠标的位置作为对角线上的点,画矩形松开时鼠标位置为最终的点在鼠标移动过程中不断的得到最近的一个矩形但是以前画的矩形不知道应该怎么样擦除?代码如下,只有鼠标移动部分:CRebarDoc* pDoc = GetDocument();CClientDC dc(this);pDoc-> PEnd = point;dc-> Rectangle(pDoc-> PStart.x, pDoc-> PStart.y, pDoc-> PEnd.x, pDoc-> PEnd.y);CView::OnMouseMove(nFlags, point);回答1:添加如下部分CClientDC dc(this);int nOp = dc.SetRop2(R2_NOT);dc-> Rectangle(pDoc-> PStart.x, pDoc-> PStart.y, pDoc-> PEnd.x, pDoc-> PEnd.y);pDoc-> PEnd = point;dc-> Rectangle(pDoc-> PStart.x, pDoc-> PStart.y, pDoc-> PEnd.x, pDoc-> PEnd.y);dc.SetRop2(nOp);回答2:void Changerect::Draw (CDC* pdc,CPoint firstpoint,CPoint secondpoint){CPen pen;pen.CreatePen (PS_SOLID,1,RGB(255,0,0));CPen* poldpen= pdc->SelectObject (&pen);CBrush* poldbrush=(CBrush*)pdc->SelectStockObject (NULL_BRUSH);this->lefttop =firstpoint;this->rightbottom =secondpoint;CRect rect(lefttop,rightbottom);rect.NormalizeRect ();pdc->Rectangle (rect);pdc->SelectObject (poldpen);pdc->SelectObject (poldbrush);}void CmoveView::OnMouseMove(UINT nFlags, CPoint point){CClientDC dc(this);//dc.SetROP2 (R2_NOT);if(nFlags&MK_LBUTTON){this->secondpoint =point;if(pcr){pcr->Draw (&dc,this->firstpoint ,this->secondpoint );delete this->pcr ;pcr=0;}pcr =new Changerect;pcr->Draw (&dc,this->firstpoint ,this->secondpoint );}}这是鼠标移动事件.说明:注释掉dc.SetROP2 (R2_NOT);则能看到绘制过程,会有很多的重叠矩形,鼠标左键弹起后能看到最终矩形,重叠矩形消失.不注释,则绘制过程中只能隐约看到绘制的矩形,就是不停的闪烁,几乎看不到矩形的样子,鼠标左键弹起后,能看到最终矩形显示.不注释,再在函数末尾加一个窗口重画函数this->InvalidateRect (0);,则在绘制过程中也能看到矩形,但这样做显然不好.不知道哪里有问题,请大家帮我看看有用[0]板砖[0]pyparrot 乐鹦鹉) 级:#1楼得分:20回复于:2009-08-03 11:14:20if(nFlags&MK_LBUTTON){this->secondpoint =point;if(pcr){pcr->Draw (&dc,this->firstpoint ,this->secondpoint );delete this->pcr ;pcr=0;}pcr =new Changerect;pcr->Draw (&dc,this->firstpoint ,this->secondpoint );}==这么写,那你两遍画的firstpoint和secondpoint不是一样的啦?能有橡皮筋的效果么?#2楼级:个功能:画一个有颜色的矩形,可以缩放和移动,而且必须是在滚动视图里边。

在参看“CRectTracker类的使用”文章后,在非滚动视不过当换成滚动视图并且拖动滚动条时出现了填充的矩形色块和CRectTracker边框分离的情况,而且无论怎么滚动CRectTracker边可见的客户区里。

原因是CRectTracker里的成员m_rect的坐标是相对于当前所见客户区的,而矩形色块的坐标是相对于整个文档的决办法大都是说DPtoLP(),我尝试了好几天都不得要领。

请教一下CRectTrackerl类在CScrollView里怎么实现?请说详细些,第现的100分奉上,谢谢!说明一点,我已经研究过了oclient和drawcli例子,不过鉴于本人刚入手mfc不久因此没法把里面所需要的功能剥离出来,所以请不参考例子什么的了,最好能象“CRectTracker类的使用”这篇文章一样一步一步的说怎样说,o(∩_∩)o...,新手,多多体谅!“CRectTracker类的使用”文章如下:第一步:RectDoc类中生成一个公有的数据成员:m_rectTracker;之所以设成公有,因为要在View中调用它。

接着我们来初始化它,在CRectDoc构造函数中:CRectDoc::CRectDoc(){ // TODO: add one-time construction code herem_rectTracker.m_rect.SetRect(0,0,100,100);m_rectTracker.m_nStyle=CRectTracker::resizeInside|CRectTracker::dottedLine;}:m_rect是CRectTracker中用来控制四边形的大小位置的数据成员,SetRect使用的是View的坐标;m_nStyle是CRectTracker的Tracker::resizeInside和CRectTracker::resizeOutside是说明在m_rect的内部还是外部画区域(它们是互异的),CrectTrakcer::dottedLi 四边形的区域边界。

其他的值还有:CRectTracker::solidLine:用来画实线边界;(和dottedLine是互异的)CRectTracker::hatche 面线;CRectTracker::hatchInside:内部带抛面线;你可以运行前面的例子,上述参数都有使用。

你也可以在第二步中逐一使用它们解它们各自的含义;第二步:接着我门在视图中画一个蓝色的椭圆;在CRectView的OnDraw中继续我们的工作:void CRectView::OnDraw(CDC* pDC){CRectDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data hereCBrush brush(RGB(0,0,255));//生成蓝色的画刷;CBrush*oldBrush=pDC->SelectObject(&brush);//将画刷选进dc;CRect rect;//GetTrueRect(&rect)得到CRectTracker中的m_rect的大小,将其传递给rect;pDoc->m_rectTracker.GetTrueRect(&rect);pDC->Ellipse (rect);//画椭圆;//Draw tracking rectangle.pDoc->m_rectTracker.Draw(pDC);//这句画才真正的将这个四边形画出来;//Select blue brush out of device context.pDC->SelectObject (oldBrush);//恢复原来的画刷;}已经在程序里了,不用再多说,编译一下。

一个椭圆外带四边形边界(点划线),且四边形的四周有八个黑点;这就是CRectTracker.,以改变一下m_nStyle试试看各参数的含义;步:如何象例子中的那样随着鼠标的移动自动在椭圆的周围改变光标呢?很简单只要将下面的代码加入到CRectView::OnSetCursor()它调用了CRectTracker中的SetCursor()函数:BOOL CRectView::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message){ // TODO: Add your message handler code here and/or call defaultCRectDoc* pDoc= GetDocument();if (pWnd == this && pDoc->m_rectTracker.SetCursor(this, nHitTest))return TRUE;return CView::OnSetCursor(pWnd, nHitTest, message);}运行一下,鼠标变化了。

第四步:我们再做另一个用于鼠标的CRectTracker类。

它的作用是在鼠标按下以后可以显示虚线的选择框我们看看效果:在CRectView中的加入如下代码:void CRectView::OnLButtonDown(UINT nFlags, CPoint point){CRectTracker temp;temp.TrackRubberBand(this,point,TRUE);temp.m_rect.NormalizeRect();//正规化;CView::OnLButtonDown(nFlags, point);}编译运行,当你按下鼠标并拖动,你将看到效果了。

相关主题