一、CRect类介绍

  
  CRect类与Windows RECT结构相似,并且还包括操作CRect对象和Windows RECT结构的成员函数。
  在传递LPRECT,LPCRECT或RECT结构作为参数的任何地方,都可以传递CRect对象来代替。
  注意:这个类是从tagRECT结构派生而来的。(tagRECT是RECT结构的不太常用的别名。)这意味着RECT结构的数据成员(left,top,right,和bottom)也是CRect的可访问数据成员。
  一个CRect包含用于定义矩形的左上角和右下角点的成员变量。
  当指定一个CRect时,必须谨慎地构造它,以使它符合规范——也就是说,使其左坐标值小于右坐标值,使顶坐标值小于底坐标值。例如,左上角为(10,10),右下角为(20,20)就定义了一个符合规范的矩形,但是左上角为(20,20)而右下角为(10,10)的值就定义了一个不符合规范的矩形。如果矩形是不符合规范的,则CRect的许多成员函数都会符合不正确的结果。(参见CRect::NormalizeRect可以得到这些函数的列表。)在你调用一个要求符合规范的矩形的函数之前,你可以通过调用NormalizeRect函数来使不符合规范的矩形成为符合规范的矩形。
  当用成员函数CDC::DPtoLP和CDC::LPtoDP来处理CRect时要小心。如果显示环境的映射模式y-extent是负的,就像在MM_LOENGLISH中一样,则CDC::DPtoLP将转换CRect,以使它的顶部坐标大于底部坐标。然后像Height和Size这样的函数将返回负值作为转换后的矩形的高度,则此矩形将是不符合规范的。
  当使用重载的CRect操作符时,第一个操作数必须是一个CRect;第二个操作数可以是一个RECT结构或一个CRect对象。
  #include <afxwin.h>
  请参阅:CPoint, CSize, RECT
  CRect类成员
  构造
  CRect 构造一个CRect对象
  运算
  Width 计算CRect的宽度
  Height 计算CRect的高度
  Size 计算CRect的大小
  TopLeft 返回CRect的左上角点
  BottomRight 返回CRect的右下角点
  CenterPoint 返回CRect的中心点
  IsRectEmpty 确定CRect是否是空的。如果CRect的宽度和/或高度为0,则它是空的
  IsRectNull 确定CRect的top,bottom,left,和right是否都等于0
  PtInRect 确定指定的点是否在CRect之内
  SetRect 设置CRect的尺寸
  SetRectEmpty 设置CRect为一个空的矩形(所有的坐标都等于0)
  CopyRect 将一个源矩形的尺寸拷贝到CRect
  EqualRect 确定CRect是否等于给定的矩形
  InflateRect 增加CRect的宽度和高度(保证矩形中心位置不变,向四周各扩大参数单位)
  DeflateRect 减少CRect的宽度和高度
  NormalizeRect 使CRect的高度和宽度返回规范
  OffsetRect 将CRect移动到指定的偏移
  SubtractRect 从一个矩形中减去另一个矩形
  IntersectRect 设置CRect等于两个矩形的交集

  UnionRect 设置CRect等于两个矩形的并集

MoveToX  将矩形平移到其left与参数位置相同

MoveToXY  以此类推

MoveToY   以此类推

  运算符
  operator LPCRECT 将一个CRect转换为一个LPCRECT
  operator LPRECT 将一个CRect转换为一个LPRECT
  operator = 将一个矩形的尺寸拷贝到CRect
  operator == 确定CRect是否与一个矩形相等
  operator != 确定CRect是否不等于另一个矩形
  operator += 使CRect增加指定的偏移,或使CRect放大
  operator -= 从CRect中减去指定的偏移,或缩小CRect
  operator &= 设置CRect等于CRect和某个矩形的交
  operator |= 设置CRect等于CRect和某个矩形的并
  operator + 增加给定偏移量到CRect,并返回得到的CRect对象
  operator - 从CRect中减去给定偏移量,并返回得到的CRect对象
  operator & 创建CRect与某个矩形的交,并返回得到的CRect对象
  operator | 创建CRect与某个矩形的并,并返回得到的CRect对象
  

二、个人心得

  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。
  +、-、&、|和上面的类似,就不再详细讲解了 --------------------- 本文来自 medal003 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/medal003/article/details/38903345?utm_source=copy

RECT类

  rect对象用来存储一个矩形框的左上角坐标、宽度和高度。

描述矩形的宽度、高度和原点。

命名空间:  System.Windows
程序集:  System.Windows(在
System.Windows.dll 中)

句法

  class Rect

成员表

  


构造函数

描述

Rect::Rect()

创建一个矩形对象,矩形左上角的横坐标、纵坐标以及矩形的宽度、高度均为零。这是默认的构造函数

Rect::Rect(point&,size&)

创建一个矩形对象,用Point对象来初始化矩形左上角的横坐标和纵坐标,用size对象来初始化矩形的高度和宽度

Rect::Rect(INT,INT,INT,INT)

创建一个矩形对象,通过使用四个整数来初始化矩形左上角的横坐标、纵坐标以及矩形的高度、宽度

