如何实现一个橡皮区矩形

来源:互联网 发布:剪切视频的软件 编辑:程序博客网 时间:2024/04/27 23:11
CRectTracker是一个很有用的类,可以通过调用CRectTracker:: TrackRubberBand
响应WM_LBUTTONDOWN消息来创建一个橡皮区矩形。下例表明使用CRectTracker移动
和重置视窗中的蓝色椭圆的大小是很容易的事情。
    首先,在文件档中声明一个CRectTracker数据成员:
class CSampleView : Public CView
{

    …

    public :
         CrectTracker m_tracker;

    …
};

    其次,在文档类的构造函数中初始化CRectTracker 对象:
CSampleDoc:: CSampleDOC ()
{
     //Initialize tracker position, size and style.
     m_tracker.m_rect.SetRect (0, 0, 10, 10);
     m_tracker.m_nStyle=CRectTracker:: resizeInside  |
           CRectTracker:: dottedLine;
}
    然后,在OnDraw函数中画椭圆和踪迹矩形:
void CSampleView:: OnDraw (CDC* pDC)
{
     CSampleDoc* pDoc=GetDocument ();
     ASSERT_VALID (pDoc);

     //Select blue brush into device context.
     CBrush brush (RGB (0, 0, 255));
     CBrush* pOldBrush=pDC->SelectObject (&brush);

     //draw ellipse in tracking rectangle.
     Crect rcEllipse;
     pDoc->m_tracker.GetTrueRect (rcEllipse);
     pDC->Ellipse (rcEllipse);

     //Draw tracking rectangle.
     pDoc->m_tracker.Draw (pDC);
     //Select blue brush out of device context.
     pDC->Selectobject (pOldBrush);
}
    最后,使用ClassWizard处理WM_LBUTTONDOWN消息,并增加下述代码。该段代码
根据鼠标击键情况可以拖放、移动或者重置椭圆的大小。

void CSampleView::OnLButtonDown (UINT nFlags, CPoint point)
{
     //Get pointer to document.
     CSampleDoc* pDoc=GetDocument ();
     ASSERT_VALID (pDoc);

     //If clicked on ellipse, drag or resize it. Otherwise create a
     //rubber-band rectangle nd create a new ellipse.
     BOOL bResult=pDoc->m_tracker.HitTest (point)!=
         CRectTracker::hitNothing;

     //Tracker rectangle changed so update views.
     if (bResult)
     {
        pDoc->m_tracker.Track (this,point,TRue);
        pDoc->SetModifiedFlag ();
        pDoc->UpdateAllViews (NULL);
     }

     else
        pDoc->m-tracker.TrackRubberBand (this,point,TRUE);

     CView:: onLButtonDown (nFlags,point);
}