关于橡皮筋类的复习

    技术2022-05-19  18

    CRectTracker(俗称“橡皮筋”类)它可以用做显示边界,你也可以扽它的八个角用来放大缩小,或做框选使用.

    http://dev.csdn.net/htmls/7/7001.html

    这篇blog详细的介绍了,该类的使用。

     

    使用该类首先需要初始化其一些成员:

    1.CRectTracker::m_rect

       指明初始化矩形的大小

    2.CRectTracker::m_nStyle

       说明矩形的风格

       其风格有如下:

       

    CRectTracker::solidLine  实线.CRectTracker::dottedLine   虚线,其和实线不能同时使用.CRectTracker::hatchedBorder   边界带抛面线.CRectTracker::resizeInside  矩形内部画线.CRectTracker::resizeOutside   矩形外部画线.CRectTracker::hatchInside   内部带抛面线.

    是使用过程中可以在先建立CRectTracker 的对象如m_Trect;再在初始化函数中设定,初始矩形的大小和风格如构造函数中

    m_Trect.m_rect.SetRect(100,100,200,200); m_Trect.m_nStyle = CRectTracker::resizeInside | CRectTracker::solidLine;

    剩下的主要是操作界面中的二个消息响应函数分别是

    afx_msg BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message); afx_msg void OnLButtonDown(UINT nFlags, CPoint point);

     

    OnSetCursor函数主要是改变光标在m_Trect区域内的形状

    BOOL CRectView::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) { // TODO: Add your message handler code here and/or call default CRectDoc* pDoc = GetDocument(); if (pWnd == this && pDoc->m_rectTracker.SetCursor(this, nHitTest)) return TRUE; return CView::OnSetCursor(pWnd, nHitTest, message); }  

     

    OnLButtonDown主要是矩形的一些动作其中一些很重要的函数就是:

    CRectTracker::NormalizeHit,该函数起规则化作用,即用鼠标画一个虚线框。

    CRectTracker::HitTest,该函数将返回,鼠标现相对矩形的位置

    返回值

    代表的含义

    -1

    点在了四边形的外部

    0

    左上角

    1

    右上角

    2

    右下角

    3

    左下角(0,1,2,3顺时针转了一圈)

    4

    顶部

    5

    右部

    6

    底部

    7

    左部(还是顺时针转了一圈)

    8

    点在了四边形的内部,但没有击中前面的那八个点

    CRectTracker::Track,该函数将时时改变矩形的大小BOOL Track( CWnd* pWnd, //包含矩形的窗口对象。            CPoint point,//当前鼠标位置相对于客户区的鼠标坐标。             BOOL bAllowInvert = FALSE,//如果此参数为TRUE,则矩形可沿x轴,或y轴反转;否则,此参数为FALSE            CWnd* pWndClipTo = NULL//绘制操作将要被剪贴到的窗口。如果该参数为NULL,则pWnd用作剪贴矩形。           );

     

     

    CRectTracker::GetTrueRect

    void GetTrueRect( LPRECT lpTrueRect ) const; 用于返回,m_Trect现在的大小及位置,用于重绘

    void CCorrectiondlg::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default CDC * dc = this->GetDC(); ASSERT_VALID(dc); CBrush *pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH)); //透明画刷 CBrush *OpBrush=dc->SelectObject(pBrush); m_trect.m_rect.NormalizeRect(); if (m_trect.HitTest(point)>=0) { // pDoc->m_trect.Draw(dc); m_trect.Track(this,point,TRUE); m_trect.GetTrueRect(&m_rect[m_counter]); m_trect.GetTrueRect(&m_rect_show[m_counter]); dc->Rectangle(&m_rect_show[m_counter]); } Invalidate(FALSE); } } dc->SelectObject(OpBrush); CDialog::OnLButtonDown(nFlags, point); }

     

    下面的代码是上面blog牛人写的代码

    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); }

     

     

    CRectTracker::TrackRubberBand

    BOOL TrackRubberBand( CWnd* pWnd, CPoint point, BOOL bAllowInvert = TRUE );

    编译运行,当你按下鼠标并拖动,你将看到效果了。 我们如何让鼠标画一个“橡皮筋”区域呢? 在CRectTracker类中的成员函数就是:TrackRubberBand(this,point,TRUE); 注意其中的三个参数: 第一个参数,画“橡皮筋”的窗体的指针,当然是this 第二个参数,画“橡皮筋”的起始点。 让我们注意第三个参数,它非常有意思。当你使用 FALSE时(TRUE 值是缺省的),你的“橡皮筋”只能从左上到右下的画,不允许反向。编译运行一下FALSE这个值。 特别值得注意的是:在TrackRubberBand的过程中是以右键的抬起为结束的,这其间并没有CView的MouseMove发生。这一点一定要记住!

     

    CRectTracker::Draw

    void Draw( CDC* pDC ) const;该函数将真正画出矩形框,如果调用该函数,那么m_Trect将不会被汇出。如果只需要画一个矩形虐内部的椭圆,则用GetTrueRect获取区域后绘出椭圆即可,无需将m_Trect绘出。


    最新回复(0)