第6章 多媒体编程技术_第1页
第6章 多媒体编程技术_第2页
第6章 多媒体编程技术_第3页
第6章 多媒体编程技术_第4页
第6章 多媒体编程技术_第5页
已阅读5页,还剩81页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、普通高等教育“十一五”国家级规划教材 “十二五”普通高等教育本科国家级规划教材 赵英良等.软件开发技术基础(第2版). 机械工业出版社 第第6章章 多媒体编程技术多媒体编程技术 西安交通大学 计算机教学实验中心 http:/ 西安交通大学计算机教学实验中心 本章内容 多媒体编程基础 音频的播放与处理 图像处理 动态图像 2 西安交通大学计算机教学实验中心 6.1多媒体编程基础 媒体控制接口MCI Activex技术简介 DirectX技术简介 3 西安交通大学计算机教学实验中心 6.1.1 媒体控制接口MCI MCI(Media Control Interface,媒体控 制接口)是Windo

2、ws提供的与设备无关的多 媒体高层次命令接口,可以控制CD声音、 视频动画、Wave格式数字声音、MIDI音序 器、录像机和激光视盘机等多种设备。 4 西安交通大学计算机教学实验中心 5 西安交通大学计算机教学实验中心 MCI设备类型 设备类型设备类型描述描述 Cdaudio激光唱机、CD-ROM Dat数字化磁带音频播放机 Digitalvideo窗口中的数字视频(非GUI) Mmmovie多媒体影片演播器 Overlay叠加设备(窗口中的模拟视频) Scanner图像扫描仪器 Vcr磁带录像机或播放机 Videodisc影碟机 Waveaudio播放数字化波形文件的音频设备 Other未定

3、义的MCI设备 6 西安交通大学计算机教学实验中心 Windows提供的MCI设备驱动程序 设备类型设备类型设备驱动程序名设备驱动程序名描述描述 cdaudioMCICDA.DRV一个播放光盘音频的MCI设备驱动 程序 mmmovieMCIMMP.DRV一个播放多媒体影片文件的MCI设 备驱动程序 sequencer MCISEQ.DRV一个播放MIDI音频文件的MCI设备 驱动程序 videodiscMCIPIONR.DRV一个播放先锋LD-V4200影碟机文 件的MCI设备驱动程序 waveaudio MCIWAVE.DRV一个播放和记录波形音频文件的 MCI设备驱动程序 otherMCI

4、AVI.DRV一个播放AVI动态视频文件的MCI 设备驱动程序 7 西安交通大学计算机教学实验中心 6.1.2 Activex技术简介 ActiveX是微软提出的一种可以使不同语言 开发的软件构件在网络环境中相互操作的 标准。ActiveX包括 控件控件(Controls)(Controls)、文档、文档(Documents)(Documents)、脚本、脚本 (Scripts)(Scripts)三种最常用的技术,三种最常用的技术, 同时它也包括客户机技术、服务器技术以及工同时它也包括客户机技术、服务器技术以及工 具和应用程序具和应用程序 8 西安交通大学计算机教学实验中心 6.1.3 Dir

5、ectX技术简介 DirectX是Microsoft公司最早为Windows 95平台所提供的一套支持多媒体运行的程 序库与应用程序接口的总称,其特点是直 接对HAL (硬件抽象层)操作,实现视频、 声音的输出,网络通信及对游戏杆的控制。 与传统的Windows上的GDI或MCI相比,它加 快了速度,提高了便利性。 9 西安交通大学计算机教学实验中心 6.2 音频的播放与处理 MCI提供控制音频的方法 MCI由Windows提供的mmsystem.h文件定义。 Windows采用两种MCI接口与MCI设备通信: 一是使用命令消息接口函数,直接控制一是使用命令消息接口函数,直接控制MCIMCI设

6、设 备;备; 二是使用命令字符串接口函数,基于文本接口二是使用命令字符串接口函数,基于文本接口 或命令脚本来控制或命令脚本来控制MCIMCI设备。设备。 不同之处在于它们的基本命令结构以及将 消息发送到设备的原理不同。 10 西安交通大学计算机教学实验中心 6.2.1 命令消息接口命令消息接口 命令消息接口使用消息控制MCI设备 Windows多媒体扩充软件为使用命令消息接 口发送MCI命令提供3个函数: MciSendCommandMciSendCommand:发送一个命令消息到一个:发送一个命令消息到一个 MCIMCI设备;设备; MciGetDeviceIDMciGetDeviceID:

