2001年05月11日 12:46:00
CRectTracker类的使用 CRectTracker(俗称“橡皮筋”类)是一个非常有意思的类。你在Windows中经常看到这样的情况:它可以用做显示边界,你也可以扽它的八个角用来放大缩小,或做框选使用。如何通过编程来实现这种功能呢?这就是CRectTracker类的作用; CRectDoc::CRectDoc() { // TODO: add one-time construction code here m_rectTracker.m_rect.SetRect(0,0,100,100); m_rectTracker.m_nStyle=CRectTracker::resizeInside|CRectTracker::dottedLine; } 其中: m_rect是CRectTracker中用来控制四边形的大小位置的数据成员, SetRect使用的是View的坐标; m_nStyle是CRectTracker的类型,其中:CRectTracker::resizeInside和CRectTracker::resizeOutside是说明在m_rect的内部还是外部画区域(它们是互异的),CrectTrakcer::dottedLine是用点划线来画四边形的区域边界。 其他的值还有: CRectTracker::solidLine:用来画实线边界;(和dottedLine是互异的) CRectTracker::hatchedBorder:边界带抛面线; CRectTracker::hatchInside:内部带抛面线; 你可以运行前面的例子,上述参数都有使用。你也可以在第二步中逐一使用它们来加深理解它们各自的含义; 第二步: 接着我门在视图中画一个蓝色的椭圆; 在CRectView的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- 注释已经在程序里了,不用再多说,编译一下。一个椭圆外带四边形边界(点划线),且四边形的四周有八个黑点;这就是CRectTracker.,你现在可以改变一下m_nStyle试试看各参数的含义;
可以看出,返回值如果大于等于零则在四边形区域之内。如果小于则说明不在区域范围之内。因此我们需要加一个公有的成员函数: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- 0) //不在四边形区域内; { CRectTracker temp; temp.TrackRubberBand(this,point,TRUE); temp.m_rect.NormalizeRect(); CRectTracker interRect; //在建立一个CRectTracker;用于记录鼠标与椭圆的交集。 if(interRect.m_rect.IntersectRect(temp.m_rect,GetDocument()- 你也许会问,为什么我没有编写MouseMove函数,它就自动的变大小了呢?这就是Track()函数的功劳,从调用它到抬起鼠标键为止,它时刻的改变m_rectTracker的四边形的大小。然后由于我们使用了Invalidate()函数,所以重新画了这个椭圆,因此它好象被放大缩小了似的。 我的文章写完了,还有什么不懂的地方,写信给我。在关闭这个文件之前,最好你自己再复习一下,并尝试一下其他的功能。 |
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=3456