CRect类基本介绍

//本文来自http://baike.baidu.com/view/2406388.htm
CRect类是MFC的常用类,十分基础,故整理出来以供新手参考。
  我用金山快译查了一下没有rect这个单词,估计是rectangle的简写,rectangle是长方形、矩形的意思。
  默认坐标系:原点为左上角,右边为x轴正方向,下边为y轴正方向。
  构造函数(CRect)有五个原型,第二个原型和第三个原型是拷贝构造函数。现在我用其它三个构造函数构造一个左上角坐标为(10,20),x方向边长为100,y方向边
  长有200的矩形。
  原型一:
  CRect r1(10,20,110,220);
  原型四:
  POINT pt = {10,20};
  SIZE size = {100,200};
  CRect r2(pt,size);
  原型五:
  POINT topLeft = {10,20};
  POINT bottomRight = {110,220} ;
  CRect r3(topLeft,bottomRight);
  下面的代码可以查一个矩形的大小,新建一个单文档工程Sdi,修改OnDraw函数:
  void CSdiView::OnDraw(CDC* pDC)
  {
  CSdiDoc* pDoc = GetDocument();
  ASSERT_VALID(pDoc);
  CRect r1(10,20,110,220);
  pDC->Rectangle(&r1);
  }
  int Width( ) const;
  取得宽度,int iWidth = r1.Width();iWidth的会上为100。
  int Height( ) const;
  取得高度,int iHeight = r1.Height();iHeight的结果是200。
  CSize Size( ) const;
  取得宽和高,CSize size = r1.Size();size.cx为100,size.cy为200。
  CPoint& TopLeft( );
  取得左上角的坐标,由于返回值是引用,所以可以通过此函数的返回值,修改左上角。
  CRect r1(10,20,110,220);
  r1.TopLeft().x = 0;
  r1.TopLeft().y = 0 ;
  r1的左上角坐标变为(0,0),也可以通过此函数取得左上角的坐标。
  CRect r1(10,20,110,220);
  CPoint TopLeft = r1.TopLeft();
  TopLeft.x的值为10,TopLeft.y的值为20。
  BottomRight取得右下角坐标
  CPoint CenterPoint( ) const;取得中心得的坐标,CPoint pt = r1.CenterPoint();pt为(60,120)。
  BOOL IsRectEmpty( ) const;如果长席或宽度为0或非法,返回真;否则返回假。
  CRect r1(210,20,110,220);
  bool bEmpty = r1.IsRectEmpty();
  结果为真,因为左边比右边还大。
  CRect::IsRectNull,四个边的坐标都为0,结果为真,否则为假。
  BOOL PtInRect( POINT point ) const;查看一个点是否在矩形内。
  CRect r1(10,20,110,220);
  POINT pt1={10,10};
  POINT pt2={10,30};
  bool bIn1 = r1.PtInRect(pt1);
  bool bIn2 = r1.PtInRect(pt2);
  bIn1为假,bIn2为真。
  CRect::SetRect,设置四个边的值,用法类似于构造函数的原型一。
  CRect::SetRectEmpty,将四个边的坐标设置为0。
  void CopyRect( LPCRECT lpSrcRect );复制。
  CRect r2;
  r2.CopyRect(&r1);
  r2的值和r1的值相同。
  CRect::EqualRect,两个矩形是不是相同,四边坐标必须相同。
  CRect r1(10,20,110,220);
  CRect r2(110,220,10,20);
  bool bEqual = r1.EqualRect(r2);
  bEqual的值为假,因为他们的上下左右边不同,是反过来的。
  CRect r1(110,220,10,20);
  CRect r2(110,220,10,20);
  bool bEqual = r1.EqualRect(r2);
  bEqual为真,因为四边相同。
  CRect::InflateRect,增加宽和高。
  CRect r(0,0,0,0);
  r.InflateRect(2,3);//结果为(-2,-3,2,3);
  SIZE size = {3,2};
  r.InflateRect(size);//结果为(-5,-5,5,5);
  CRect r1(-5,-5,-5,-5);
  r.InflateRect(&r1);//结果为(0,0,0,0);
  //左边左移-1(右移1),上边上移-1,右边右移2,下边下移2
  r.InflateRect(-1,-1,2,2);//结果为(1,1,2,2);
  CRect::DeflateRect,减少宽和高,方法与InflateRect类似。
  CRect::NormalizeRect,标准化,调整上下边和左右边,使得符合人类逻辑。
  CRect r(10,10,0,0);
  r.NormalizeRect();
  结果为(0,0,10,10)
  CRect::OffsetRect,移动整个矩形。
  CRect r(0,0,10,10);
  r.OffsetRect(1,1);//右移1,下移1
  POINT point = {1,1};
  r.OffsetRect(point);//再右移1,再下移1
  SIZE size = {-2,-2};
  r.OffsetRect(size);//右移-2,下移-2
  CRect::SubtractRect,lpRectSrc1减去lpRectSrc2,注意不是减号。过程不好表达,运行下面的代码就可以看到效果了。
  void CSdiView::OnDraw(CDC* pDC)
  {
  pDC->SelectStockObject(NULL_BRUSH);
  CRect r1(10,10, 100,100);
  CRect r2(50,10, 150,150);//和CRect r2(50,50, 150,150);结果不一样
  pDC->Rectangle(r1);
  pDC->Rectangle(r2);
  {//红色区域是SubtractRect的结果
  CRect r ;
  r.SubtractRect(r1,r2);
  CBrush brush(RGB(255,0,0));
  pDC->SelectObject(&brush);
  pDC->Rectangle(&r);
  }
  }
  CRect::IntersectRect,求交集
  void CSdiView::OnDraw(CDC* pDC)
  {
  pDC->SelectStockObject(NULL_BRUSH);
  CRect r1(10,10, 100,100);
  CRect r2(50,10, 150,150);//和CRect r2(50,50, 150,150);结果不一样
  pDC->Rectangle(r1);
  pDC->Rectangle(r2);
  {//绿色区域是IntersectRect的结果
  CRect r ;
  r.IntersectRect(r1,r2);
  CBrush brush(RGB(0,255,0));
  pDC->SelectObject(&brush);
  pDC->Rectangle(&r);
  }
  }
  CRect::UnionRect,求并集
  void CSdiView::OnDraw(CDC* pDC)
  {
  pDC->SelectStockObject(NULL_BRUSH);
  CRect r1(10,10, 100,100);
  CRect r2(50,50, 150,150);//和CRect r2(50,50, 150,150);结果不一样
  pDC->Rectangle(r1);
  pDC->Rectangle(r2);
  {//蓝色边框是UnionRect的结果
  CRect r ;
  r.UnionRect(r1,r2);
  CPen pen(PS_DOT,1,RGB(0,0,255));
  pDC->SelectObject(&pen);
  pDC->Rectangle(&r);
  }
  }
  CRect::operator LPCRECT ,转化成LPCRECT类型。
  CRect::operator LPRECT ,转化成LPRECT
  CRect r(0,0,100,100);
  LPCRECT pCRect = r;
  LPRECT pRect = r;
  第二行会调用LPCRECT操作符,第三行调用LPRECT操作符。
  typedef const RECT* LPCRECT; // pointer to read/only RECT
  typedef struct tagRECT
  {
  LONG left;
  LONG top;
  LONG right;
  LONG bottom;
  } RECT, *PRECT, NEAR *NPRECT, FAR *LPRECT;
  CRect::operator = ,重载“=”运算符,实际调用CopyRect。
  CRect::operator ==,重载“==”运算符,实际调用EqualRect。
  operator !=,重载“!=”运算符,实际调用EqualRect。
  CRect::operator += ,重载“+=”运算符,第一个原型和第二个原型调用OffsetRect,第三个原型调用InflateRect。
  CRect::operator -=,重载“-=”运算符,第一个原型和第二个原型调用OffsetRect,第三个原型调用InflateRect。
  CRect::operator &=,重载“&=”运算符,实际调用IntersectRect。
  CRect::operator |= 重载“|=”运算符,实际调用UnionRect。
  +、-、&、|和上面的类似,就不再详细讲解了。