7、当设备打开时,返回这个设:当设备打开时,返回这个设 备的备的IDID号;号; MciGetErrorStringMciGetErrorString:返回错误代码的字符串。:返回错误代码的字符串。 11 西安交通大学计算机教学实验中心 1发送命令消息发送命令消息 MciSendCommand的语法如下: MCIERROR mciSendCommand(MCIDEVICEID MCIERROR mciSendCommand(MCIDEVICEID IDDeviceIDDevice, , UINT UINT uMsguMsg, DWORD , DWORD fdwCommandfdwCommand,

8、DWORD , DWORD dwParamdwParam);); 12 西安交通大学计算机教学实验中心 2MCI命令消息的分类命令消息的分类 MCI命令消息可以划分为以下几类:直接由 MCI解释的命令、由所有的MCI设备所支持 的命令、基本命令和扩展命令。 所有的MCI设备支持的命令消息: 13 消息消息描述描述 MCI_CLOSE关闭一个关闭一个MCI设备设备 MCI_GETDEVACPS 获得一个获得一个MCI设备的性能设备的性能 MCI_INFO从一个从一个MCI设备中得到有关的消息设备中得到有关的消息 MCI_OPEN初始化一个初始化一个MCI设备设备 MCI_STATUS从一个从一个

9、MCI设备返回有关的状态消息设备返回有关的状态消息 西安交通大学计算机教学实验中心 基本命令 消息消息描述描述 MCI_LOAD从一个磁盘文件加载数据从一个磁盘文件加载数据 MCI_PAUSE暂停播放或记录暂停播放或记录 MCI_PLAY开始传送输出数据开始传送输出数据 MCI_RECORD开始传送输入数据开始传送输入数据 MCI_RESUME重新开始播放或记录重新开始播放或记录 MCI_SAVE将数据存储到磁盘文件中将数据存储到磁盘文件中 MCI_SEEK向前或向后检索向前或向后检索 MCI_SET设置设备信息设置设备信息 MCI_STATUS从一个从一个MCI设备返回有关的状态信息设备返回

10、有关的状态信息 MCI_STOP停止播放或记录停止播放或记录 14 西安交通大学计算机教学实验中心 3MCI设备的打开设备的打开 使用MCI设备前,必须使用MCI_OPEN命令消息来初 始化设备。MCI_OPEN 命令对应的参数结构为: typedef struct typedef struct DWORD_PTR dwCallback; DWORD_PTR dwCallback; /低字节为低字节为MCI_NOTIFYMCI_NOTIFY标志存放了指定的窗口句柄标志存放了指定的窗口句柄 MCIDEVICEID wDeviceID; /MCIDEVICEID wDeviceID; /返回给调用

11、程序的返回给调用程序的IDID号号 LPCSTR lpstrDeviceType; / LPCSTR lpstrDeviceType; /要打开的设备名要打开的设备名 LPCSTR lpstrElementName; / LPCSTR lpstrElementName; /附加的设备元素名附加的设备元素名 LPCSTR lpstrAlias; / LPCSTR lpstrAlias; /可选的设备别名可选的设备别名 MCI_OPEN_PARMS; MCI_OPEN_PARMS; 15 西安交通大学计算机教学实验中心 (1)用MCI设备驱动程序名指定 待打开的MCI设备 用设备驱动程序名打开一个

