C++.docx

上传人:b****6 文档编号:2997155 上传时间:2022-11-17 格式:DOCX 页数:48 大小:516.65KB
下载 相关 举报
C++.docx_第1页
第1页 / 共48页
C++.docx_第2页
第2页 / 共48页
C++.docx_第3页
第3页 / 共48页
C++.docx_第4页
第4页 / 共48页
C++.docx_第5页
第5页 / 共48页
点击查看更多>>
下载资源
资源描述

C++.docx

《C++.docx》由会员分享,可在线阅读,更多相关《C++.docx(48页珍藏版)》请在冰豆网上搜索。

C++.docx

C++

C++基本知识

在C++中,结构体和类可以通用,结构体是一种特殊的类。

但他们最大的区别在于访问权限:

结构体在默认情况下,成员变量是公有的;而类在默认情况下成员变量和成员函数是私有的,不能够对外部进行访问。

构造函数

1、构造函数最重要的作用是创建对象本身。

2、C++规定,每个类必须有一个构造函数,没有构造函数,就不能创建任何对象。

3、C++又规定,如果一个类没有提供任何的构造函数,则C++提供一个默认的构造函数(由C++编译器提供),这个默认的构造函数是一个不带参数的构造函数,它只负责创建对象,而不做任何的初始化工作。

4、只要一个类定义了一个构造函数,不管这个构造函数是否是带参数的构造函数,C++就不再提供默认的构造函数。

也就是说,如果为一个类定义了一个带参数的构造函数,还想要无参数的构造函数,则必须自己定义。

析构函数

1、当一个对象生命周期结束时,其所占有的内存空间就要被回收,这个工作就由析构函数来完成。

2、析构函数是“反向”的构造函数,析构函数不允许有返回值,更重要的是析构函数不允许带参数,并且一个类中只能有一个析构函数。

3、析构函数的作用正好与构造函数相反,对象超出其作用范围,对应的内存空间被系统收回或被程序用delete删除时,析构函数被调用。

4、根据析构函数的这种特点,我们可以在构造函数中初始化对象的某些成员变量,给其分配内存空间(堆内存),在析构函数中释放对象运行期间所申请的资源。

函数的重载

重载构成的条件:

函数的参数类型、参数个数不同,才能构成函数的重载。

分析以下两种情况,是否构成函数的重载。

第一种情况:

(1)voidoutput();

(2)intoutput();只有返回值不同的两个函数不能构成函数重载

第二种情况:

(1)voidoutput(inta,intb=5);

(2)voidoutput(inta);带缺省参数的两个函数也不能构成函数重载

this指针

1、this指针是一个隐含的指针,它是指向对象本身,代表了对象的地址

2、一个类所有的对象调用的成员函数都是同一代码段。

那么成员函数又是怎么识别属于同一对象的数据成员呢?

原来,在对象调用pt.output(10,10)时,成员函数除了接受2个实参外,还接受到了一个对象s的地址。

这个地址被一个隐含的形参this指针所获取,它等同于执行this=&pt。

所有对数据成员的访问都隐含地被加上前缀this->。

例如:

x=0;等价于this->x=0。

类的继承

在C++中,给我们提供了一种重要的机制,就是继承。

classFish:

publicAnimal鱼从动物类继承而来

如果基类的构造函数有参数,则在派生类中使用Fish():

Animal(300,400)语句传递参数

类的继承访问特性

基类的访问特性

类的继承特性

子类的访问特性

Public

Protected

Private

Public

Public

Protected

No access

Public

Protected

Private

Protected

Protected

Protected

No access

Public

Protected

Private

Private

Private

Private

No access

函数的覆盖

函数的覆盖是发生在父类与子类之间的。

通常定义类的时候,把函数原型的声明和定义放到头文件中,把类中函数的实现放到源文件中。

文本框编程

1、创建插入符,利用CreatSolidCaret()函数完成

voidCreatSolidCaret(IntnWidth,IntnHeight)第一个参数是指定插入符的宽度,第二个参数指定插入符的高度。

初始化插入符是隐藏的,需要显示则使用ShowCaret()函数。

需要在视类中添加OnCrate消息响应

CreateSolidCaret(21,100);

ShowCaret();

2、根据设备描述表中字体的大小来创建插入符,利用GetTextMetrics()函数完成

BOOLGetTextMetrics(LPTEXTMETRIClpMetrics)const;

CClientDC从CDC派生而来,它创建对象的时候会调用构造函数,从而隐式调用GetDC();当对象生命周期结束时,他会调用析构函数,从而调用RelaseDC()来释放DC。

CClientDCdc(this);

TEXTMETRICtm;//定义一个结构体变量

dc.GetTextMetrics(&tm);

CreateSolidCaret(tm.tmAveCharWidth/8,tm.tmHeight);

ShowCaret();

3、创建图形插入符,利用CreatCaret()函数完成

需要将bitmap设置成View的成员变量

Private:

CBitmapbitmap;