VC中的CRect类相关推荐

  1. 在vc++中,资源和类有怎样的关系?

    严格的讲,资源不属于某一个类.资源是属于整个工程.在整个工程中,任何地方都可以通过指针.类对象声明.资源ID号.使用头文件.引用宏.使用资源序号.调用动态库文件等方式,来使用这些资源.对话框资源,要使 ...

  2. VC中新建的类不见了的解决方法

    方法 工程(project,然后add to project 然后 files,把不见得类.cpp和.h文件包含进来 或者 1.关闭工程 2.把.ncb和.clw文件删除 3.  重新打开工程

  3. VC中CList用法

    初学mfc者,往往对CList等mfc的Collect类的使用感到迷惑,在使用中经常会遇到许多问题,导致对vc中的Collect类的使用产生了惧怕.以下,就个人经历而言,告诉大家如何使用CList. ...

  4. VC++中使用使用winnet类获取网页内容

    2005-09-01 VC++中使用使用winnet类获取网页内容 - [VC专栏] 微软提供的Winnet类是一个应用层的网络通信组件, 它可以使你的应用程序很容易的实现http.ftp.gophe ...

  5. VC中海量文件读写类设计与应用(转)

    VC中海量文件读写类设计与应用   沈瑞冰 摘要 本文阐述了海量文件读写的一般方法,并分析了该方法中存在的内存耗尽问题和解决办法,并就此设计了一个海量文件读写类,封装了海量文件读写操作,最后给出了一个 ...

  6. VC中海量文件读写类设计与应用

    VC中海量文件读写类设计与应用 文件操作是应用程序最为基本的功能之一,Win32 API和MFC均提供有支持文件处理的函数和类,常用的有Win32 API的CreateFile().WriteFile ...

  7. VC++----CRect类

    这个类是从tagRECT结构派生而来的.(tagRECT是RECT结构的不太常用的别名.)这意味着RECT结构的数据成员(left,top,right,和bottom)也是CRect的可访问数据成员. ...

  8. VC++ CRect类说明

    这个类是从tagRECT结构派生而来的.(tagRECT是RECT结构的不太常用的别名.)这意味着RECT结构的数据成员(left,top,right,和bottom)也是CRect的可访问数据成员. ...

  9. vc中操作Xml--使用CMarkup类

    DotNet中使用xml相对比较轻松,在vc中操作xml,有些繁琐.最近在网络上得知CMarkup比较好用,于是试了下,还好,就把部分例子写出来.以后有时间的话,再写清楚点. //---------- ...

最新文章

  1. 也分享一个存储过程代码生成器 开源
  2. 编写纳新网站后端的相关知识总结
  3. 【摄影测量原理】第三章:双像立体测图
  4. 【Java】封装带有泛型的序列化文件工具类
  5. httpd-2.2.21 + php-5.3.8 自动安装脚本
  6. python unescape函数_Python中的Unescape字符串
  7. node.js中的文件系统
  8. 1核1g java_wordpress博客1核1G1M够用吗
  9. 贪心算法——数列极差
  10. 前端遮罩层实现_cocos creator--游戏开奖功能组件《刮刮卡》特效实现
  11. ERP系统BOM详细解析(一)
  12. C# Email发送邮件
  13. 宝藏 窗帘 窗布VRay材质球素材推荐
  14. 双臂UR5的Gazebo配置
  15. H5页面拉起指定app或跳转到应用市场下载
  16. C语言中的fprintf函数
  17. Linux运维之系统服务及远程服务器 SSH
  18. 做到这四点,团队必定飞速成长
  19. password has expired问题
  20. 七月集训day18树

热门文章

  1. Matlab非线性规划之fmincon()函数
  2. 树莓派无法打开摄像头的问题
  3. linux 宏碁 删除分区,宏碁电脑版本安装ubuntu
  4. 图像处理之图像的离散余弦变换
  5. VOT调试 Trax配置问题(D3S)
  6. CrashHandler--程序异常退出处理
  7. python车牌识别算法_python实现车牌识别的示例代码
  8. MUI开发记录——我的考勤
  9. 广度优先搜索[新手易懂]
  10. 【挨踢人物传】岳雷:“诲人不倦,成全了你也陶冶了我”(第六期)