南京工程学院
多媒体编程基础课程
综合作业说明书
题 目 (根据自己设计的软件特色定题)
班 级
学 生 姓 名
学 号
2011 年 10 月 28 日
注:
本周五(10月28日)检查综合作业程序完成进度,打初步印象分;
综合作业报告最迟11月9日上交 (包括源代码和作业电子稿、打印稿)。 提交文件格式 : 202060236_杨文龙_多媒体081.rar
实验报告5如果来不及也可以推迟到11月9日上交
如有特殊情况由班长和我联系。
一、 程序功能与设计思路
设计目标
具有的功能
(必须含有文字处理、绘图、图像、音频视频四部分内容各3种以上功能,界面及应用方法自己根据软件的特色综合考虑,每位同学必须自己设计一个标志,放在窗口界面上,最好是带动画效果)
界面效果图
框架结构图等
========================================================================= 格式及内容的示例(注意文本、图、表格的格式):
=========================================================================
1.1 WMPlayer媒体播放器程序实现功能说明如下:
? 按路径选择播放媒体文件,可以支持MP3、WMA、WMV、AVI、RM、RMVB、FLV、MP4等格式。
? 将媒体文件加入菜单中下拉列表框。
? 在列表中随意选择要播放的媒体文件。
? 控制媒体文件的播放、暂停、停止。
? 指定播放当前文件的上一个或下一个媒体文件。
? 在播放时,可以获取并显示当前播放媒体的文件信息。
程序运行界面如图5_1所示。
(1) 新添四个图标资源,通过图像设备选择对话框,选择16*16作为图标的设备类型。
图标ID号分别默认IDI_ICON1, IDI_ICON2, IDI_ICON3, IDI_ICON4.
(2)用图形编辑器绘制标vc++.
(3)为CMainFram类添加一个成员函数ChangeIcon,用来切换应用程序的图标。该函数代码如下:
void CMainFrame::ChangeIcon(UINT nIconID)
{HICON hIconNew=AfxGetApp()->LoadIcon(nIconID);
HICON hIconOld=(HICON)GetClassLong(m_hWnd,GCL_HICON);
if(hIconNew!=hIconOld)
{DestroyIcon(hIconOld);
SetClassLong(m_hWnd,GCL_HICON,(long)hIconNew);
RedrawWindow();
}}
(4)在CMainFrame::OnCreate函数的最后添加计时器设置代码:
SetTimer(1,500,NULL);
(5)给CMainFrame类添加WM_TIMER的消息映射函数,并添加代码:
void CMainFrame::OnTimer(UINT_PTR nIDEvent)
{static int icons[]={IDI_ICON1,IDI_ICON2,IDI_ICON3,IDI_ICON4};
static int index=0;
ChangeIcon(icons[index]);
index++;
if(index>3)
index=0;// TODO: 在此添加消息处理程序代码和/或调用默认值
CFrameWnd::OnTimer(nIDEvent);
}
(6)在CMainFrame类添加WM_DESTROY的消息映射函数,并添加下列代码
void CMainFrame::OnDestroy()
{
CFrameWnd::OnDestroy();
KillTimer(1);
}
图1_1 WMPlayer媒体播放器运行界面
1.2 WMPlayer媒体播放器的设计思路:
首先创建一个基于CLR的Windows窗体应用程序,接下来在窗体中添加一个
AxWindowsMediaPlayer控件,然后利用控件的属性和方法实现媒体的播放和控制操作;此外,还要添加菜单栏用于打开文件、添加播放列表、选择播放文件、控制播放以及退出应用程序等操作;添加状态栏用于显示媒体的标题和文件类型信息。其功能结构如图5_2所示。
图1_2 WMPlayer功能结构图面
二、 相关原理知识介绍
所应用到的知识点介绍,如:文字处理函数,GDI+函数等
=========================================================================格式及内容的示例(注意文本、图、表格的格式,尤其图表的编号和代码的格式): =========================================================================
文字处理
我们在使用各种软件的时候,都要涉及到文字的处理,其中就包括要选择使用不同的字体,因此,需要重点了解字体的含义、原理、以及如何使用这些字体,并创建符合自己要求的字体。Windows使用了两种主要字体:一种是等宽字体,一种是可变宽字体。同时Windows又定义了三种不同类型的字体:光栅字体(点阵图字体)、矢量字体(由一连串线段构成的字体)、TrueType字体(用线条和样条曲线来定义字体轮廓的字体),其中TrueType字体可以进行任何限度的缩放,而字体却仍然保持良好的质量。无论哪种字体,Windows都是使用TEXTMERIC和LOGFONT两个结构来进行描述的。我们通过这两个结构来获得字体信息,自定义我们需要的字体。
在三种形式的成员函数中:
Drawing-Attribute Function(如:DetTextColor GetTextColor等)
Text FunctionFont Function
GDI对象对字体的支持
为了能够绘制各种类型的文本、图形图象信息,Windows操作系统提供了6个GDI对象,分别为字体、位图、画刷、调色板、画笔和区域。在MFC类库中,分别对应于CFont、CBitmap、CBrush、CPalette、CPen和CRgn类。下面以使用CFont类为例介绍如何使用GDI对象。CFont类用于描述文本的字体信息,下面的示例将指定字体格式的文本输出到窗口中。
多媒体动画及视频,音频
计算机动画显示是利用人眼的视觉暂留特征。如果不断在平米上显示内容接近的图片或图形,事件错觉,会使人感到这些图片中的图形是活动的,所播放的图片速度不能低于24张,否则人眼对动画感觉调用就不会那么连贯。
应用程序通过SetTimer()函数来完成对新的定时器的申请设置,这个函数的原型如下:CWnd::SetTimer(
UINT nIDEvent,
UINT nElapse,
Void(CALLBACK*lpfnTimer)(HWND,UINT,UINT,DWORD);
参数说明:nIDEvent:指定一个非0的定时器标示符。
nElapse: 以毫秒知识限时值。
lpfnTimer:指示处理WM_TIMER消息的程序提供的TimerProc回调函数的地址为NULL,则消息放到程序队列中由该CWindow对象处理。
返回值:成功则返回定时值的标示符,否则返回0
当不需要定时器时,可以调用KillTimer()函数来停止传送WM_TIMER消息,其函数原型如下:CWnd::KillTimer(UINT nIDEven);
当定时器用尽时,在调用KillTimer()函数时,返回NULL,表示无可用。正场调用时,返回值部位0。
加载应用程序Wave资源
若程序中需要播放较小的wav文件,可以讲wav文件加载为应用程序的资源。程序可直接使用wav资源文件就可以了。为了播放wav资源,需要使用系统提供的PlaySound函数,不仅可以播放wav资源,还可以播放wav文件。格式如下:
BOOLPlaySound(LPCSTR pszSound,HMODULE hmod,DWORD fdwSound):
参数说明:pszSound:表示播放声音的字符串,可以是表示资源的字符串,也可以是表示wav文件的字符串,最大长度256个字符,包括终止符。
Hmod:表示包含wav资源的可执行文件句柄。
fdwSound:表示声音的播放标记。
虽然可使用PlaySound函数播放wav文件,但是音频必须完全载入物理内存,音频文件较大,则不适合使用,此时课使用mciSendCommand函数来取代PlaySound函数实现wav文件的播放。函数语法如下:
MCIERROR mciSendCommand(MCIDEVICEND IDDevice,UINT nMSG, DWORD
fdwCommand,DWORD_PTR dwParam);
参数说明:IDDevice:表示接收消息的MCI设备标示符。uMsg:表示命令消息。 绘图知识
图形是由点和线构成的,设备环境CDC类提供了多个方法绘制线条。
1)MoveTo
该方法用于移动当前的坐标点到指定的位置上。
CPoint MoveTo( int x, int y );
参数说明:x:表示当前位置的x轴坐标。
y:表示当前位置的y轴坐标。
2)LineTo
该方法用于从当前坐标点绘制一条直线到参数指定的位置。
BOOL LineTo( int x, int y );
参数说明:
x:表示直线终点的x轴坐标。
y:表示直线终点的y轴坐标。
画笔是Windows应用程序中用来绘制各种直线和曲线的一种图形工具,它可分为修饰画笔和几何画笔两种类型。在这两种类型中,几何画笔的定义最复杂,它不但有修饰画笔的属性,而且还跟画刷的样式、阴影线类型有关,通常用在对绘图有较高要求的场合。而修饰画笔只有简单的几种属性,通常用在简单的直线和曲线等场合。一个修饰画笔通常具有宽度、风格和颜色三种属性。画笔的宽度用来确定所画的线条宽度,它是用设备单位表示的。默认的画笔宽度是一个像素单位。画笔的颜色确定了所画的线条颜色。画笔的风格确定了所绘图形的线型,它通常有实线、虚线、点线、点划线、双点划线、不可见线和内框线等七种风格。 三个重载的构造函数
CPen( );
CPen( int nPenStyle, int nWidth, COLORREF crColor );
CPen( int nPenStyle, int nWidth, const LOGBRUSH* pLogBrush, int nStyleCount = 0, const DWORD* lpStyle = NULL );
图像处理技巧
在Windows的画图程序中,打开“编辑颜色”窗口时,当鼠标在颜色区域 移动时,右方的显示区域和下方的编辑框中会显示相应的颜色和颜色值。 本例实现该功能。技术要点:
获取某一点的颜色只要得到当前鼠标的设备环境CDC类对象即可,因为
调用CDC类的GetPixel方法可获取某一点的颜色值。
VC提供了三个宏,用于获取某一颜色的红、绿、蓝三基色。
1)GetRValue宏 该宏用于获取指定颜色的红颜色值
2)GetGValue宏 该宏用于获取指定颜色的绿颜色值
3)GetBValue宏 该宏用于获取指定颜色的蓝颜色值
BYTE GetRValue(DWORD rgb );rgb标识一个颜色值。
返回值:指定颜色的红色值。BYTE GetGValue(DWORD rgb );
rgb标识一个颜色值。
返回值:指定颜色的绿色值。 rgb标识一个颜色值。
返回值:指定颜色的蓝色值。
Windows API 函数。
函数原型:HWND ChildWindowFromPoint (HWND hWnd, LONG xPoint, LONG yPoint); 函数功能:返回父窗口中包含了指定点的第一个子窗口的句柄。
函数参数:hWnd 父窗口的句柄
xPoint 点的X坐标,以像素为单位
yPoint 点的Y坐标,以像素为单位
返回值:发现包含了指定点的第一个子窗口的句柄。如未发现任何窗口,则返回hWnd函数功能:该函数把相对于一个窗口的坐标空间的一组点映射成相对于另一窗口的坐标空间的一组点。
函数原型:int MapWindowPoints(HWND hWndFrom, HWND hWndTo,LPPOINT lpPoints, UINT cPoints);
参数:hWndfrom:转换点所在窗口的句柄,如果此参数为NULL或HWND_DESKTOP则假定这些点在屏幕坐标上。
hWndTo:转换到的窗口的句柄,如果此参数为NULL或HWND_DESKTOP,这些点被转换为屏幕坐标。
lpPoints:指向POINT结构数组的指针,此结构数组包含要转换的点,此参数也可指向RECT结构,在此情况下,Cpoints参数应设置为2。
cPoints:指定LpPoints参数指向的数组中POINT结构的数目。
返回值:如果函数调用成功,返回值的低位字是每一个源点的水平坐标的像 素数目,以便计算每个目标点的水平坐标;高位字是每一个源点的垂直坐标 的像素的数目,以便计算每个目标点的垂直坐标,如果函数调用失败,返回 值为零。
(父窗口的句柄)。如指定点位于父窗口外部,则返回零。
三、 设计方法 即步骤
界面设计
各功能模块设计
写出操作步骤和代码,以及必要的环境配置和流程图
(批改的方法很简单,找几个低年级同学按你描述的步骤做,看是否可以做出来,另外检查有无雷同和相互抄袭现象)
========================================================================= =========格式及内容的示例(注意文本、图、表格的格式):
========================================================================= 案例具体的设计过程如下:
1)启动Visual C++ 2008开发环境,在菜单中选择“文件”→“新建”→“项目”,弹出“新建项目”对话框;在对话框的左侧“项目类型”选项中选择CLR,在右侧显示的
已安装应用程序项目模板中选择“Windows窗体应用程序”,输入媒体播放器项目名称“WMPlayer”,选择好合适的程序文件存放路径,点“确定”按钮完成,如图3-1所示。
图3-1 创建多媒体播放器项目
2)调整窗体至大小合适,在窗体“Text”属性中写入“Windows媒体播放器”,然后添加Menustrip1菜单条控件,并在菜单中添加toolStripComboBox下拉列表框控件。操作方法如图5-7所示,先点击菜单设计方框中的下拉按钮,可以看到MenuItem、ComboBox和TextBox三个选项,然后选择“ComboBox”,这样就可以在菜单中嵌入一个下拉列表框。
图3-2 添加toolStripComboBox下拉列表框控件
菜单设计完成后的具体内容如表3_1所示。
3)添加一个statusStrip状态栏控件,用于显示当前播放的媒体信息。在状态栏控件中创建状态5个标签toolStripStatusLabel1至toolStripStatusLabel5,它们的作用如表3_2所示。
4)按5.2.1节中所述方法添加AxWindowsMediaPlayer控件,并将控件的Dock属性设置为“Fill”。
5)添加openFileDialog控件,Name属性为“OpenMediaFile”。
应用程序窗体和所有控件的属性设置如表3_2所示。
7)在Form1.h中添加以下数组和全局变量,用于保存播放列表、播放文件、以及列表序号:
public ref class Form1 : public System::Windows::Forms::Form
{
//可以加入播放清单的媒体的数目
static array<System::String ^>^ list=gcnew array<System::String ^>(30); static int num=0; //媒体的数量
static int currentItem; //当前播放序号
static String^ currentFile; //当前播放文件名
static bool ifPause; //是否处于暂停标记状态
...
}
=======================================================
四、 总结及收获体会
通过本次的综合作业,让我获益匪浅。本次的大作业我是基于前几次实验的基础上加以整合,修改而成,并没有花费自己很长时间,主要还是得益于之前的实验较为认真成功地完成了,在做综合实验之前,我有着自己的思路,就是将之前的实验有的基于对话框,有的基于单文档的程序全部用单文档来实现,在单文档中调用对话框来实现功能。
虽然最终我是成功完成了,但是之前的工作还是挺不容易的,因为并没有很熟练的掌握VC++知识,对于出现的许多问题我也有时感到困惑,我请教了能力好的同学,在图书馆借阅了相关书籍,在一次次的error中我仔细的检查了,有的是配置环境时的不完整,有的是添加代码的粗心大意,经过自己不断地调试,请教同学,吸取教训最终完成了此次的综合作业。
做完之后更觉得,此次作业就是考验自己的综合素质,对VC++整体知识的把握能力,最主要的是自己要把一个完整的界面构思出来,之后考虑怎样在这个界面中完成全部的功能模块,这是框架,有了大体的结构,再在里面完善具体的操作,而里面的具体功能之前就已完成过,只需要添加进去就好,这就算成功的完成了。