橡皮筋技术
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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:20
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 );
}
==这么写,那你两遍画的firstpoint和secondpoint不是一样的啦?能有橡皮筋的效果么?
#2楼
级:
个功能:画一个有颜色的矩形,可以缩放和移动,而且必须是在滚动视图里边。在参看“CRectTracker类的使用”文章后,在非滚动视不过当换成滚动视图并且拖动滚动条时出现了填充的矩形色块和CRectTracker边框分离的情况,而且无论怎么滚动CRectTracker边可见的客户区里。原因是CRectTracker里的成员m_rect的坐标是相对于当前所见客户区的,而矩形色块的坐标是相对于整个文档的决办法大都是说DPtoLP(),我尝试了好几天都不得要领。请教一下CRectTrackerl类在CScrollView里怎么实现?请说详细些,第
现的100分奉上,谢谢!