原文链接地址:http://www.vckbase.com/index.php/wv/133

CRectTracker(俗称“橡皮筋”类)是一个非常有意思的类。你在Windows中经常看到这样的情况:它可以用做显示边界,你也可以扽它的八个角用来放大缩小,或做框选使用。如何通过编程来实现这种功能呢?这就是CRectTracker类的作用;

(框选)                         (显示边界并可以缩放)

你打开上面的那个工程文件,编译运行一下。你将看到CRectTracker的几种功能;

下面让我们来从头做一个新的工程文件,来慢慢掌握它的功能吧。

建立一个单文档的工程文件,将其命名为Rect。单击finish完成工程的建立;先编译一下,来第一次生成obj文件吧,在它生成的过程中,我们继续往下讲解;

第一步:

在CRectDoc类中生成一个公有的数据成员:m_rectTracker;之所以设成公有,因为要在View中调用它。接着我们来初始化它,在CRectDoc::CrectDoc构造函数中:

CRectDoc::CRectDoc()
{ // TODO: add one-time construction code herem_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->SelectObject(&brush);//将画刷选进dc;
     CRect rect; //GetTrueRect(&rect)得到CRectTracker中的m_rect的大小,将其传递给rect;pDoc->m_rectTracker.GetTrueRect(&rect);pDC->Ellipse (rect);//画椭圆; //Draw tracking rectangle. pDoc->m_rectTracker.Draw(pDC);//这句画才真正的将这个四边形画出来;//Select blue brush out of device context.pDC->SelectObject (oldBrush);//恢复原来的画刷;
}

注释已经在程序里了,不用再多说,编译一下。一个椭圆外带四边形边界(点划线),且四边形的四周有八个黑点;这就是CRectTracker.,你现在可以改变一下m_nStyle试试看各参数的含义;

第三步:如何象例子中的那样随着鼠标的移动自动在椭圆的周围改变光标呢?很简单只要将下面的代码加入到CRectView::OnSetCursor()就可以了:它调用了CRectTracker中的SetCursor()函数:

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

编译运行一下,鼠标变化了。 第四步:我们再做另一个用于鼠标的CRectTracker类。它的作用是在鼠标按下以后可以显示虚线的选择框: 先让我们看看效果:

在CRectView中的加入如下代码:

void CRectView::OnLButtonDown(UINT nFlags, CPoint point)
{ CRectTracker temp; temp.TrackRubberBand(this,point,TRUE); temp.m_rect.NormalizeRect();//正规化;
    CView::OnLButtonDown(nFlags, point);
}

编译运行,当你按下鼠标并拖动,你将看到效果了。
我们如何让鼠标画一个“橡皮筋”区域呢? 在CRectTracker类中的成员函数就是:TrackRubberBand(this,point,TRUE); 注意其中的三个参数:

第一个参数,画“橡皮筋”的窗体的指针,当然是this

第二个参数,画“橡皮筋”的起始点。

让我们注意第三个参数,它非常有意思。当你使用 FALSE时(TRUE 值是缺省的),你的“橡皮筋”只能从左上到右下的画,不允许反向。编译运行一下FALSE这个值。

特别值得注意的是:在TrackRubberBand的过程中是以右键的抬起为结束的,这其间并没有CView的MouseMove发生。这一点一定要记住!这时鼠标画过的区域已经记录在temp的m_rect 中了,你可以根据它进行后续的判断工作。至于下面的正规化语句函数的作用与CRect中的正规化函数的作用一致:使四边形的四个角的坐标符合右大于左,底大于顶的坐标值。它主要是为了防止你使用TrackRubberBand 的FALSE参数而引起的可能出现的错误。

第五步:

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

返回值

代表的含义

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

可以看出,返回值如果大于等于零则在四边形区域之内。如果小于则说明不在区域范围之内。因此我们需要加一个公有的成员函数:BOOL bDraw;为了方便起见,我把它加到CRectView中,(你也许会说,为什么不加到doc中,我也知道这有勃编程的原理,反正我高兴就得,都说C++给人了很大的自由度,所以你也别限制我)。先把它初始化为FALSE,表示不画边界,当TRUE时,表示要画边界。 定义:

class CRectView : public CView
{…………public:BOOL bDraw;…….
}
初始化:
CRectView::CRectView()
{// TODO: add construction  code herebDraw=FALSE;
}
将OnDraw改一下,加一句话:
void CRectView::OnDraw(CDC* pDC)
{CRectDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for  native data hereCBrush 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 defaultint 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()函数,所以重新画了这个椭圆,因此它好象被放大缩小了似的。 我的文章写完了,还有什么不懂的地方,写信给我。在关闭这个文件之前,最好你自己再复习一下,并尝试一下其他的功能。

转载于:https://www.cnblogs.com/wuyuan2011woaini/p/5417575.html

CRectTracker类的使用相关推荐

  1. CRectTracker类的使用方法及其静态库下CRectTracker无法显示鼠标光标解决方案

      一 使用方法 1 定义成员变量 CRectTracker m_RectTracker: 2 构造函数设置样式 m_RectTracker.m_nStyle = CRectTracker::resi ...

  2. CRectTracker(橡皮筋)类的使用

    CRectTracker(俗称"橡皮筋"类)是一个非常有意思的类.你在Windows中,在桌面上用鼠标拖拽,便可以看到一个虚线的矩形框,它便是橡皮筋.它可以用做显示边界,你也可以扽 ...

  3. 橡皮筋类CRectTracker

    橡皮筋类(CRectTracker) Windows自带的画图软件中可以用虚线框选择图像的某个区域,之后便可以拖动.放大.缩小该区域,这是通过橡皮筋类(CRectTracker)来实现的,它将实现用线 ...

  4. 橡皮筋类(CRectTracker)

    Windows自带的画图软件中可以用虚线框选择图像的某个区域,之后便可以拖动.放大.缩小该区域,这是通过橡皮筋类(CRectTracker)来实现的,它将实现用线框选中一个区域,并可以拖动.放大.缩小 ...

  5. 橡皮筋CRectTracker使用心得

    CRectTracker被称作"橡皮筋",是我们再窗口编辑中,选中对象,进一步操作的基础.橡皮筋有两种方法:一.手写橡皮筋,这个在程序中控制也比较好,二.使用CRectTracke ...

  6. VC,MFC开发技巧收集

    (mainmenu->GetSubMenu (0))->DeleteMenu(i,MF_BYPOSITION); break; } } 十五.改变应用程序的图标 缺 十六.另一种改变窗口标 ...

  7. MFC GDI 图形设备接口函数

    图形设备接口 图形设备接口(Graphics Device Interface) MFC的四种DC 常用函数 库存的GDI对象: RGB和YUV颜色空间 CColorDialog 颜色选择通用对话框 ...

  8. QQ截屏完美实现 小结

    QQ截屏的完美模拟 [write by TBWood-小汤 转载请说明出处http://blog.csdn.net/tbwood ] 至现在2011年2月15日,网上仍然没有一个能够在灰暗遮罩的功能上 ...

  9. Jiangsheng的CSDN Digest (Oct 2005)

    CSDN 讨论总结系列: Jiangsheng的CSDN Digest (Dec 2005)(http://blog.csdn.net/jiangsheng/archive/2005/12/24/56 ...

最新文章

  1. UDP,你要耗子喂汁呀!
  2. HTTP/2 与 WEB 性能优化(一)
  3. 在vs2005中使用loki的方法
  4. 【转/TCP协议编程】 基于TCP的Socket 编程
  5. solr查询工作原理深入内幕
  6. 电信运营商计费模型_商客通:南京电信400电话怎么办理更省心
  7. vs2010 asp.net mysql,安装VS2010后,更改iis的asp.net版本 | 吴小强的博客
  8. 从零开始写项目第七篇【搭建Linux环境】
  9. C++ 标准程序库std::string 详解
  10. [Elasticsearch] es 6.8 编译成功
  11. Vue之v-if, v-else, v-show, v-for, v-bind
  12. SpringBoot 整合 JPA
  13. android studio for android learning (一)
  14. html 编辑器插件安装,最新版CKEditor的配置方法及插件(Plugin)编写示例
  15. python运维实战pdf_python运维实例.pdf
  16. java毕业设计新能源汽车故障分析2021Mybatis+系统+数据库+调试部署
  17. Python生成两个随机数,并将生成的数随机组成10道加减乘除基本运算,输入结果判断对错并打分。
  18. 宁芝普拉姆键盘说明书及帮助文档支持宏定义
  19. zabbix 参数 脚本_zabbix 自定义脚本短信报警
  20. roboone机器人_ROBOONE机器人这个品牌怎么样?是否可以加盟投资?

热门文章

  1. 怎么查看WINDOWS端口被哪个程序占用
  2. LeetCode-185 : sql分组排序再取前几位
  3. 粒度计算机英语,An Overview of Granular Computing粒度计算研究综述
  4. php 有趣的php 封装,封装PHP常用的操作类
  5. 2020-11-02 联想 Yoga Duet IML 2020
  6. SM4国密标准 GB/T 32907-2016
  7. 转AndroidThings技术资料
  8. signature=fc89d4352b6699754c14ce282ec75426,Broken chiral symmetry on a null plane
  9. Webappbuilder开发快速预览
  10. ccf小明放学20分_关于完全平方数的好题(20年3月1日)