WEB开发网
开发学院软件开发VC CRectTracker类的使用 阅读

CRectTracker类的使用

 2009-10-15 20:31:31 来源:WEB开发网   
核心提示:第五步:让我们回到那个蓝色的椭圆,在开始新的步骤之前,CRectTracker类的使用(2),首先来介绍一下HitTest(CPoint point)的功能:当你鼠标被按下的时候,你可以调用这个函数,在关闭这个文件之前,最好你自己再复习一下,它将返回鼠标点在了四边形的什么位置:

第五步:

让我们回到那个蓝色的椭圆,在开始新的步骤之前,首先来介绍一下HitTest(CPoint point)的功能:当你鼠标被按下的时候,你可以调用这个函数,它将返回鼠标点在了四边形的什么位置:

返回值 代表的含义
-1 点在了四边形的外部
0 左上角
1 右上角
2 右下角
3 左下角(0,1,2,3顺时针转了一圈)
4 顶部
5 右部
6 底部
7 左部(还是顺时针转了一圈)
8 点在了四边形的内部,但没有击中前面的那八个点

可以看出,返回值如果大于等于零则在四边形区域之内。如果小于则说明不在区域范围之内。因此我们需要加一个公有的成员函数:BOOL bDraw;为了方便起见,我把它加到CRectView中,(你也许会说,为什么不加到doc中,我也知道这有勃编程的原理,反正我高兴就得,都说C++给人了很大的自由度,所以你也别限制我)。先把它初始化为FALSE,表示不画边界,当TRUE时,表示要画边界。 定义: class CRectView : public CView
{
  …………
  public:
  BOOL bDraw;
  …….
}
初始化:
CRectView::CRectView()
{
   // TODO: add construction code here
   bDraw=FALSE;
}
将OnDraw改一下,加一句话:
void CRectView::OnDraw(CDC* pDC)
{
   CRectDoc* pDoc = GetDocument();
   ASSERT_VALID(pDoc);
   // TODO: add draw code for native data here
   CBrush brush(RGB(0,0,255));//生成蓝色的画刷;
   CBrush *oldBrush=pDC->SelectObject(&brush);//将画刷选进dc;
   CRect rect;
   pDoc->m_rectTracker.GetTrueRect (&rect);
   //GetTrueRect(&rect)可以得到CRectTracker中的m_rect的大小,将其传递给rect;
   if(bDraw) //*************新加的语句***************
     pDC->Ellipse (rect);//画椭圆;
    //Draw tracking rectangle.
   pDoc->m_rectTracker.Draw (pDC);//***这句画才真正的将这个四边形画出来;***
   //Select blue brush out of device context.
   pDC->SelectObject (oldBrush);//恢复原来的画刷;
}
   编译运行一下,椭圆的边界没有了。
   好了,预备知识讲完了,让我们来完成这个程序吧:
void CRectView::OnLButtonDown(UINT nFlags, CPoint point)
{
   // TODO: Add your message handler code here and/or call default
   int nIn; //定义一个鼠标的点击值;
   nIn=GetDocument()->m_rectTracker.HitTest(point); //看看点到了哪了
   if(nIn<0) //不在四边形区域内;
   {
   CRectTracker temp;
   temp.TrackRubberBand(this,point,TRUE);
   temp.m_rect.NormalizeRect();
   CRectTracker interRect;
   //在建立一个CRectTracker;用于记录鼠标与椭圆的交集。
   if(interRect.m_rect.IntersectRect(temp.m_rect,GetDocument()->m_rectTracker.m_rect))
    bDraw=TRUE; //如果有交集,则画四边形的边界,说明选择了椭圆
   else  bDraw=FALSE;
   Invalidate(); //引起OnDraw函数的发生;
   }
   else
    //在四边形区域内:
   {
   CClientDC dc(this);
   GetDocument()->m_rectTracker.Draw(&dc);
   GetDocument()->m_rectTracker.Track(this,point,TRUE);
   // Track()是CRectTracker中最富魅力的函数。它时时的改变调用者的m_rect;
   bDraw=TRUE;
   Invalidate();
   }
   CView::OnLButtonDown(nFlags, point);
}

你也许会问,为什么我没有编写MouseMove函数,它就自动的变大小了呢?这就是Track()函数的功劳,从调用它到抬起鼠标键为止,它时刻的改变m_rectTracker的四边形的大小。然后由于我们使用了Invalidate()函数,所以重新画了这个椭圆,因此它好象被放大缩小了似的。 我的文章写完了,还有什么不懂的地方,写信给我。在关闭这个文件之前,最好你自己再复习一下,并尝试一下其他的功能。

上一页  1 2 

Tags:CRectTracker 使用

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接