1. 程式人生 > >ghevinn歡迎您光臨

ghevinn歡迎您光臨

簡介:
這個類是從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。
+、-、&、|和上面的類似,就不再詳細講解了。