类成员函数

描述

Rect::Clone

该函数用来创建一个与当前矩形对象相同的矩形对象

Rect::contains(point&)

该函数用来决定该点是否在此矩形框内

Rect::contains(rect&)

该函数用来决定另一个矩形框是否在这个矩形框内

Rect::contains(INT,INT)

该函数用来决定点(x,y)是否在此矩形框内

Rect::equals

该函数用来判定量矩形对象是否相等

Rect::getbottom

该函数用来获取矩形框底部边缘的y值

Rect::getbounds

该函数用来为这个矩形框创建一个副本

Rect::getleft

该函数用来获取矩形框左边缘的x值

Rect::getlocation

该函数用来获取矩形框左上角的坐标

Rect::getright

该函数用来获取矩形框右边缘的x值

Rect::getsize

该函数用来获取矩形框的宽度和高度

Rect::gettop

该函数用来获取矩形框左边缘的y值

Rect::inflate(INT,INT)

该函数通过dx在左右边框上扩大该矩形框,通过dy在上下边框上扩大该矩形框

Rect::inflate(point&)

该函数通过point.x的值在左右边框上来扩大该矩形框,通过point.y的值在上下边框上来扩大该矩形框

Rect::intsect(rects&;rects&;rects&)

该函数用来确定两个矩形框的交集,并将这一结果储存在一个rect对象中

Rect::intsect(rects&)

该函数用来将此矩形框与另一矩形框的交集来替换这一矩形框

Rect::intersectwith

该函数用来判断该矩形框是否与另一个矩形框相交

Rect::isemptyarea

该函数用来该矩形框是否为空

Rect::offset(INT,INT)

该函数用来移动此矩形框,通过水平的移动dx距离,以及垂直移动dy距离

Rect::offset(point&)

该函数用来水平地移动该矩形框point.x距离,以及垂直地移动该矩形框point.y距离

Rect::union

该函数用来决定两个矩形的合并,并将结果保存在一个rect对象中

编辑本段RECT

  rect结构定义了一个矩形框左上角以及右下角的坐标

  typedef struct _RECT {

  LONG left;

  LONG top;

  LONG right;

  LONG bottom;

  } RECT, *PRECT;

成员

  left : 指定矩形框左上角的x坐标

  top: 指定矩形框左上角的y坐标

  right: 指定矩形框右下角的x坐标

  bottom:指定矩形框右下角的y坐标

  备注:

  当rect传递给fillrect函数时,该矩形框将被填充满,但不包括右栏和底行的像素。

  该结构与rectl结构是同一结构。

编辑本段RECT的特点与操作命令

RECT的特点

  —-RECT既是个特别的数据结构,又是个函数,他的作用就是定义一个矩形区域对象,而作为函数使用时他能用两个属性(Tpiont型)指明区域范围,同时也可分解成四个单一的变量类型(Integer型),即:

  topleft:左上角坐标(Tpiont型变量);

  bottomright:右下角坐标(Tpiont型变量);

  topleft.x或left:左上角横坐标;

  topleft.y或top:左上角纵坐标;

  bottomright.x或right:右下角横坐标;

  bottomright.y或bottom:右下角纵坐标。

  —-例如,下面三种方法定义一个相同的RECT变量:

  Rect(10,10,110,210);

  topleft:=Piont(10,10);

  bottomright:=Point(110,210);

  left:=10;top:=10;right:=110;Bottom:=210;

  —-下面的代码在Form1窗体上定义一个RECT矩形并用红色填充:

  var

  NewRect: TRect;

  begin

  NewRect := Rect(20, 30, 50, 90);

  Form1.Canvas.Brush.Color := clRed;

  Form1.Canvas.FillRect(NewRect);

  end;

  —-从上面能看出,RECT只是个通用变量,他并不属于所有控件本身,定义之后可由所有具有CANVAS属性的控件使用,以指明某控件表面的一个矩形区域,并且程式运行过程中可随意修改尺寸和位置。

RECT操作命令

  Rect(x1,y1,x2,y2):定义Rect区域范围。

  FillRect(rect:Trect):用填充色填充Rect区域。

  FloodFill:用填充色填充Rect之外区域。

  textrect(Rect:TRect;X,Y:Integer;constText:string):在Rect对象中显示文本,其中的X、Y为显示文本的坐标值,是相对于画布的坐标而不是相对于RECT的坐标;const为显示的字符个数;string为待显示的字符串,只有在RECT内的字符才能显示出来,超出部分不显示。

  stretchdraw(constRect:TRect;Graphic:TGraphic):把图像文件填充到Rect之中,并且图像按RECT的尺寸自动伸缩,其中的Graphic可为BMP或ICO等图像资源。

  font.size:定义画布上显示文字的尺寸。

  font.color:定义画布上显示文字的颜色。

  textwidth:返回字符串的长度。

  textheight:返回字符串的高度。

  Brush.Color:定义画布的填充颜色。

  Copyrect(Dest:TRect;Canvas:Tcanvas;Source:TRect):把图像从一个矩形中拷到另一个矩形之中,并且按目标矩形尺寸自动伸缩,其中,Dest为目标画布矩形,Canvas为源画布,Source为源矩形。

  —-由于上述命令均是基于画布本身使用的,所以具体使用时必须加上控件及画面属性,例如下面的代码:

  var

  TheRect: TRect;

  begin

  TheRect.Top := 10;

  TheRect.Left := 10;

  TheRect.Bottom := 100;

  TheRect.Right := 100;

  Form1.Canvas.TextRect(TheRect,0,0,’’Hello,

  world!’’);

  end;

