jasmine214--love

          只有當你的內心總是充滿快樂、美好的愿望和寧靜時,你才能擁有強壯的體魄和明朗、快樂或者寧靜的面容。
          posts - 731, comments - 60, trackbacks - 0, articles - 0

          CRect類詳解

          Posted on 2010-08-30 17:43 幻海藍夢 閱讀(4635) 評論(0)  編輯  收藏 所屬分類: C++
          http://www.vcshare.net/jichu/jichu_212.htm
          我用金山快譯查了一下沒有rect這個單詞,估計是rectangle的簡寫,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 += ,重載“+=”運算符,第一個原型和第二個原型調用OffsetRect,第三個原型調用InflateRect。
          CRect::operator -=,重載“-=”運算符,第一個原型和第二個原型調用OffsetRect,第三個原型調用InflateRect。
          CRect::operator &=,重載“&=”運算符,實際調用IntersectRect。
          CRect::operator |= 重載“|=”運算符,實際調用UnionRect。
          +、-、&、|和上面的類似,就不再詳細講解了。
          主站蜘蛛池模板: 大埔区| 黑龙江省| 天等县| 霍城县| 玛沁县| 崇左市| 怀柔区| 怀远县| 阜南县| 山阳县| 科技| 屯门区| 清河县| 离岛区| 宁城县| 安图县| 芷江| 威信县| 龙海市| 平原县| 溧阳市| 阿图什市| 鲜城| 铜川市| 牡丹江市| 静海县| 武胜县| 龙江县| 息烽县| 神池县| 长垣县| 高台县| 武义县| 江油市| 雷波县| 昌图县| 莱州市| 乐安县| 广水市| 邹城市| 定安县|