MFC中的CRect
CRect
环境VS2013
头文件:#include <afxwin.h>
A CRect object can be passed as a function parameter wherever a RECT structure, LPCRECT, or LPRECT can be passed.
当需要 RECT*、LPCRECT、LPRECT 类型参数传参时,可以直接使用CRect。
因为重载操作符了
operator LPCRECT Converts a CRect to an LPCRECT.
operator LPRECT Converts a CRect to an LPRECT.
常用函数:
Construction
CRect( );
CRect( int l, int t, int r, int b );
CRect( const RECT& srcRect );
CRect( LPCRECT lpSrcRect );
CRect( POINT point, SIZE size );
CRect( POINT topLeft, POINT bottomRight );
例子:
CRect rc1;//VS2013默认构造 0,0,0,0;注:VC6.0 可能不是全0,只是不初始化
CRect rc2(10, 10, 200, 100);
Operations(操作函数)
- 获取宽度、高度
Width()
Height()
Size()
例子:
//宽高
int w = rc2.Width();
int h = rc2.Height();
CSize sz = rc2.Size();//cx:width cy:height
- 获取点坐标
TopLeft() Returns the top-left point of CRect.
BottomRight() Returns the bottom-right point of CRect.
CenterPoint() Returns the centerpoint of CRect. (return CPoint((left+right)/2, (top+bottom)/2);)
- 判断是否为空矩形(一种是全0,一种是面积为0)
IsRectEmpty() Determines whether CRect is empty. CRect is empty if the width and/or height are 0.
IsRectNull() Determines whether the top, bottom, left, and right member variables are all equal to 0.
- 判断 pt 点是否在矩形内(在边界上返回TRUE)
PtInRect(POINT pt) Determines whether the specified point lies within CRect.
- 设置矩形坐标点
void SetRect( int l, int t, int r, int b );
- 放大矩形/缩小矩形
InflateRect(..) Increases the width and height of CRect. void InflateRect( int x, int y ); void InflateRect( SIZE size ); void InflateRect( LPCRECT lpRect ); void InflateRect( int l, int t, int r, int b ); DeflateRect(..) Decreases the width and height of CRect. void DeflateRect( int x, int y ); void DeflateRect( SIZE size ); void DeflateRect( LPCRECT lpRect ); void DeflateRect( int l, int t, int r, int b );
例子:
CRect rc(10, 10, 200, 100); rc.InflateRect(5, 6); // (10-5, 10-6, 200+5, 100+6) --> (5, 4, 205, 106) rc.SetRect(10, 10, 200, 100); rc.InflateRect(1, 2, 3, 4); // (10-1, 10-2, 200+3, 100+4) --> (9, 8, 203, 104) rc.SetRect(10, 10, 200, 100); rc.InflateRect(-5, 6); // (10+5, 10-6, 200-5, 100+6) --> (15, 4, 195, 106) rc.SetRect(10, 10, 200, 100); rc.InflateRect(-5, -6); //相当于缩小矩形 rc.DeflateRect(5, 6); --> (15, 16, 195, 94) rc.SetRect(10, 10, 200, 100); rc.DeflateRect(5, 6); // --> (15, 16, 195, 94) rc.SetRect(10, 10, 200, 100); rc.DeflateRect(1, 2, 3, 4); // (10+1, 10+2, 200-3, 100-4) --> (11, 12, 197, 96)
- 正常化矩形
NormalizeRect() Standardizes the height and width of CRect.
例子:
CRect rect1(110, 100, 250, 310);
CRect rect2(250, 310, 110, 100);
rect1.NormalizeRect();
rect2.NormalizeRect();
// rect1 should be unchanged
// rect2 becomes (110, 100, 250, 310)
ASSERT(rect1 == rect2);
- 平移矩形
void OffsetRect( int x, int y );
void OffsetRect( POINT point );
void OffsetRect( SIZE size );
例子:
CRect rc(10, 10, 200, 100); rc.OffsetRect(5, 6);//left +5, right +5 ; top +6, bottom +6 --> (15, 16, 205, 106) rc.SetRect(10, 10, 200, 100); rc.InflateRect(5, 6);// left -5, right +5 ; top -6, bottom +6 --> (5, 4, 205, 106) //对比 // OffsetRect(x,y) :表示平移,左右的坐标都加x,上下的坐标都加y // InflateRect(x,y):表示放大,左减右加 x,上减下加 y // 另外 void InflateRect( int l, int t, int r, int b ); 可以等价 void OffsetRect( int x, int y ); rc.SetRect(10, 10, 200, 100); rc.InflateRect(-5, -6, 5, 6);//等价 rc.OffsetRect(5, 6); --> (15, 16, 205, 106)
- 矩形lprcSrc1中减去lprcSrc2得到的矩形区域结果。
注:lprcSrc1与lprcSrc2这两个矩形必须在水平或垂直方向完全相交。换句话说,倘若在lprcSrc1中拿掉与lprcSrc2相交的部分,结果必须是个矩形。
BOOL SubtractRect( LPCRECT lpRectSrc1, LPCRECT lpRectSrc2 );
例子:
CRect rc1(10, 10, 200, 200); CRect rc2(10, 10, 200, 100); CRect rcRes; rcRes.SubtractRect(rc1, rc2);//rcRes = (10,100,200,200) //若去掉后不是矩形则返回rc1 rcRes.SubtractRect(rc1, CRect(10,10,50,50));// rcRes = (10, 10, 200, 200) rcRes.SubtractRect(rc1, CRect(2, 2, 50, 50));// rcRes = (10, 10, 200, 200) rcRes.SubtractRect(rc1, CRect(100, 100, 200, 200));// rcRes = (10, 10, 200, 200) // 只要去掉俩个矩形的交集后还是一个矩形就行 rcRes.SubtractRect(rc1, CRect(25, 0, 300, 300));// rcRes = (10, 10, 25, 200) rcRes.SubtractRect(rc1, CRect(2, 50, 500, 300));// rcRes = (10, 10, 200, 50)
- 获得能包含这两个矩形的最小矩形
BOOL UnionRect( LPCRECT lpRect1, LPCRECT lpRect2 );
例子:
CRect rect1(100, 0, 200, 300); CRect rect2(0, 100, 300, 200); CRect rect3; // 获得能放下两个矩形的最小矩形 rect3.UnionRect(&rect1, &rect2);// (0, 0, 300, 300) rect3.UnionRect(CRect(10, 10, 50, 50), CRect(100, 100, 150, 150));// (10, 10, 150, 150) rect3.UnionRect(CRect(10, 10, 50, 50), CRect(10, 10, 15, 15));// (10, 10, 50, 50) rect3.UnionRect(CRect(10, 10, 50, 50), CRect(8, 9, 15, 15));// (8, 9, 50, 50)
- 获取两个矩形的交集矩形
BOOL IntersectRect( LPCRECT lpRect1, LPCRECT lpRect2 );
例子:
CRect rect1(100, 0, 200, 300); CRect rect2(0, 100, 300, 200); CRect rect3; // 获得能两个矩形的交集矩形 rect3.IntersectRect(rect1, rect2);// (100, 100, 200, 200) rect3.IntersectRect(CRect(10, 10, 50, 50), CRect(100, 100, 150, 150));// (0, 0, 0, 0) rect3.IntersectRect(CRect(10, 10, 50, 50), CRect(10, 10, 15, 15));// (10, 10, 15, 15) rect3.IntersectRect(CRect(10, 10, 50, 50), CRect(8, 9, 15, 15));// (10, 10, 15, 15) rect3.IntersectRect(CRect(10, 10, 50, 50), CRect(0, 0, 100, 100));// (10, 10, 50, 50)
另外:
Operators (操作符重载)
operator LPCRECT Converts a CRect to an LPCRECT. operator LPRECT Converts a CRect to an LPRECT. operator = Copies the dimensions of a rectangle to CRect. operator == Determines whether CRect is equal to a rectangle. operator != Determines whether CRect is not equal to a rectangle. operator += Adds the specified offsets to CRect or inflates CRect. operator –= Subtracts the specified offsets from CRect or deflates CRect. operator &= Sets CRect equal to the intersection of CRect and a rectangle. operator |= Sets CRect equal to the union of CRect and a rectangle. operator + Adds the given offsets to CRect or inflates CRect and returns the resulting CRect. operator – Subtracts the given offsets from CRect or deflates CRect and returns the resulting CRect. operator & Creates the intersection of CRect and a rectangle and returns the resulting CRect. operator | Creates the union of CRect and a rectangle and returns the resulting CRect.
CRect::operator +
CRect operator +( POINT point ) const;
CRect operator +( LPCRECT lpRect ) const;
CRect operator +( SIZE size ) const;
Return Value
The CRect resulting from moving or inflating CRect by the number of units specified in the parameter.
Example
CRect rect1(100, 235, 200, 335); CPoint pt(35, 65); CRect rect2; rect2 = rect1 + pt; CRect rectResult(135, 300, 235, 400); ASSERT(rectResult == rect2);
CRect::operator -
CRect operator -( POINT point ) const;
CRect operator -( SIZE size ) const;
CRect operator -( LPCRECT lpRect ) const;
Return Value
The CRect resulting from moving or deflating CRect by the number of units specified in the parameter.
Example
CRect rect1(100, 235, 200, 335); CPoint pt(35, 65); CRect rect2; rect2 = rect1 - pt; CRect rectResult(65, 170, 165, 270); ASSERT(rect2 == rectResult);
CRect::operator &
CRect operator &( const RECT& rect2 ) const;
Return Value
A CRect that is the intersection of CRect and rect2.
Example
CRect rect1(100, 0, 200, 300); CRect rect2(0, 100, 300, 200); CRect rect3; rect3 = rect1 & rect2; CRect rectResult(100, 100, 200, 200); ASSERT(rectResult == rect3);
CRect::operator |
CRect operator |( const RECT& rect2 ) const;
Return Value
A CRect that is the union of CRect and rect2.
Remarks
Returns a CRect that is the union of CRect and rect2. The union is the smallest rectangle that contains both rectangles.
Example
CRect rect1(100, 0, 200, 300); CRect rect2(0, 100, 300, 200); CRect rect3; rect3 = rect1 | rect2; CRect rectResult(0, 0, 300, 300); ASSERT(rectResult == rect3);
----------------------------------------------------------------------------------
以上都要注意:执行前的矩形正常化
Note: Both of the rectangles must be normalized or this function may fail. You can call NormalizeRect to normalize the rectangles before calling this function.
常记溪亭日暮,沉醉不知归路。兴尽晚回舟,误入藕花深处。争渡,争渡,惊起一滩鸥鹭。
昨夜雨疏风骤,浓睡不消残酒。试问卷帘人,却道海棠依旧。知否?知否?应是绿肥红瘦。