複製鏈接
請複製以下鏈接發送給好友

CRect

鎖定
CRect類與Windows RECT結構相似,並且還包括操作CRect對象和Windows RECT結構的成員函數。在傳遞LPRECT,LPCRECT或RECT結構作為參數的任何地方,都可以傳遞CRect對象來代替。
外文名
CRect
傳    遞
傳遞CRect對象來代替
包    括
操作CRect對象
包    含
bottom右下角Y座標

CRectCRect類介紹

這個類是從tagRECT結構派生而來的。(tagRECT是RECT結構的不太常用的別名。)這意味着RECT結構的數據成員(left,top,right,和bottom)也是CRect的可訪問數據成員。left左上角X座標,top左上角Y座標,right右下角X座標,bottom右下角Y座標。
一個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

CRectCRect類成員

CRect構造函數

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等於兩個矩形的並集

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案例

構造函數(CRect)有五個原型,第二個原型和第三個原型是拷貝構造函數。用其它三個構造函數構造一個左上角座標為(10,20),x方向邊長為100,y方向邊
長有200的矩形。

CRect原型一

CRect r1(10,20,110,220);

CRect原型四

POINT pt = {10,20};
SIZE size = {100,200};
CRect r2(pt,size);

CRect原型五

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
+、-、&、|和上面的類似,就不再詳細講解了。