第十二讲VC++多媒体编程YANGZHOUDAXUE物理科学与技术学院第1节C++(面向对象)类和对象在现实世界中,经常有属于同一类的对象。在面向对象软件中,也有很多共享相同特征的不同的对象。可以利用这些对象的相同特征为它们建立一个类。定义:类是定义同一类所有对象的变量和方法的原型。类一般包含数据成员和成员函数。成员函数是用来对数据成员进行操作的,又称为“方法”。类的定义格式一般地分为说明部分和实现部分。说明部分是用来说明该类中的成员,包含数据成员的说明和成员函数的说明。实现部分是用来对成员函数的定义。二者一般分开定义。类的一般定义格式如下:class类名{public:成员函数或数据成员的说明private:数据成员或成员函数的说明};各个成员函数的实现class是定义类的关键字。关键字public,private,protected被称为访问权限修饰符。它们在类体内出现的先后顺序无关,并且允许多次出现。各个成员函数的实现是类定义中的实现部分,包含所有在类体内说明的函数的定义。允许一个成员函数的类体内定义。一个日期类定义的例子://类的说明部分classTDate{public:voidSetDate(inty,intm,intd);voidPrint();private:intyear,month,day;};其中public部分可被对象访问,private(或protected)部分不可被对象访问。//类的实现部分voidTDate::SetDate(inty,intm,intd){year=y;month=m;day=d;}voidTDate::Print();{coutyear.month.dayendl;}在VC++中,类的说明部分和实现部分不但分开定义,而且在不同的文件中。前者文件后缀为.h,后者文件后缀为.cpp。文件名相同。类的使用类一定是通过定义它的对象(实例化)来使用的。voidmain(){TDateToday;Today.SetDate(2008,8,8);Today.Print();}构造函数和析构函数在类中,函数名和类名相同的函数称为构造函数,在定义对象时自动执行。函数名为~类名的函数称为析构函数,在释放对象时自动执行。classTDate{public:voidTDate();voidSetDate(inty,intm,intd);voidPrint();void~TDate();private:intyear,month,day;};voidTDate::TDate(){year=2009;month=4;day=1;}void~TDate::TDate(){}当执行TDateToday;时,Today就会初始化为2009.4.1。在类中,构造函数和析构函数是必须的。如果不定义,系统会自动生成构造和析构空函数。构造函数用来做初始化,析构函数一般用来做收尾工作。构造函数可以带参数。classTDate{public:voidTDate(inty,intm,intd);voidPrint();void~TDate();private:intyear,month,day;};voidTDate::TDate(inty,intm,intd){year=y;month=m;day=d;}定义对象时:TDateToday(2009,4,1);继承类的继承性就是子类自动共享父类的数据和方法的机制,表示类之间的关系。定义子类的语法如下:class子类名:继承方式父类名{…...}其中继承方式为public,private或protected。public继承protected继承private继承publicpublicpublicprotectedpublicprivateprotectedprotectedprotectedprotectedprotectedprivateprivate不可见private不可见private不可见1、数据和函数都被继承。2、建立对象时,首先调用基类的构造函数,然后调用派生类的构造函数。3、对象析构时,与构造时相反,先执行派生类的析构函数体,最后是执行基类的析构函数。4、构造函数和析构函数不可继承。5、可以一级一级继承下去。#includeiostream.hclassSample{protected:intx,y;public:Sample(){x=1;y=2;}voiddisp();~Sample(){}};voidSample::disp(){coutx=x,y=yendl;}classson:publicSample{private:intz;public:son(intc){z=c;}voidadd(){coutthesumisx+y+zendl;}~son(){}};voidmain(){Samples1;s1.disp();sons2(5);s2.disp();s2.add();}运行结果:x=1,y=2x=1,y=2thesumis8封装:降低耦合度;类的内部可以自由修改;类具有对外的清晰接口。多态:不同的对象可以执行相同的动作,但通过他们自己的实现代码来执行。分为静态联编方式和动态联编方式。类的封装、继承和多态三种特性构成了面向对象程序设计思想的基础。窗口窗口是指能进行图形处理的视觉上可见的程序窗口,包括可见不可见的消息处理能力。消息消息是消息驱动机制的核心,通过结构MSG来描述:typedefstructtagMSG{HWNDhwnd;//接收窗口的句柄UINTmessage;//消息号WPAPAMwParam;//消息参数LPAPAMlParam;//消息参数DWORDtime;//发送消息时间POINTpt;//光标位置}MSG;第2节windows编程句柄在Windows环境中,句柄是用来标识项目的,这些项目包括:模块(module)任务(task)实例(instance)文件(file)内存块(blockofmemory)菜单(menu)控制(control)字体(font)资源(resource)GDI对象(GDIobject)等从数据类型上来看它只是一个16位的无符号整数。应用程序几乎总是通过调用一个WINDOWS函数来获得一个句柄,之后通过其他的WINDOWS函数使用该句柄,以引用相应的对象。资源包括图标、位图、对话框、工具条和菜单等。资源集中在一个资源文件中定义,有特定的操作资源的函数(加载、使用、丢弃)。每个资源都有唯一的全局资源ID号。图形设备接口图形设备接口(GDI:GraphicsDeviceInterface),它的主要任务是负责系统与绘图程序之间的信息交换,处理Windows程序的图形输出。图形设备接口(GDI)提供了一系列的函数和相关的结构,应用程序可以使用它们在显示器、打印机或其他设备上生成图形化的输出结果。GDI通过设备环境(DeviceContext,DC),可以直接向指定的设备进行输出。设备环境包含设备的信息。应用程序使用设备环境函数来创建DC。GDI将返回一个设备环境句柄,在随后的调用中,该句柄用于表示该设备。API函数API(ApplicationProgrammingInterface,应用程序编程接口)一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件的以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。windowsAPIWindowsAPI是一套用来控制Windows的各个部件(从桌面的外观到为一个新进程分配的内存)的外观和行为的一套预先定义的Windows函数.用户的每个动作都会引发一个或几个函数的运行以告诉Windows发生了什么。API函数包含在Windows系统目录下的动态连接库文件中(如User32.dll,GDI32.dll,Shell32.dll...)。SDK(SoftwareDevelopersKit)编程直接调用API函数从最底层设计程序的Windows编程方式。#includestdafx.hBOOLInitInstance(HINSTANCE,int);LRESULTCALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);intAPIENTRYWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPSTRlpCmdLine,intnCmdShow){MSGmsg;//程序窗口初始化if(!InitInstance(hInstance,nCmdShow)){returnFALSE;}//消息循环while(GetMessage(&msg,NULL,0,0)){TranslateMessage(&msg);DispatchMessage(&msg);}returnmsg.wParam;}例:BOOLInitInstance(HINSTANCEhInstance,intnCmdShow){HWNDhWnd;//窗口句柄WNDCLASSwcex;//窗口类对象//填充窗口类结构wcex.style=CS_HREDRAW|CS_VREDRAW;wcex.lpfnWndProc=(WNDPROC)WndProc;//窗口消息处理函数wcex.cbClsExtra=0;wcex.cbWndExtra=0;wcex.hInstance=hInstance;wcex.hIcon=LoadIcon(hInstance,IDI_APPLICATION);wcex.hCursor=LoadCursor(NULL,IDC_ARROW);wcex.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);wcex.lpszMenuName=NULL;wcex.lpszClassName=helloworld;RegisterClass(&wcex);//注册窗口hWnd=CreateWindow(helloworld,Win32SDK,//创建窗口WS_OVERLAPPEDWINDOW,300,200,200,100,NULL,NULL,hInstance,NULL);if(!hWnd)returnFALSE;//显示窗口ShowWindow(hWnd,nCmdShow);//更新窗口UpdateWindow(hWnd);returnTRUE;}LRESULTCALLBACKWndProc(HWNDhWnd,UINTmessage,WPARAMwParam,LPARAMlParam){charMSG[13]=Helloworld!;switch(message){caseWM_PAINT://窗口重画消息HDChdc;PAINTSTRUCTps;hdc=BeginPaint(hWnd,&ps);TextOut(hdc,0,20,MSG,strlen(MSG));EndPaint(hWnd,&ps);break;caseWM_DESTROY://窗口退出消息PostQuitMessage(0);break;}returnDefWindowProc(hWnd,message,wParam,lParam);}.LIB和.DLLlib是在程序编译连接的时候就连接的文件。一般来说,与动态连接文件相对比,lib文件也被称为是静态连接库。.dll是在程序运行的时候才连接的文件,是一种比较小的可执行文件格式,.dll还有其他的文件格式如.ocx等,所有的.dll文件都是可执行。在编程时,普遍大量使用现成的LIB或DLL实现程序功能。可以看作函数库。第3节MFC编程MFC(MicrosoftFoundationClasses,微软基础类)C++是一种程序设计语言,,而VC++是一种编译器+源程序编辑器,MFC就是挂在它之上的一个辅助软件开发包。MFC是对API函数的封装。MFC类绝大部分用来进行界