这几个结构容易混淆:

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吧,写不了这么多,呼呼。

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

SIZE,POINT,CPoint, CRect,CSize浅谈相关推荐

  1. MFC类CRect、CPoint、CSize

    1.CRect矩形类 CRect类与Windows RECT结构相似,在传递LPRECT或RECT结构作为参数的任何地方,都可以传递CRect对象来代替.构造函数: CRect() throw();/ ...

  2. 形态学滤波:腐蚀与膨胀(浅谈)

    形态学滤波:腐蚀与膨胀(浅谈) 一 关于二值化.膨胀.腐蚀以及拟合椭圆中心的代码如下** 二 关于腐蚀和膨胀,在此做一些浅显的总结. 三 对于上述代码中所生成的图片,进行一些说明. 四 接下来谈谈自己 ...

  3. iOS实录15:浅谈iOS Crash

    导语:在当前的iOS开发中,虽然ARC为开发者解决了手动内存管理时代 的许多麻烦,但是内存方面的问题依然是产生iOS Crash的元凶之一,本文介绍内存方面,有关僵尸对象.野指针.内存泄漏.废弃内存这 ...

  4. 浅谈CSS3中display属性的Flex布局,关于登陆页面属性框的设置

    声明:本文转发自三里屯柯南的浅谈CSS3中display属性的Flex布局http://www.cnblogs.com/xuyuntao/articles/6391728.html 基本概念 采用Fl ...

  5. java对象头_浅谈java对象结构 对象头 Markword

    概述 对象实例由对象头.实例数据组成,其中对象头包括markword和类型指针,如果是数组,还包括数组长度; | 类型 | 32位JVM | 64位JVM| | ------ ---- | ----- ...

  6. 浅谈压缩感知(二十一):压缩感知重构算法之正交匹配追踪(OMP)

    主要内容: OMP的算法流程 OMP的MATLAB实现 一维信号的实验与结果 测量数M与重构成功概率关系的实验与结果 稀疏度K与重构成功概率关系的实验与结果 一.OMP的算法流程 二.OMP的MATL ...

  7. python数学库的使用方法_浅谈numpy库的常用基本操作方法

    NumPy数组的维数称为秩(rank),一维数组的秩为1,二维数组的秩为2,以此类推.在NumPy中,每一个线性的数组称为是一个轴(axes),秩其实是描述轴的数量.比如说,二维数组相当于是一个一维数 ...

  8. Linux内核之浅谈内存寻址

    Linux内核之浅谈内存寻址 前言 最近在看内存寻址的内容,略有所得,发此文与大家一起交流.我们知道计算机是由硬件和软件组成,硬件主要包括运算器.控制器.存储器.输入设备和输出设备,软件主要是操作系统 ...

  9. 【JVM调优】JVM内存管理调优浅谈

    什么是JVM Java Virtual Machine,Java虚拟机 Java虚拟机有自己完善的硬件架构,如处理器.堆栈等,还具有相应的指令系统. Java虚拟机本质上就是一个程序,当它在命令行上启 ...

最新文章

  1. ftp服务器上传的文件打不开,ftp服务器文件有的上传不了
  2. 有史以来最简单的三层实例(C#)
  3. session过期重新登陆_深入分析Session和Cookie-前端面试题
  4. #1398 : 网络流五·最大权闭合子图
  5. 【常用技巧】标准模板库(STL)
  6. 面试--跨域--cors
  7. OpenCL 第6课:矩阵转置
  8. mysql删除员工_MySQL误删数据救命指南:开发人员必收藏
  9. PrintWrite
  10. sql server删除主键约束所想到的
  11. TS流基本知识【HI3798 AVPLAY播放TS流】
  12. DNS反劫持的几种方式
  13. 用c语言设计一个菜单界面_最新,最全的NX二次开发Ribbon界面菜单的设计图文教程...
  14. 电子技术基础——基本共射放大电路
  15. 随机存储器(RAM),只读存储器(ROM),高速缓存(CACHE),内存,硬盘,CPU
  16. 20分钟让你了解OpenGL——OpenGL全流程详细解读
  17. 利用阿里云下载国外镜像,国内顺畅下载k8s.gcr.io的镜像
  18. 怎么修改数据库服务器名字,修改SQL Server数据库服务器名字
  19. Java—九九乘法表
  20. 基于MODIS影像反演气溶胶

热门文章

  1. 专家视角 | 龚健雅院士:当“传统”遥感遇上AI, 未来产业应用值得期待
  2. 如何实现消息通知系统
  3. 算法小抄7-二分枚举
  4. 标题: 连接到服务器 ------------------------------ 无法连接到
  5. 基于华大的HC32F005 的高压三相无刷电机驱动方案
  6. 猜年龄小游戏(while 和 if的运用)
  7. 运维工程师必备150个命令(连载中...)
  8. 往事如烟 - 想念妈妈
  9. cadence——基本操作5
  10. 如何在线观看或直播2018年奥运会(无电缆)