SIZE,POINT,CPoint, CRect,CSize浅谈

这几个结构容易混淆:

SIZE:The SIZE structure specifies the width and height of a rectangle.

typedef struct tagSIZE {
  LONG cx;
  LONG cy;
}SIZE, *PSIZE;

再看看POINT结构:
Represents an ordered pair of integer x- and y-coordinates that defines a point in a two-dimensional plane.它主要有两个成员了。

typedef struct tagPOINT {
   LONG x;
   LONG y;
} POINT;

由此我们再看MFC中的CPoint:

class CPoint : public tagPOINT

它直接从结构当中继承而来,x, y成员都是public属性。
当然CPoint是相当强大的,我们从MSDN可以看出一二:
1.结构函数:

CPoint(
   int initX,
   int initY 
) throw( );
CPoint(
   POINT initPt 
) throw( );
CPoint(
   SIZE initSize 
) throw( );

所有的构造函数都要求不会抛出任何异常,我们可以用如下几种方法来初始化一个点:

  • x,y
  • 另一个CPoint类
  • SIZE结构

2.运算符重载
(1) ==, !=

BOOL operator !=( 
   POINT point 
) const throw( );

BOOL operator ==(
   POINT point 
) const throw( );

写个例子?随便新建一个基于对话框的MFC,添加如下代码:

    CClientDC dc(this); // 取得设备描述表
    RECT rt;
    GetClientRect(&rt);
    CPoint p1(rt.right / 4, rt.bottom / 4);
    CPoint p2(p1);
    p2.Offset(rt.right / 2, rt.bottom / 2);//偏移值
    dc.MoveTo(p1);
    dc.LineTo(p2);
    if (p1==p2)
    {
        DrawText(dc.m_hDC, _T("这两个点是相同的!"), -1, &rt, 0);
    }
    else
    {
        DrawText(dc.m_hDC, _T("\n这两个点不相同!"), -1, &rt, 0);
    }

运行结果:
例一图片

(2)+,-,+=,-+
+:

CPoint operator +(
   SIZE size 
) const throw( );
CPoint operator +(
   POINT point 
) const throw( );
CRect operator +(
   const RECT* lpRect 
) const throw( );

两个点相加是一个点,一个点和一个长度相加是一个点,一个lprect加一个点是一个rect.
还是来举个栗子吧,如下:

    CClientDC dc(this); // 取得设备描述表
    RECT rt;
    GetClientRect(&rt);
    CPoint p1(rt.right / 4, rt.bottom / 4);
    CPoint p2(p1);
    CSize s1(rt.right / 4, rt.bottom / 4);
    CPoint p3 = p1 + s1;
    CString str = _T("我在这里!");
    CString strP3(_T("p3: ") + str);
    TextOut(dc.m_hDC, p3.x, p3.y, strP3, strP3.GetLength());
    CRect rect(0, 0, rt.right / 4, rt.bottom / 4);
    rect = p1 + rect; //CRect operator+(_In_ POINT point) const throw();还是CRect哦。
    FillRect(dc.m_hDC, rect, (HBRUSH)GetStockObject(DKGRAY_BRUSH));

运行结果:
这里写图片描述
-:

CSize operator -(
   POINT point 
) const throw( );
CPoint operator -(
   SIZE size 
) const throw( );
CRect operator -(
   const RECT* lpRect 
) const throw( );

两个点相减是一个长度,一个点减一个长度是一个点,一个点减一个lprect是一个rect(关于这点,请看msdn:Subtracting a rectangle from a point returns the rectangle offset by the negatives of the x and y values specified in the point. For example, using the last overload to offset the rectangle CRect(125, 200, 325, 400) by the point CPoint(25, -19) returns CRect(100, 219, 300, 419).)
+=:The first overload adds a size to the CPoint.

void operator +=(
   SIZE size 
) throw( );
void operator +=(
   POINT point 
) throw( );

看清楚了返回的是一个void
-=:

void operator -=(
   SIZE size 
) throw( );
void operator -=(
   POINT point 
) throw( );

我靠,又得写一个例子了:我们以上面为例:

    CClientDC dc(this); // 取得设备描述表
    RECT rt;
    GetClientRect(&rt);
    CPoint p1(rt.right / 4, rt.bottom / 4);
    CPoint p2(p1);
    CPoint p3 = p1 + p2;
    CString str = _T("我在这里!");
    CString strP3(_T("p3: ") + str);
    TextOut(dc.m_hDC, p3.x, p3.y, strP3, strP3.GetLength());
    p1 += p3;
    CString strP1(_T("p1: ") + str);
    TextOut(dc.m_hDC, p1.x, p1.y, strP1, strP1.GetLength());
    p1 -= p3;
    strP1 += _T(", 这是我-=后的新位置");
    ::TextOut(dc.m_hDC, p1.x, p1.y, strP1, strP1.GetLength());

运行结果:
例二图片
CPoint就到此吧。

CRect类 的介绍
类CRect是对Windows结构RECT的封装,凡是能用RECT结构的地方都可以用CRect代替。
结构RECT表示一个矩形的位置和尺寸,其定义为:

typedef struct tagRECT{

 LONG left;

 LONG top;

LONG right;

LONG bottom;

} RECT;

其中 left、top分别表示矩形左上角顶点的横坐标和纵坐标,right、bottom分别表示矩形右下角顶点的横坐标和纵坐标。由于CRect提供了一些成员函数和重载运算符,使得CRect的操作更加方便。 1.CRect的构造函数 CRect有如下6个构造函数:

  • 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对象,参数l,t,r,b分别指定矩形的左边、上边、右边和底边。SrcRect是一个RECT结构的引用。LpSrcRect是一个指向RECT结构的指针。Point指定矩形的左上角顶点的坐标,size指定矩形的长度和宽度。topLeft指定矩形的左上角顶点的坐标,bottomRight指定矩形的右下角顶点的坐标。
CSize?还是看MSDN吧,写不了这么多,呼呼。

以上为转载加上一点修改,错误地方欢迎指正。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值