CRect类

简介:
这个类是从tagRECT结构派生而来的。(tagRECT是RECT结构的不太常用的别名。)这意味着RECT结

构的数据成员(left,top,right,和bottom)也是CRect的可访问数据成员。left左上角X坐标,

top左上角Y坐标,right右下角X坐标,bottom右下角Y坐标。[1]
一个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>

操作函数:

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的常用类,十分基础,故整理出来以供新手参考。
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 += ,重载“+=”运算符,CRect::operator -=,重载“-=”运算符 第一个原型

和第二个原型调用OffsetRect,第三个原型调用InflateRect。
CRect::operator &=,重载“&=”运算符,实际调用IntersectRect。
CRect::operator |= 重载“|=”运算符,实际调用UnionRect。
+、-、&、|和上面的类似,就不再详细讲解了。

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页