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绘出。