11.4.3 CRectTracker类的应用实例(1)
为了使读者了解CRectTracker类的使用方法,并更加透彻地理解CRectTracker类,在本例中将通过一个单文档工程实例来进行讲解。
(1)创建一个基于单文档的工程命名为TestCRectTracker。
(2)在文档类CTestCRectTrackerDoc中添加一个CRectTracert类型的变量m_rect- Tracker。
- CRectTracker m_rectTracker;
(3)在文档类的构造函数中初始化m_rectTracker的关键成员变量。- 01 CTestCRectTrackerDoc::CTestCRectTrackerDoc()
- 02 {
- 03 m_rectTracker.m_rect.SetRect(0,0,100,100); //初始区域及大小
- 04 m_rectTracker.m_nStyle=CRectTracker::resizeInside| CRectTracker::
- dottedLine;
- 05 }
第3行设置m_rectTracker的区域成员变量m_rect。第4行设置m_rectTracker的样式成员变量(数值的具体含义可以参考上节)。
(4)在视图类CTestCRectTrackerView的OnDraw()函数中,向m_rectTracker区域绘制一个蓝色的椭圆形。
- 01 void CTestCRectTrackerView::OnDraw(CDC* pDC)
- 02 {
- 03 CTestCRectTrackerDoc* pDoc = GetDocument();
- 04 ASSERT_VALID(pDoc);
- 05 //开始绘制蓝色椭圆形
- 06 Brush brush(RGB(0,0,255)); //蓝色的画刷
- 07 CBrush *oldBrush=pDC->SelectObject(&brush); //将画刷选进dc
- 08 Rect rect;
- 09 //获取CRectTracker中m_rect的大小
- 10 Doc->m_rectTracker.GetTrueRect (&rect);
- 11 pDC->Ellipse (rect); //画椭圆
- 12 pDoc->m_rectTracker.Draw (pDC); //绘制橡皮筋框
- 13 pDC->SelectObject (oldBrush); //恢复原来的画刷
- 14 }
【代码解析】
第3、4行获取文档类指针。第6行创建一个蓝色画刷,第7行将新建画刷选入设备。第9、10行获取m_rectTracker的区域大小,11行根据m_rectTracker的区域大小绘制一个椭圆形。第12行绘制橡皮筋区域。第13行恢复设备的原画刷颜色。到此运行程序,可以看到在客户区的左上角有一个橡皮筋区域,在这个区域内有一个椭圆形,如图11.15所示。
|
| 图11.15 在m_rectTracker中绘制蓝色椭圆 |
(5)此时实现的m_rectTracker无法改变位置及大小,所以还需要为视图类添加鼠标左键按下事件,在鼠标按下后根据鼠标与橡皮筋框的位置,做出相应的动作。
- 01 void CTestCRectTrackerView::OnLButtonDown(UINT nFlags, CPoint point)
- 02 {
- 03 int nIn; //鼠标与橡皮筋的位置关系
- 04 nIn=GetDocument()->m_rectTracker.HitTest(point);
- //获取鼠标与橡皮筋位置关系
- 05 if(nIn<0) //不在四边形区域内
- 06 { //绘制一个临时的橡皮筋区域
- 07 CRectTracker temp;
- 08 temp.TrackRubberBand(this,point,TRUE);
- 09 temp.m_rect.NormalizeRect();
- 10 Invalidate(); //触发OnDraw()函数的发生
- 11 }
- 12 else //在四边形区域内
- 13 {
- 14 CClientDC dc(this);
- 15 GetDocument()->m_rectTracker.Draw(&dc);
- 16 //Track()函数时时地改变调用者的m_rect;
- 17 GetDocument()->m_rectTracker.Track(this,point,TRUE);
- 18 Invalidate();
- 19 }
- 20 CView::OnLButtonDown(nFlags, point);
- 21 }