12、波形音频设备: WORD DeviceID; /WORD DeviceID; /声明设备号变量声明设备号变量 MCI_OPEN_PARMS MciOpenParmsMCI_OPEN_PARMS MciOpenParms; /; /声明打开参数的结构体变声明打开参数的结构体变 量量 MciOpenParms.IpstrDeviceType=”MciOpenParms.IpstrDeviceType=”mciwave.drvmciwave.drv”;/”;/指定设备指定设备 if(if(MciSendCommandMciSendCommand(0,MCI_OPEN, MCI_OPEN_TYPE,

13、(0,MCI_OPEN, MCI_OPEN_TYPE, (DWORD)(LPVOID) / DWORD_PTR dwCallback; /低字节存放低字节存放 MCI_NOTIFYMCI_NOTIFY使用的窗口句柄使用的窗口句柄 DWORD dwFrom; / DWORD dwFrom; /开始播放的位置开始播放的位置 DWORD dwTo; / DWORD dwTo; /播放结束的位置播放结束的位置 MCI_PLAY_PARMS; MCI_PLAY_PARMS; MCI_PLAY常用的标志有:MCI_FROM,MCI_TO,MCI_DGV_PLAY_REPEAT等 19 西安交通大学计算机教

14、学实验中心 (2)MCI_SET命令消息 MCI_SET设置设备信息。MCI_SET命令的对 应参数结构为 typedef struct typedef struct DWORD_PTR dwCallback; / / DWORD_PTR dwCallback; / /低字节存放低字节存放MCI_NOTIFYMCI_NOTIFY使用的窗使用的窗 口句柄口句柄 DWORD dwTimeFormat; / DWORD dwTimeFormat; /设备的时间格式设备的时间格式 DWORD dwAudio; / DWORD dwAudio; /音频输出通道音频输出通道 MCI_SET_PARMS;

15、MCI_SET_PARMS; MCI_SET常用的标志有: MCI_SET_AUDIOMCI_SET_AUDIO,表示音频通道号包含在参数结构中;,表示音频通道号包含在参数结构中; MCI_SET_TIME_FORMATMCI_SET_TIME_FORMAT,时间格式参数包含在参数结构中;,时间格式参数包含在参数结构中; 20 西安交通大学计算机教学实验中心 5关闭一个设备关闭一个设备 MCI_CLOSE命令消息取消对一个设备或者设 备元素的访问,它类似于一个文件的关闭 操作。当所有使用一个设备的任务均关闭 了这个设备时,MCI释放这个设备。 MCI_CLOSE的参数结构 typedef st

16、ruct typedef struct DWORD_PTR dwCallback; / DWORD_PTR dwCallback; /低字节存放低字节存放 MCI_NOTIFYMCI_NOTIFY使用的窗口句柄使用的窗口句柄 MCI_GENERIC_PARMS; MCI_GENERIC_PARMS; 21 西安交通大学计算机教学实验中心 播放声音文件 【例6-1】 使用命令消息接口函数播放特定WAV声 音文件“e:01.wav”。 解题思路:解题思路: 包含头文件包含头文件 和和; 加载多媒体编程库文件加载多媒体编程库文件#pragma comment(lib, winmm)#pragma c

17、omment(lib, winmm); 声明打开设备消息参数结构体变量;声明打开设备消息参数结构体变量; 填充参数;填充参数; 使用使用mciSendCommandmciSendCommand和和MCI_OPENMCI_OPEN命令消息打开设备;命令消息打开设备; 声明播放设备消息参数结构体变量;声明播放设备消息参数结构体变量; 使用使用mciSendCommandmciSendCommand和和MCI_PLAYMCI_PLAY命令消息播放设备;命令消息播放设备; 进入循环等待播放。进入循环等待播放。 22 西安交通大学计算机教学实验中心 思考题 (1)如何使程序可以播放任意从键盘输出的 文件

18、? (2)查找资料,考虑如何控制播放过程的暂 停、继续和从头播放? 23 西安交通大学计算机教学实验中心 6.2.2 命令字符串接口 命令字符串接口使用文本命令控制MCI设备。 文本串中包含执行一个命令所需的所有信 息。 基于字符串的命令,把控制命令连接在一 起,然后通过mciSendString函数提交给 MCI。Windows多媒体扩充软件为使用命令 字符串接口传送命令字符串提供了3个函数: mciSendStringmciSendString、mciGetErrorStringmciGetErrorString、 mciExecutemciExecute。 24 西安交通大学计算机教学实

19、验中心 1mciExecute mciExcute函数是mciSendString的简化形 式 语法定义如下: BOOL mciExecute (Lpstr Command)BOOL mciExecute (Lpstr Command) LpstrCommandLpstrCommand是一个指向以是一个指向以NULLNULL结束的控制命结束的控制命 令的字符串,字符格式与令的字符串,字符格式与mciSendStringmciSendString相同。相同。 若函数调用功能,返回若函数调用功能,返回TRUETRUE,否则返回,否则返回FALSEFALSE。 25 西安交通大学计算机教学实验中心

20、2mciGetErrorString函数函数 mciGetErrorString函数返回一个MCI错误代码的 文本描述字符串,其语法如下: WORD mciGetErrorString (DWORD WORD mciGetErrorString (DWORD ErrorError, , LpstrLpstr BufferBuffer, WORD , WORD LengthLength) ) 3mciSendString函数 命令字符串接口函数命令字符串接口函数mciSendStringmciSendString的原形如的原形如 下:下: MCIERROR mciSendString(LPCTS

21、TR MCIERROR mciSendString(LPCTSTR lpszCommandlpszCommand, , LPTSTR LPTSTR lpszReturnStringlpszReturnString, UINT , UINT cchReturncchReturn, , HANDLE HANDLE hwndCallbackhwndCallback) ) 26 西安交通大学计算机教学实验中心 使用命令字符串播放声音文件 【例6-2】 使用命令字符串接口函数播放E 盘上的“01.mp3”文件。 解题思路:解题思路: 包含头文件包含头文件 和和; 加载多媒体编程库文件加载多媒体编程库文件

22、#pragma #pragma comment(lib, winmm)comment(lib, winmm); 使用使用mciSendStringmciSendString函数和函数和playplay命令字符串命令字符串 播放文件;播放文件; 进入循环等待播放。进入循环等待播放。 27 西安交通大学计算机教学实验中心 提示与思考 (1)mciSendString函数的后三个参数通 常可以设置为NUll、0和NULL。 (2)暂停播放的命令字符串可写为: pause e:01.mp3,继续播放的命令字符 串可写为:resume e:01.mp3,停止播放 的命令字符串可写为:stop e:01.

23、mp3。 请扩充该程序的功能。 28 西安交通大学计算机教学实验中心 6.2.3 Wave文件结构 声音的处理最终是对声音数据的处理。 声音数据以某种格式存放在计算机存储器 中。 RIFF(Resource Interchange File Format 资源互换文件格式)是Microsoft公司定义 的一种用于管理Windows环境中多媒体数据 的文件格式。波形音频Wave、MDI和数字视 频Avi文件都采用这种格式存储。 29 西安交通大学计算机教学实验中心 RIFF文件结构 RIFF文件基本构成是称为“块”(Chunk)的单元, 每个块由“ID”、“数据大小”及“数据”3部分 所组成 I

24、D为4个字符所组成的代码, 如RIFF,LIST等,指定块的标志ID; 数据大小用来指定块的数据域大小,占用4个字节; 数据用来描述具体的声音信号,它可以由若干个子块 构成, 一般情况下,块与块是平行的,不能相互嵌套 30 ID,4字节 数据大小,4字节 数 据 西安交通大学计算机教学实验中心 WAVE文件的格式类型为“WAVE”。RIFF块包 含两个子块: 这两个子块的ID分别是“fmt”和“data”, 其中fmt子块由结构WAVEFORMATEX所组成, 其子块的大小就是sizeof(WAVEFORMATEX), 数据组成就是WAVEFORMATEX结构中的数据 31 西安交通大学计算机

25、教学实验中心 WAVE文件结构 32 LIST块(块(4) LIST 数据块大小(数据块大小(4) LIST数据数据 西安交通大学计算机教学实验中心 WAVE文件结构实例 RIFF 0 x00013bd0-80848 Fmt 0 x00000010-16 Data 0 x00013b7c-80764 LIST 0 x00000028-40 4*7=28 8 80856 33 西安交通大学计算机教学实验中心 34 西安交通大学计算机教学实验中心 6.2.4 音效处理 读出wave文件,处理后存为新的文件 1 1文件打开函数文件打开函数mmioOpenmmioOpen,原型为:,原型为: HMMI

26、O mmioOpen( LPSTR szFilename, LPMMIOINFO HMMIO mmioOpen( LPSTR szFilename, LPMMIOINFO lpmmioinfo, DWORD dwOpenFlags);lpmmioinfo, DWORD dwOpenFlags); 2 2读文件函数读文件函数mmioReadmmioRead,原型为:,原型为: LONG mmioRead( HMMIO hmmio, HPSTR pch, LONG mmioRead( HMMIO hmmio, HPSTR pch, LONG cch );LONG cch ); 35 西安交通大学计

27、算机教学实验中心 3 3文件定位函数文件定位函数mmioSeekmmioSeek,该函数改变当前文件,该函数改变当前文件 的指针,原型为:的指针,原型为: LONG mmioSeek( HMMIO hmmio, LONG lOffset, int LONG mmioSeek( HMMIO hmmio, LONG lOffset, int iOrigin );iOrigin ); 4 4文件写入函数文件写入函数 mmioWrite mmioWrite,函数原型为:,函数原型为: LONG mmioWrite( HMMIO hmmio, char _hugeLONG mmioWrite( HMMI

28、O hmmio, char _huge* * p p 5 5文件关闭函数文件关闭函数mmioClosemmioClose,原型为,原型为 MMRESULT mmioClose( HMMIO hmmio, UINT MMRESULT mmioClose( HMMIO hmmio, UINT wFlags );wFlags ); ch, LONG cch );ch, LONG cch ); 36 西安交通大学计算机教学实验中心 声音反转 【例6-3】 打开E盘中名为02.wav的WAVE音频文件,反 转其中音频的数据,写入另一个新的WAVE格式的文件去。 解题思路:解题思路: 以读写方式打开以读写

29、方式打开e:02.wave:02.wav文件;文件; 定位文件各部分,读取文件的类型、采样频率、定位文件各部分,读取文件的类型、采样频率、 样本位数、声道数、数据区大小等参数;样本位数、声道数、数据区大小等参数; 读入声音数据到一个内存缓冲区中;读入声音数据到一个内存缓冲区中; 反转其中的数据,类似与字符串的反转;反转其中的数据,类似与字符串的反转; 以创建和读写方式打开文件以创建和读写方式打开文件02_new.wav02_new.wav 将文件类型、格式参数、音频数据写回硬盘,文将文件类型、格式参数、音频数据写回硬盘,文 件符合件符合WAVEWAVE格式标准。格式标准。 37 西安交通大学计

30、算机教学实验中心 分析 程序打开WAV文件,读取数据到缓冲区,处理完数据后写 回磁盘。可以用标准的C+输入输出流处理文件,本程序 使用API提供的一组输入输出函数来完成此操作,这些函 数均以mmio开头,提供针对WAVE文件的操作,可以简化编 程。除了反转外,还可以对数据进行低通滤波、高通滤波 及淡入淡出等处理。只需用相应的算法替换例3中相应的 代码即可。 思考题思考题: (1 1)如何处理)如何处理8 8位或位或3232位的声音数据?位的声音数据? (2 2)考虑对声音进行其他一些简单的效果处理,如增大音量。)考虑对声音进行其他一些简单的效果处理,如增大音量。 38 西安交通大学计算机教学实

31、验中心 6.3 图像处理 使用Windows GDI绘制图形 位图的显示 BMP位图文件的操作 39 西安交通大学计算机教学实验中心 6.3.1 使用Windows GDI绘制图形 在Windows程序中,应用程序(包括Windows本 身)的输出并不直接面向物理的设备,而是针 对一个称之为(Device Context)的 逻辑设备进行操作。 设备环境包含了关于当前选定用于一种设备的 画笔、画刷、字体和位图等信息,设备环境与 实际设备之间的信息传送由Windows直接管理。 MFC提供了用于若干不同类型的设备环境的类, 应用程序在将任何东西画到设备中去之前,必 须明确索取一个设备环境。 40

32、 西安交通大学计算机教学实验中心 GDI 设备环境广泛地用于图形设备接口 (Graphics Device Interface,GDI)中。 GDI是Windows体系结构的一个主要组件, 是在Windows平台上处理图形、图像的方法, 负责系统与绘图程序之间的信息交换,处 理所有Windows程序的图形输出。 GDI使程序员毋须关心硬件设备及设备驱动, 就可以将应用程序的输出转化为硬件设备 上的输出。 41 西安交通大学计算机教学实验中心 在MFC应用中绘图CDC 在MFC应用程序中,所有的绘制调用均通 过相应的设备环境对象实现。 在MFC类库中,用CDC类封装设备环境对 象,并提供了在显示

33、器、打印机或窗口 的客户程序区域上画图的方法。 所有图形的输出都可以使用CDC类提供方 法来进行-对颜色进行操作、坐标映射 和转换,对多边形和区域进行操作,绘 制各种形状,绘制文本,处理字体等。 42 西安交通大学计算机教学实验中心 CPaintDC CPaintDC类是从CDC类派生的设备环境类。 CPaintDC类的对象在OnPaint( )函数中使用,用 于在窗口中绘图。 CClientDC类也是常用的CDC派生类,用于在 OnPaint( )函数外访问设备环境,提供对窗口客 户区域的图形访问。 另外,CDC还直接派生了两个类, CWindowDCCWindowDC类提供对整个窗口的图形

34、访问;类提供对整个窗口的图形访问; CMetaFileDCCMetaFileDC类用于操作类用于操作WindowsWindows元文件元文件, ,创建独立于设创建独立于设 备的文件。备的文件。 43 西安交通大学计算机教学实验中心 MFC中的绘图工具对象 画笔、画刷、字体、位图等。 封装在MFC图形对象类 由CGdiObject基类派生而来 CPen、CBrush、CFONT等。 44 西安交通大学计算机教学实验中心 1.选择画笔 画笔是用来画线的工具,是CPen类的对象。 /声明画笔对象声明画笔对象,并创建宽度为,并创建宽度为3 3的红色实线笔的红色实线笔 CPen penRed(PS_SO

35、LID, 3, RGB(255, 0, 0); / / 使用新的画笔使用新的画笔,保存原来的画笔以便恢复,保存原来的画笔以便恢复 Cpen*pOldPen=pDC-SelectObject( / / 恢复原来的画笔恢复原来的画笔 pDC-SelectObject(pOldPen); 45 西安交通大学计算机教学实验中心 线型 Value Meaning PS_SOLID The pen is solid. PS_DASH The pen is dashed. PS_DOT The pen is dotted. PS_DASHDOT The pen has alternating dashes

36、and dots. PS_DASHDOTDOT The pen has dashes and double dots. PS_NULL The pen is invisible. PS_INSIDEFRAME 46 西安交通大学计算机教学实验中心 CDC:SelectObject()方法 CDC:SelectObject()方法选定放入当前设备环境 的新对象,并返回一个指向被替换对象的指针, 因此,语句 pOldPen = pDC-SelectObject( pOldPen = pDC-SelectObject( 保存了原来的画笔。 保存并恢复原来画笔的原因是,每个图形 设备接口对象要占用一个

37、HDC句柄,而可用 的句柄数量是有限的,在使用完后要及时 释放。 47 西安交通大学计算机教学实验中心 2.选择画刷CBrush 画刷则用来填充区域的内部,是CBrush类的对象 Windows将画刷分为两种,实心的和阴影的,创建函数不同 /声明画刷对象 CBrush brushBlue(RGB(0,255,0);/CBrush brushBlue(RGB(0,255,0);/蓝色蓝色 /创建画刷 BOOL CreateSolidBrush ( COLORREF crColor ); /BOOL CreateSolidBrush ( COLORREF crColor ); /创建实画刷创建实画

38、刷 BOOL CreateHatchBrush ( int nIndex, COLORREF crColor );/BOOL CreateHatchBrush ( int nIndex, COLORREF crColor );/创创 建阴影风格的画刷建阴影风格的画刷 brushBlue.CreateStockObject (NULL_BRUSH); /brushBlue.CreateStockObject (NULL_BRUSH); /透明画刷透明画刷 /选择画刷 pDC-SelectObject ( pDC-SelectObject ( 48 西安交通大学计算机教学实验中心 3.绘制图形 (

39、1)输出文字 BOOL BOOL TextOutTextOut(int x, int y, const CString (int x, int y, const CString 在屏幕上在屏幕上(x,y)(x,y)处,输出文字处,输出文字strstr。其中。其中strstr是是CStringCString 类型的字符串对象,如:类型的字符串对象,如: CString str=” CString str=”软件开发技术基础软件开发技术基础”; 49 西安交通大学计算机教学实验中心 (2)画点 COLORREF SetPixel (int x, int y, COLORREF COLORREF S

40、etPixel (int x, int y, COLORREF color);color); 该函数在指定坐标(参数该函数在指定坐标(参数x x,y y)处按给定颜色)处按给定颜色 colorcolor画点,返回值为原来此坐标处的颜色。画点,返回值为原来此坐标处的颜色。 50 西安交通大学计算机教学实验中心 (3)画线 画线工作需经两步完成:首先确定线的起始端 位置,这可通过调用成员函数MoveTo完成,其 原型为: CPoint MoveTo ( int x, int y );CPoint MoveTo ( int x, int y ); MoveTo将绘图位置移至指定坐标处,并返回移 动前

41、的绘图位置。确定了线的起点后,即可使 用成员函数LineTo画线: BOOL LineTo ( int x, int y ); 51 西安交通大学计算机教学实验中心 (4)绘制矩形 绘制矩形的成员函数为:绘制矩形的成员函数为: BOOL Rectangle(int x1,int y1,int x2, BOOL Rectangle(int x1,int y1,int x2, int y2 );int y2 ); (5)绘制椭圆 绘制椭圆成员函数的原型为:绘制椭圆成员函数的原型为: BOOL Ellipse(int x1, int y1, int x2, BOOL Ellipse(int x1,

42、int y1, int x2, int y2 );int y2 ); 其参数为需要绘制的矩形的左上角坐标其参数为需要绘制的矩形的左上角坐标 (x1, y1x1, y1)和右下角坐标()和右下角坐标(x2, y2x2, y2)。)。 52 西安交通大学计算机教学实验中心 其他的绘图函数还有: Arc() Arc() 绘制圆弧绘制圆弧 Draw3Drect() Draw3Drect() 绘制三维矩形绘制三维矩形 FillRect()FillRect()用给定的的画刷填充矩形区域用给定的的画刷填充矩形区域 Pie()Pie()绘制饼块图绘制饼块图 Polygon()Polygon()绘制多边形绘制多

43、边形 SetBkColorSetBkColor设置背景颜色设置背景颜色 SetTextColorSetTextColor设置文本颜色设置文本颜色 53 西安交通大学计算机教学实验中心 MFC绘图 【例6-4】 练习MFC使用绘图函数,在窗口 中随机画出直线和其它形状的图形。 解题思路解题思路: 建立建立MFCMFC框架程序,在框架程序,在OnDrawOnDraw中写出相应的绘中写出相应的绘 图代码即可图代码即可 绘制图形的一般过程是:创建画笔(绘制图形的一般过程是:创建画笔(CPenCPen),), 创建画刷(创建画刷(CBrushCBrush),选择画笔,选择画刷,),选择画笔,选择画刷,

44、绘制图形,然后恢复原来的画刷和画笔。也可绘制图形,然后恢复原来的画刷和画笔。也可 以使用缺省的画刷和画笔直接绘制图形。以使用缺省的画刷和画笔直接绘制图形。 54 西安交通大学计算机教学实验中心 操作步骤操作步骤: 新建一个单文档新建一个单文档MFCMFC程序,项目名称为程序,项目名称为mm064mm064, 其余设置不变。其余设置不变。 工作区(工作区(WorkspaceWorkspace)窗口中的类视图中,)窗口中的类视图中, 展开展开CMm064ViewCMm064View类(简称类(简称ViewView或视图类),双或视图类),双 击击OnDrawOnDraw函数,在该函数中添加代码。函

45、数,在该函数中添加代码。 55 西安交通大学计算机教学实验中心 绘制统计直方图 【例6-5】 设有一个班级的考试成绩中,90以上、 80、70、60和不及格各档次的人数分别为3、8、 12、5、2。请编程画出各档次成绩统计的直方图。 解题思路解题思路: 直方图可以通过矩形函数实现,使用画刷填充不同的直方图可以通过矩形函数实现,使用画刷填充不同的 颜色,也可以选择随机色。坐标轴用直线函数绘制。颜色,也可以选择随机色。坐标轴用直线函数绘制。 实际上,本题的关键是确定绘图的坐标。可以假设窗实际上,本题的关键是确定绘图的坐标。可以假设窗 口不小于口不小于400400* *400400,直方图矩形最大高

46、度为,直方图矩形最大高度为200200,其他,其他 可以根据人数的比例确定,宽度为可以根据人数的比例确定,宽度为6060,矩形间隔,矩形间隔5 5。横。横 轴从(轴从(2020,300300)到()到(400400,300300),横轴下方要书写文),横轴下方要书写文 字标注。具体计算公式请分析写面的程序。字标注。具体计算公式请分析写面的程序。 56 西安交通大学计算机教学实验中心 操作步骤操作步骤: 新建一个单文档新建一个单文档MFC程序,项目名称为程序,项目名称为 mm065,其余设置不变。,其余设置不变。 工作区(工作区(Workspace)窗口中的类视图中,)窗口中的类视图中, 展开展

47、开CMm065View类(简称类(简称View或视图类),或视图类), 双击双击OnDraw函数,在该函数中添加代码。函数,在该函数中添加代码。 在视图类的开始处包含以下头文件。在视图类的开始处包含以下头文件。 #include /支持支持Rand函数函数 #include /支持时间函数支持时间函数 57 西安交通大学计算机教学实验中心 6.3.2位图的显示 位图在Windows程序里被当作一种资源。 资源是Windows应用程序在运行时用到的一些数据,如菜 单、加速键、位图、图表、光标、对话框、字符串等。 一般情况下,资源数据保留在硬盘上的可执行文件中。 当应用程序创建窗口、显示对话框或位

48、图时,才从硬盘的 EXE或DLL文件中读取相应的资源数据。 一个项目在一个扩展名为.rc的文件中定义资源,资源文 件通常与项目同名。 位图信息可以放在一个CBitmap类的对象中 58 西安交通大学计算机教学实验中心 1添加位图资源 新建一个单文档新建一个单文档MFCMFC程序。程序。 在工作区中切换到资源视图(在工作区中切换到资源视图(ResourceViewResourceView) 中,在菜单中选择中,在菜单中选择“Insert-ResourceInsert-Resource”。 在弹出的对话框中选择在弹出的对话框中选择BitmapBitmap,然后单击,然后单击 【ImportImpo

49、rt】按钮,导入一幅按钮,导入一幅BMPBMP位图。位图的位图。位图的 IDID号使用号使用IDB_BITMAP1IDB_BITMAP1。IDID号可以修改号可以修改 59 西安交通大学计算机教学实验中心 2 2添加位图对象添加位图对象 在在ViewView类中添加类中添加CBitmapCBitmap类的一个对象作为数类的一个对象作为数 据成员。据成员。 CBitmap m_Bitmap;CBitmap m_Bitmap; 3 3使用使用LoadBitmapLoadBitmap载入位图资源函数载入位图资源函数 BOOL LoadBitmap( LPCTSTR lpszResourceName

50、);BOOL LoadBitmap( LPCTSTR lpszResourceName ); BOOL LoadBitmap( UINT nIDResource ); BOOL LoadBitmap( UINT nIDResource ); 其中参数其中参数lpszResourceNamelpszResourceName和和nIDResourcenIDResource分别为资源分别为资源 名称和标识符名称和标识符 60 西安交通大学计算机教学实验中心 4读位图信息函数GetBitmap int GetBitmap( BITMAP* pBitMap ); 其中参数其中参数pBitMappBitM

51、ap为一为一BITMAPBITMAP结构体对象的地址。结构体对象的地址。 BITMAPBITMAP结构体类型用于存放位图有关信息,结构如下:结构体类型用于存放位图有关信息,结构如下: typedef struct tagBITMAP typedef struct tagBITMAP int bmType; int bmType; int bmWidth; int bmWidth; int bmHeight; int bmHeight; int bmWidthBytes; int bmWidthBytes; BYTE bmPlanes; BYTE bmPlanes; BYTE bmBitsPix

52、el; BYTE bmBitsPixel; LPVOID bmBits; LPVOID bmBits; BITMAP; BITMAP; 61 西安交通大学计算机教学实验中心 5 5建立一合适的内存设备环境建立一合适的内存设备环境 CDC MemDC;CDC MemDC; MemDC. CreateCompatibleDC(NULL);MemDC. CreateCompatibleDC(NULL); 6 6将位图选入该设备环境:将位图选入该设备环境: MemDC.SelectObject(MemDC.SelectObject( 其中其中m_Bitmapm_Bitmap是是CBitmapCBitm

53、ap类的对象。类的对象。 62 西安交通大学计算机教学实验中心 7将位图从内存设备环境 复制到指定设备 使用CDC类的BitBlt( )成员函数从内存设 备环境中将位图复制到指定设备(如窗口 或打印机)。BitBlt( )函数的原型为: BOOL BitBlt ( int x, int y, int nWidth, BOOL BitBlt ( int x, int y, int nWidth, int nHeight, CDCint nHeight, CDC* * pSrcDC, pSrcDC,int xSrc, int int xSrc, int ySrc, DWORD dwRop );yS

54、rc, DWORD dwRop ); 63 西安交通大学计算机教学实验中心 在窗口中显示一幅位图 【例6-6】 在窗口中显示一幅位图,设位 图的文件名为flower.bmp。 解题思路解题思路: 创建单文档创建单文档MFCMFC工程,添加位图资源,在工程,添加位图资源,在ViewView 类类OnDrawOnDraw成员函数中按步骤编程。成员函数中按步骤编程。 64 西安交通大学计算机教学实验中心 思考题 位图显示的基本过程是在视图类的构造函数中载入位图显示的基本过程是在视图类的构造函数中载入 位图资源并取得其宽度和高度数据。在位图资源并取得其宽度和高度数据。在OnDraw( )OnDraw(

55、 )函数函数 中,首先建立一内存设备环境并选入已装载的位图资中,首先建立一内存设备环境并选入已装载的位图资 源,然后使用源,然后使用BitBlt( )BitBlt( )函数将位图显示在窗口的客户函数将位图显示在窗口的客户 区。请尝试显示位图的部分区域。区。请尝试显示位图的部分区域。 CDC CDC类的成员函数类的成员函数StretchBlt( )StretchBlt( )也可用来显示位也可用来显示位 图资源。其原型为:图资源。其原型为: BOOL StretchBlt( int x, int y, int nWidth, int BOOL StretchBlt( int x, int y, i

56、nt nWidth, int nHeight, CDCnHeight, CDC* * pSrcDC, pSrcDC, int xSrc, int ySrc, int nSrcWidth, int nSrcHeight, int xSrc, int ySrc, int nSrcWidth, int nSrcHeight, DWORD dwRop );DWORD dwRop ); 65 西安交通大学计算机教学实验中心 BITMAP Structure typedef struct tagBITMAP /* bm */ int bmType; int bmWidth; int bmHeight; i

57、nt bmWidthBytes; BYTE bmPlanes; BYTE bmBitsPixel; LPVOID bmBits; BITMAP; 66 西安交通大学计算机教学实验中心 6.3.3 BMP位图文件的操作 如果需要在自己的程序中对位图作几何处 理或效果处理,则需要了解位图的文件结 构,将位图数据读入内存,对数据进行计 算后,再将数据以规定的格式写到磁盘上 67 西安交通大学计算机教学实验中心 1位图文件的结构 BMP文件由文件头、位图信息头、颜色信息 和图形数据四部分组成. BMPBMP文件由文件由文件头文件头、位图信息头、颜色信息和、位图信息头、颜色信息和 图形数据四部分组成图形

58、数据四部分组成 (BITMAPFILEHEADER )(BITMAPFILEHEADER ) BMPBMP文件头数据结构含有文件头数据结构含有BMPBMP文件的类型、文件大小文件的类型、文件大小 和位图起始位置等信息和位图起始位置等信息 位图信息图头位图信息图头, ,用于说明位图的尺寸等信息用于说明位图的尺寸等信息 信息头之后是信息头之后是颜色颜色表用于说明位图中的颜色(表用于说明位图中的颜色(2424位位 位图没有颜色表),它有若干个表项,每一个表项位图没有颜色表),它有若干个表项,每一个表项 是一个是一个RGBQUADRGBQUAD类型的结构,定义一种颜色类型的结构,定义一种颜色 68 西

59、安交通大学计算机教学实验中心 数据记录了位图的每一个像素值,记录顺 序是在扫描行内是从左到右,扫描行之间是 从下到上(倒放的) 69 西安交通大学计算机教学实验中心 (1)位图文件头 typedef struct tagBITMAPFILEHEADER WORDbfType; / DWORD bfSize; / WORDbfReserved1; / WORDbfReserved2; / DWORD bfOffBits; / BITMAPFILEHEADER; 70 西安交通大学计算机教学实验中心 (2)位图信息头 typedef struct tagBITMAPINFOHEADER DWORD

60、 biSize; / LONG biWidth; / LONG biHeight; / WORD biPlanes; / WORD biBitCount/ DWORD biCompression; / / DWORD biSizeImage; LONG biXPelsPerMeter; / LONG biYPelsPerMeter; / DWORD biClrUsed;/ DWORD biClrImportant;/ BITMAPINFOHEADER; 71 西安交通大学计算机教学实验中心 (3)颜色表 信息头之后是颜色表用于说明位图中的颜色(24 位位图没有颜色表),它有若干个表项,每一个

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论