CRect

CRect

CRect類與Windows RECT結構相似,並且還包括操作CRect對象和Windows RECT結構的成員函式。在傳遞LPRECT,LPCRECT或RECT結構作為參數的任何地方,都可以傳遞CRect對象來代替。

基本介紹

  • 外文名:CRect
  • 傳遞:傳遞CRect對象來代替
  • 包括:操作CRect對象
  • 包含:bottom右下角Y坐標
CRect類介紹,CRect類成員,構造函式,操作函式,運算符,案例,原型一:,原型四:,原型五:,

CRect類介紹

這個類是從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

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的常用類,十分基礎,故整理出來以供參考。
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
+、-、&、|和上面的類似,就不再詳細講解了。

相關詞條

熱門詞條

聯絡我們