首页 crect类[感悟]

crect类[感悟]

举报
开通vip

crect类[感悟]crect类[感悟] CRect类 CRect [编辑本段]一、CRect类介绍 CRect类与Windows RECT结构相似,并且还包括操作CRect对象和Windows RECT结构的成员函数。 在传递LPRECT,LPCRECT或RECT结构作为参数的任何地方,都可以传递CRect对象来代替。 注意:这个类是从tagRECT结构派生而来的。(tagRECT是RECT结构的不太常用的别名。)这意味着RECT结构的数据成员(left,top,right,和bottom)也是CRect的可访问数据成员。...

crect类[感悟]
crect类[感悟] CRect类 CRect [编辑本段]一、CRect类介绍 CRect类与Windows RECT结构相似,并且还包括操作CRect对象和Windows RECT结构的成员函数。 在传递LPRECT,LPCRECT或RECT结构作为参数的任何地方,都可以传递CRect对象来代替。 注意:这个类是从tagRECT结构派生而来的。(tagRECT是RECT结构的不太常用的别名。)这意味着RECT结构的数据成员(left,top,right,和bottom)也是CRect的可访问数据成员。 一个CRect包含用于定义矩形的左上角和右下角点的成员变量。 当指定一个CRect时,必须谨慎地构造它,以使它符合 规范 编程规范下载gsp规范下载钢格栅规范下载警徽规范下载建设厅规范下载 ——也就是说,使其左坐标值小于右坐标值,使顶坐标值小于底坐标值。例如,左上角为(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 请参阅: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等于两个矩形的并集 运算符 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,减少宽和高, 方法 快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载 与InflateRect类似。 CRect::NormalizeRect, 标准 excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载 化,调整上下边和左右边,使得符 合人类逻辑。 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。 +、-、&、|和上面的类似,就不再详细讲解了。 [1]
本文档为【crect类[感悟]】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_358746
暂无简介~
格式:doc
大小:29KB
软件:Word
页数:0
分类:生活休闲
上传时间:2017-10-11
浏览量:8