混合类.docx
《混合类.docx》由会员分享,可在线阅读,更多相关《混合类.docx(14页珍藏版)》请在冰豆网上搜索。
混合类
CPoint
目录
CPoint类简介
CPoint类成员
CPoint构造函数
编辑本段CPoint类简介
CPoint类与WindowsPOINT结构类似。
它还包括用来操纵CPoint和POINT结构的成员函数。
只要POINT结构可以使用的地方,CPoint对象也可以使用。
这个类与“大小”有关的操作符可以接受CSize对象或SIZE结构,因为这两者是可以互换的。
注意:
这个类派生于tagPOINT结构(名字tagPOINT是POINT结构的不太常用的有关名字)。
这意味着POINT结构的数据成员,x和y,也是CPoint的可以访问的数据成员。
#include
请参阅:
CRect,CSize
编辑本段CPoint类成员
构造CPoint构造一个CPoint
操作符Offset给CPoint的x和y成员增加值
operator==检查两个点是否相等
operator!
=检查两个点是否不等
返回CPoint值的操作符operator+=通过增加一个尺寸或点来使CPoint偏移
operator-=通过减去一个尺寸或点来使CPoint偏移
operator+返回一个CPoint和一个尺寸或点的和
operator-返回一个CPoint和一个尺寸或点的偏差,或一个点的不存在
返回CSize值的操作符operator-返回两点之间的大小差别
返回CRect值的操作符operator+返回偏移一个大小的CRect
operator-返回偏移一个负大小的CRect
编辑本段CPoint构造函数
CPoint:
:
CPoint
CPoint();
CPoint(intinitX,intinitY);
CPoint(POINTinitPt);
CPoint(SIZEinitSize);
CPoint(DWORDdwPoint);
参数:
initX指定CPoint的成员x的值。
initY指定CPoint的成员y的值。
initPt用于初始化此CPoint的一个POINT结构或CPoint对象。
initSize用于初始化CPoint值的SIZE结构或CSize。
dwPoint设此参数的低位字为x成员,高位字为y成员。
说明:
构造一个CPoint对象。
如果不给参数,则不初始化x和y成员。
词条图册更多图册
扩展阅读:
∙1
CRect
百科名片
CRect类与WindowsRECT结构相似,并且还包括操作CRect对象和WindowsRECT结构的成员函数。
在传递LPRECT,LPCRECT或RECT结构作为参数的任何地方,都可以传递CRect对象来代替。
目录
一、CRect类介绍
1.注意:
2.构造
3.运算
4.运算符
二、个人心得
1.案例
2.原型一:
3.原型四:
4.原型五:
一、CRect类介绍
1.注意:
2.构造
3.运算
4.运算符
二、个人心得
1.案例
2.原型一:
3.原型四:
4.原型五:
展开
编辑本段一、CRect类介绍
注意:
这个类是从tagRECT结构派生而来的。
(tagRECT是RECT结构的不太常用的别名。
)这意味着RECT结构的数据成员(left,top,right,和bottom)也是CRect的可访问数据成员。
一个CRect包含用于定义矩形的左上角和右下角点的成员变量。
当指定一个CRect时,必须谨慎地构造它,以使它符合规范——也就是说,使其左坐标值小于右坐标值,使顶坐标值小于底坐标值。
例如,左上角为(10,10),右下角为(20,20)就定义了一个符合规范的矩形,但是左上角为(20,20)而右下角为(10,10)的值就定义了一个不符合规范的矩形。
如果矩形是不符合规范的,则CRect的许多成员函数都会符合不正确的结果。
(参见CRect:
:
NormalizeRect可以得到这些函数的列表。
)在你调用一个要求符合规范的矩形的函数之前,你可以通过调用NormalizeRect函数来使不符合规范的矩形成为符合规范的矩形。
当用成员函数CDC:
:
DPtoLP和CDC:
:
LPtoDP来处理CRect时要小心。
如果显示环境的映射模式y-extent是负的,就像在MM_LOENGLISH中一样,则CDC:
:
DPtoLP将转换CRect,以使它的顶部坐标大于底部坐标。
然后像Height和Size这样的函数将返回负值作为转换后的矩形的高度,则此矩形将是不符合规范的。
当使用重载的CRect操作符时,第一个操作数必须是一个CRect;第二个操作数可以是一个RECT结构或一个CRect对象。
#include
请参阅:
CPoint,CSize,RECT
CRect类成员
构造
CRect构造一个CRect对象
运算
Width计算CRect的宽度
Height计算CRect的高度
Size计算CRect的大小
TopLeft返回CRect的左上角点
BottomRight返回CRect的右下角点
CenterPoint返回CRect的中心点
IsRectEmpty确定CRect是否是空的。
如果CRect的宽度和/或高度为0,则它是空的
IsRectNull确定CRect的top,bottom,left,和right是否都等于0
PtInRect确定指定的点是否在CRect之内
SetRect设置CRect的尺寸
SetRectEmpty设置CRect为一个空的矩形(所有的坐标都等于0)
CopyRect将一个源矩形的尺寸拷贝到CRect
EqualRect确定CRect是否等于给定的矩形
InflateRect增加CRect的宽度和高度
DeflateRect减少CRect的宽度和高度
NormalizeRect使CRect的高度和宽度返回规范
OffsetRect将CRect移动到指定的偏移
SubtractRect从一个矩形中减去另一个矩形
IntersectRect设置CRect等于两个矩形的交集
UnionRect设置CRect等于两个矩形的并集
运算符
operatorLPCRECT将一个CRect转换为一个LPCRECT
operatorLPRECT将一个CRect转换为一个LPRECT
operator=将一个矩形的尺寸拷贝到CRect
operator==确定CRect是否与一个矩形相等
operator!
=确定CRect是否不等于另一个矩形
operator+=使CRect增加指定的偏移,或使CRect放大
operator-=从CRect中减去指定的偏移,或缩小CRect
operator&=设置CRect等于CRect和某个矩形的交
operator|=设置CRect等于CRect和某个矩形的并
operator+增加给定偏移量到CRect,并返回得到的CRect对象
operator-从CRect中减去给定偏移量,并返回得到的CRect对象
operator&创建CRect与某个矩形的交,并返回得到的CRect对象
operator|创建CRect与某个矩形的并,并返回得到的CRect对象
编辑本段二、个人心得
CRect类是MFC的常用类,十分基础,故整理出来以供新手参考。
用金山快译查了一下没有rect这个单词,估计是rectangle的简写,rectangle是长方形、矩形的意思。
默认坐标系:
原点为左上角,右边为x轴正方向,下边为y轴正方向。
案例
构造函数(CRect)有五个原型,第二个原型和第三个原型是拷贝构造函数。
现在我用其它三个构造函数构造一个左上角坐标为(10,20),x方向边长为100,y方向边
长有200的矩形。
原型一:
CRectr1(10,20,110,220);
原型四:
POINTpt={10,20};
SIZEsize={100,200};
CRectr2(pt,size);
原型五:
POINTtopLeft={10,20};
POINTbottomRight={110,220};
CRectr3(topLeft,bottomRight);
下面的代码可以查一个矩形的大小,新建一个单文档工程Sdi,修改OnDraw函数:
voidCSdiView:
:
OnDraw(CDC*pDC)
{
CSdiDoc*pDoc=GetDocument();
ASSERT_VALID(pDoc);
CRectr1(10,20,110,220);
pDC->Rectangle(&r1);
}
intWidth()const;
取得宽度,intiWidth=r1.Width();iWidth的会上为100。
intHeight()const;
取得高度,intiHeight=r1.Height();iHeight的结果是200。
CSizeSize()const;
取得宽和高,CSizesize=r1.Size();size.cx为100,size.cy为200。
CPoint&TopLeft();
取得左上角的坐标,由于返回值是引用,所以可以通过此函数的返回值,修改左上角。
CRectr1(10,20,110,220);
r1.TopLeft().x=0;
r1.TopLeft().y=0;
r1的左上角坐标变为(0,0),也可以通过此函数取得左上角的坐标。
CRectr1(10,20,110,220);
CPointTopLeft=r1.TopLeft();
TopLeft.x的值为10,TopLeft.y的值为20。
BottomRight取得右下角坐标
CPointCenterPoint()const;取得中心得的坐标,CPointpt=r1.CenterPoint();pt为(60,120)。
BOOLIsRectEmpty()const;如果长度或宽度为0或非法,返回真;否则返回假。
CRectr1(210,20,110,220);
boolbEmpty=r1.IsRectEmpty();
结果为真,因为左边比右边还大。
CRect:
:
IsRectNull,四个边的坐标都为0,结果为真,否则为假。
BOOLPtInRect(POINTpoint)const;查看一个点是否在矩形内。
CRectr1(10,20,110,220);
POINTpt1={10,10};
POINTpt2={10,30};
boolbIn1=r1.PtInRect(pt1);
boolbIn2=r1.PtInRect(pt2);
bIn1为假,bIn2为真。
CRect:
:
SetRect,设置四个边的值,用法类似于构造函数的原型一。
CRect:
:
SetRectEmpty,将四个边的坐标设置为0。
voidCopyRect(LPCRECTlpSrcRect);复制。
CRectr2;
r2.CopyRect(&r1);
r2的值和r1的值相同。
CRect:
:
EqualRect,两个矩形是不是相同,四边坐标必须相同。
CRectr1(10,20,110,220);
CRectr2(110,220,10,20);
boolbEqual=r1.EqualRect(r2);
bEqual的值为假,因为他们的上下左右边不同,是反过来的。
CRectr1(110,220,10,20);
CRectr2(110,220,10,20);
boolbEqual=r1.EqualRect(r2);
bEqual为真,因为四边相同。
CRect:
:
InflateRect,增加宽和高。
CRectr(0,0,0,0);
r.InflateRect(2,3);//结果为(-2,-3,2,3);
SIZEsize={3,2};
r.InflateRect(size);//结果为(-5,-5,5,5);
CRectr1(-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,标准化,调整上下边和左右边,使得符合人类逻辑。
CRectr(10,10,0,0);
r.NormalizeRect();
结果为(0,0,10,10)
CRect:
:
OffsetRect,移动整个矩形。
CRectr(0,0,10,10);
r.OffsetRect(1,1);//右移1,下移1
POINTpoint={1,1};
r.OffsetRect(point);//再右移1,再下移1
SIZEsize={-2,-2};
r.OffsetRect(size);//右移-2,下移-2
CRect:
:
SubtractRect,lpRectSrc1减去lpRectSrc2,注意不是减号。
过程不好表达,运行下面的代码就可以看到效果了。
voidCSdiView:
:
OnDraw(CDC*pDC)
{
pDC->SelectStockObject(NULL_BRUSH);
CRectr1(10,10,100,100);
CRectr2(50,10,150,150);//和CRectr2(50,50,150,150);结果不一样
pDC->Rectangle(r1);
pDC->Rectangle(r2);
{//红色区域是SubtractRect的结果
CRectr;
r.SubtractRect(r1,r2);
CBrushbrush(RGB(255,0,0));
pDC->SelectObject(&brush);
pDC->Rectangle(&r);
}
}
CRect:
:
IntersectRect,求交集
voidCSdiView:
:
OnDraw(CDC*pDC)
{
pDC->SelectStockObject(NULL_BRUSH);
CRectr1(10,10,100,100);
CRectr2(50,10,150,150);//和CRectr2(50,50,150,150);结果不一样
pDC->Rectangle(r1);
pDC->Rectangle(r2);
{//绿色区域是IntersectRect的结果
CRectr;
r.IntersectRect(r1,r2);
CBrushbrush(RGB(0,255,0));
pDC->SelectObject(&brush);
pDC->Rectangle(&r);
}
}
CRect:
:
UnionRect,求并集
voidCSdiView:
:
OnDraw(CDC*pDC)
{
pDC->SelectStockObject(NULL_BRUSH);
CRectr1(10,10,100,100);
CRectr2(50,50,150,150);//和CRectr2(50,50,150,150);结果不一样
pDC->Rectangle(r1);
pDC->Rectangle(r2);
{//蓝色边框是UnionRect的结果
CRectr;
r.UnionRect(r1,r2);
CPenpen(PS_DOT,1,RGB(0,0,255));
pDC->SelectObject(&pen);
pDC->Rectangle(&r);
}
}
CRect:
:
operatorLPCRECT,转化成LPCRECT类型。
CRect:
:
operatorLPRECT,转化成LPRECT
CRectr(0,0,100,100);
LPCRECTpCRect=r;
LPRECTpRect=r;
第二行会调用LPCRECT操作符,第三行调用LPRECT操作符。
typedefconstRECT*LPCRECT;//pointertoread/onlyRECT
typedefstructtagRECT
{
LONGleft;
LONGtop;
LONGright;
LONGbottom;
}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。
+、-、&、|和上面的类似,就不再详细讲解了。
[1]
词条图册更多图册
参考资料
∙1
本文由何志丹2009-4-28原创于自己的网站,并马上转到百科。
CRect
扩展阅读:
∙1
参考资料:
《MFC类库详解》
∙2
本文的代码可以到下载
CSize
CSize类
类CSize是对Windows结构SIZE的封装,凡是能用SIZE结构的地方都可以用CSize代替。
结构SIZE表示一个矩形的长度和宽度,其定义为:
typedefstructtagSIZE{
LONGcx;
LONGcy;
}SIZE;
其中cx、cy分别是宽度和高度。
与CPoint类似,CSize也提供了一些重载运算符。
如运算符“+”,“-”,“+=”和“-=”,用于两个CSize对象或一个CSize对象与一个CPoint对象的加减运算,运算符“==”和“!
=”用于比较两个CSize对象是否相等。
由于CPoint和CSize都包含两个整数类型的成员变量,他们可以进行相互操作。
CPoint对象的操作可以以CSize对象为参数。
同样,CSize对象的操作也可以以CPoint对象为参数。
如可以用一个CPoint对象构造一个CSize对象,也可以用一个CSize对象构造一个CPoint对象,允许一个CPoint对象和一个CSize对象进行加减运算。
词条图册更多图册
扩展阅读:
∙1