CClientDCdc(this);

TEXTMETRICtm;

dc.GetTextMetrics(&tm);

bitmap.LoadBitmap(IDB_BITMAP1);

CreateCaret(&bitmap);

ShowCaret();

4、OnDraw()函数,当窗口发生重绘时(窗口尺寸发生改变),会被应用程序框架调用,将一直保存在窗口上

CString类:

可以直接把CString对象直接赋值

//CStringstr("北京维新科学技术培训中心");//这是一种赋值方法

//下面两行也是赋值方法,与上面的赋值方法等价

CStringstr;

str="北京维新科学技术培训中心";

pDC->TextOut(50,50,str);

LoadString可以装载一个字符串资源,我们只要何时用到CString对象再去调用LoadString加载一个字符串资源,就不需要每次都进行赋值了。

str.LoadString(IDS_WEIXIN);

pDC->TextOut(0,100,str);

5、路径程(如果需要窗口某部分与窗口其他部分不一样,就可以用路径程来实现)

以下代码还是在OnDraw函数中完成

str.LoadString(IDS_WEIXIN);

pDC->TextOut(0,100,str);

CSizesz=pDC->GetTextExtent(str);

pDC->BeginPath()打开一个路径程

pDC->Rectangle(50,50,50+sz.cx,50+sz.cy);

pDC->EndPath()关闭一个路径程

①获取一个字符串在屏幕上显示的宽度和高度,利用GetTextExtent()函数完成

CSizeGetTextExtent(constCString&str)const;

CSize和SIZE结构体一样

SIZE结构体中有两个成员变量,分别表示宽度和高度

typedefstructtagSIZE{LONGcx;LONGcy;}SIZE,*PSIZE;

GetTextMetrics()函数是获取当前字体信息的度量,关于字体本身信息的度量;而GetTextExtent()函数是获取一个特定的字符串在屏幕上显示的时候所占据的宽度和高度。

②画网格

for(inti=0;i<300;i+=10)

{

pDC->MoveTo(0,i);

pDC->LineTo(300,i);

pDC->MoveTo(i,0);

pDC->LineTo(i,300);

}

6、捕获键盘按下的消息

思想:

我们可以将每次输入的字符都存储到一个字符串中,每次输出的时候都是从原点输出。

首先增加WM_CHAR消息,然后增加成员变量m_strLine,初始化为NULL。

再增加一个WM_LBUTTONDOWN消息。

m_strLine.Empty();//将CString对象清空

再增加一个类型为CPoint的成员变量m_ptOrigin,并初始化为0

m_ptOrigin=point;

获取背景色,利用GetBkColor

设置文本颜色,利用SetTextColor。

返回值是COLORREF类型

移动插入符,利用SetCaretPos()函数实现。

BOOLSetCaretPos(intX,intY);

SetCaretPos(point);//设置插入符的位置

voidCTextView:

:

OnChar(UINTnChar,UINTnRepCnt,UINTnFlags)

{

CClientDCdc(this);

CFontfont;

/*CFont*pOldFont=*/font.CreatePointFont(500,"华文行楷",NULL);

dc.SelectObject(&font);

TEXTMETRICtm;

dc.GetTextMetrics(&tm);

if(0X0D==nChar)//回车

{

m_strLine.Empty();

m_ptOrigin.y+=tm.tmHeight;

}

elseif(0X08==nChar)//退格

{

COLORREFclr=dc.SetTextColor(dc.GetBkColor());//将文本颜色设置成背景色

dc.TextOut(m_ptOrigin.x,m_ptOrigin.y,m_strLine);//输出

m_strLine=m_strLine.Left(m_strLine.GetLength()-1);

dc.SetTextColor(clr);

}

else

{

m_strLine+=nChar;

}

/*插入符随输入的往后移动*/

CSizesz=dc.GetTextExtent(m_strLine);

CPointpt;

pt.x=m_ptOrigin.x+sz.cx;

pt.y=m_ptOrigin.y;

SetCaretPos(pt);

dc.TextOut(m_ptOrigin.x,m_ptOrigin.y,m_strLine);

//dc.SelectObject(pOldFont);

CView:

:

OnChar(nChar,nRepCnt,nFlags);

}

模仿KTV的字幕,使字体平滑变色

intDrawText(constCString&str,LPRECTlpRect,UINTnFormat);

首先增加在OnCreate函数中增加定时器

SetTimer(1,100,NULL);

然后增加消息处理WM_TIMER

m_nWidth+=5;

CClientDCdc(this);

TEXTMETRICtm;

dc.GetTextMetrics(&tm);

CRectrect;

rect.left=0;

rect.top=200;

rect.right=m_nWidth;

rect.bottom=rect.top+tm.tmHeight;

dc.SetTextColor(RGB(255,0,0));

CStringstr;

str.LoadString(IDS_WEIXIN);

dc.DrawText(str,rect,DT_LEFT);

rect.top=150;

rect.bottom=rect.top

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 商务科技

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1