zoukankan      html  css  js  c++  java
  • 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.

    常记溪亭日暮,沉醉不知归路。兴尽晚回舟,误入藕花深处。争渡,争渡,惊起一滩鸥鹭。

    昨夜雨疏风骤,浓睡不消残酒。试问卷帘人,却道海棠依旧。知否?知否?应是绿肥红瘦。
  • 相关阅读:
    OpenCV/python读取,显示,保存图像
    机器学习的基本分类
    Qt Designer常用部件介绍
    C#数据类型列表
    SQL-Base 函数
    SQl 基本函数
    SQL 插入数据
    SQL-Base 用表组织数据
    SQLserver的基本用法
    C#MyBank(自己的看法,转账有点小问题)
  • 原文地址:https://www.cnblogs.com/htj10/p/14002231.html
Copyright © 2011-2022 走看看