CRect
CRect
CRect類與Windows RECT結構相似,並且還包括操作CRect對象和Windows RECT結構的成員函數。在傳遞LPRECT,LPCRECT或RECT結構作為參數的任何地方,都可以傳遞CRect對象來代替。
目錄
CRect CRect類是MFC的常用類,十分基礎,故整理出來以供新手參考。
默認坐標系:原點為左上角,右邊為x軸正方向,下邊為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);
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。
CSizeSize( ) 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);
CBrushbrush(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);
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);
CPenpen(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]