MFC Rect 的详解相关推荐

  1. 【转】MFC消息映射详解(整理转载)

    消息:主要指由用户操作而向应用程序发出的信息,也包括操作系统内部产生的消息.例如,单击鼠标左按钮,windows将产WM_LBUTTONDOWN消息,而释放鼠标左按钮将产生WM_LBUTTONUP消息 ...

  2. 【MFC】MFC工程文件详解

    00. 目录 文章目录 00. 目录 01. 概述 02. 解决方案相关文件 03. 工程相关文件 04. 头文件和源文件 05. 资源文件 06. 预编译头文件 07. 编译目标和中间文件 08. ...

  3. MFC之CAsyncSocket详解

    CAsyncSocket类是从Object类派生而来.CAsyncSocket对象称为异步套接字对象 使用CAsyncSocket进行网络编程,可以充分利用Windows操作系统提供的消息驱动机制,通 ...

  4. MFC Afx*.h 详解

    Afx前缀是微软MFC一个bai小组的名称du简写,并没有别的意义. MFC的很dao多代码,zhuan包括全局函数名.宏.shu头文件名都使用了"Afx". Afx*.h是一组M ...

  5. MFC之CRect详解

    2023年4月25日,周二晚上. 今天查了不少关于CRect类及其相关内容的资料,学到了不少东西,所以我决定写一篇详细的关于CRect类及其相关内容的文章,以记录今天所学. CRect类 在 MFC ...

  6. 【MFC】BitBlt详解

    设备上下文绘图有很多种方法.例如通过创建位图画刷,利用其填充一个区域来实现图像的绘制.此外,还可以使用CDC类的位图函数来输出位图到设备上下文中. BitBlt 用于从原设备中复制位图到目标设备,语法 ...

  7. MFC RadioButton用法详解

    基础介绍: radio button通常都是成组使用的,在一组里面是互斥的. 分组的原则是: 1.首先将RadioButton控件定好Tab顺序,具体方法:工具栏"格式"-> ...

  8. 【数字图像处理】三.MFC实现图像灰度、采样和量化功能详解

    本文主要讲述基于VC++6.0 MFC图像处理的应用知识,主要结合自己大三所学课程<数字图像处理>及课件进行讲解,主要通过MFC单文档视图实现显示BMP格式图片,并通过Bitmap进行灰度 ...

  9. MFC实现图像灰度、采样和量化功能详解

    本文主要讲述基于VC++6.0 MFC图像处理的应用知识,主要结合自己大三所学课程<数字图像处理>及课件进行讲解,主要通过MFC单文档视图实现显示BMP格式图片,并通过Bitmap进行灰度 ...

最新文章

  1. SpringCloud系列——Zuul 动态路由
  2. micro850通讯协议msg_micro850通讯协议msg_半导体semi通讯的协议SECS/GEM
  3. 2013/8月读书计划
  4. Topcoder SRM 648 (div.2)
  5. object.prototype.call
  6. Docker网络代理配置
  7. shell 12 21 filename重定向的含义和区别
  8. 电脑网络怎么添加计算机,Win10系统如何添加网络共享打印机
  9. vue入门学习篇——父子组件通信
  10. 前方高能!java并发编程实战百度网盘
  11. ClockworkMod Tether Alpha:避开运营商,将手机变为热点
  12. unity3d 注册表 Regedit
  13. Godaddy Web Hosting http 重定向至 https协议
  14. 城市打印店一般几点开门?
  15. TP50、TP90、TP99的理解和使用
  16. 计算机efs加密,2分钟让你学会电脑EFS文件加密
  17. 2022-10-17 环境映射
  18. 睡前必备神器——倒计时定时关闭手机音乐声音APP
  19. web前端高级必备面试资料
  20. Google GMS 包相关APK ANR 解决方案

热门文章

  1. ELK日志分析平台(二)----logstash数据采集
  2. 考研加油站系统的设计与实现
  3. python标准图形库——turtle
  4. 计算机视觉在农业领域中的应用
  5. 关于选项卡的切换——JS实现
  6. 教你用微信带称呼群发祝福
  7. 超实用带格子的便签 便签格子的用法
  8. 微信小程序万里目_微信小程序加盟千万别忘了几个基本要求
  9. 壳聚糖导管复合辛伐他汀/泊洛沙姆407水凝胶/负载转化生长因子β1温敏性壳聚糖水凝胶的制备
  10. 小程序开发教程,适合小白哦