《多媒体编程基础课程综合作业说明书MFC图形图像处理及绘图软件设计.doc》由会员分享,可在线阅读,更多相关《多媒体编程基础课程综合作业说明书MFC图形图像处理及绘图软件设计.doc(34页珍藏版)》请在三一办公上搜索。
1、成绩 南京工程学院多媒体编程基础课程综合作业说明书题 目 多媒体综合设计 班 级 学 生 姓 名 学 号 2011 年 10 月 28 日一、 程序功能与设计思路整体设计目标:含有文字处理、绘图、图像、音频视频四部分内容各3种以上功能,自己设计一个标志,放在窗口界面上,带动画效果1、主界面1.1 主界面实现功能说明如下: 菜单项包括文字处理、绘图、图像、音频视频,点击进入各个功能界面 动画显示个人信息1.2 界面效果显示:1.3 主界面设计思路:首先创建一个基于对话框的对话框的MFC应用程序,然后在资源里添加五个菜单栏和四个对话框并将其对应连接起来,在主对话框菜单栏中添加四个菜单选项与四个子对
2、话框链接,以实现点击菜单项跳出对应的对话框。然后在主对话框中添加一个shockwaveflash控件以实现在主界面播放设计好的flash动画。 其功能结构如下:主界面 标志音频视频播放 图像处理 绘图工具文字处理2、文字处理2.1 文字实现功能说明如下: 菜单项包括文字镂空、文字旋转、颜色渐变、倾斜文字,点击菜单项将显示各个功能。 文字镂空:在对话框中显示一串字符,字符中间镂空显示。 文字旋转:在对话框中显示一串字符,字符循环旋转,并实现空间。视觉效果,且当前字符显示红色,其余字符显示蓝色。 颜色渐变:在对话框中显示一串字符,并整体实现颜色渐变。 倾斜文字:在对话框中旋转循环显示字体,每个字符
3、串角度相差15度,围成一个圈。2.2 界面效果显示: 文字处理2.3 文字处理功能结构图:文字旋转颜色渐变镂空文字倾斜文字3、绘图工具3.1 绘图工具实现功能如下: 画点 画线 画椭圆 画矩形,矩形内部用渐变颜色填充 涂鸦 设置画图的线型、线宽 设置画图线条的颜色3.2 功能界面效果显示 3.3 绘图工具功能结构图:点绘图线椭圆绘图工具矩形涂鸦设置线型设置设置颜色设置线宽4、 图像处理4.1 图像处理实现功能如下: 从本地磁盘打开.bmp文件 图片去色 浮雕效果 颜色拾取 轮廓识别 对称变换 颜色取反4.2 功能界面效果显示 特效颜色取反轮廓识别浮雕对称变换颜色拾取去色去色打开内容图像处理图像
4、变换颜色浏览打开内容内容内容内容浏览内容4.3图像处理功能结构图:5、 音频视频播放5.1音频视频功能实现: 从本地磁盘添加音频视频文件 双击播放音频视频文件 点击播放按钮播放文件 点击上一个、下一个选择当前文件的上一个、下一个文件5.2 功能界面显示5.3 音频视频播放功能结构图:音频视频播放添加文件控制下一个上一个播放二、 相关原理知识介绍1、文字处理1.1文字处理的基本知识Windows使用了两种主要字体:一种是等宽字体,一种是可变宽字体。同时Windows又定义了三种不同类型的字体:光栅字体(设备相关的点阵图字体)、矢量字体(设备无关的由一系列线段构成的字体)、TrueType字体(设
5、备无关的用线条和样条曲线来定义轮廓的字体),其中TrueType字体可以在进行任何限度的缩放后,而仍然保持良好的字体质量。此外,还有OpenType字体,它也是设备无关的,可以用来定义手写字体。无论哪种字体,在Windows系统中都是使用TEXTMERIC和LOGFONT两个结构来进行描述的。在应用中通过这两个结构来获取字体信息,定义显示文字所需要的字体。1.2文本输出函数函数名功能TextOut用当前字体在指定位置处写一个字符串ExTextOut用当前字体在矩形区域内写一个字符串TabbedTextOut在指定位置写一个字符串DrawText在指定矩形中绘制格式化的文本1.3 文字处理的基本
6、步骤1)获取设备环境(CDC* pDC)2)设置系统字体 -默认字体 -得到当前的字体(部分)信息,以该信息输出 -创建自定义字体,选入设备环境 3) 输 出 文 本 (文本输出函数)1.4、设置系统字体的步骤 1)创建字体对象:CFont font; / font为字体对象 2)创建字体 CreateFont() CreatePointFont CreateFontIndirect() CreateFontFontIndirect() 3) 调用成员函数SelectObject将字体选入设备环境: SelectObject(&font);1.5、 控制文本的背景色 在设备描述中有两项可以影响
7、背景,一个是背景色,另一个是背景模式。背景模式可以为透明的(Transparent)或不透明的(Opaque)。缺省为不透明的。背景模式可用函数SetBkMode来设置,它设置当前的背景模式并返回原来的背景模式。函数原型为:int SetBkMode(int nBkMode); 参数nBkMode指定背景模式,其值可以是OPAQUE或者TRANSPARENT;如果值为OPAQUE,则显示时背景都改为当前背景颜色。如果值为TRANSPARENT,则不改变背景颜色,此时,任何SetBkColor函数调用都无效2、简单绘图工具2.1 绘图的基本方法实现简单图形的绘制,绘图功能中,有绘制直线、矩形、椭
8、圆、涂鸦等。用到的方法如下:CPoint MoveTo(int x,int y); /直线起点CPoint LineTo(int x,int y); /直线终点BOOL Rectangle(int x1,int y1,int x2,int y2); /绘制矩形BOOL Ellipse(int x1,int y1,int x2,int y2); /绘制椭圆涂鸦部分,以鼠标移动的轨迹画线。同样要用到MouseMove()函数。使起点为鼠标前一个位置,终点为鼠标当前位置,以画直线的方式完成。对于线型、线宽、颜色的设置,通过使用颜色通用对话框完成。2.2 绘图时需要用到的设备环境类介绍 设备环境类CD
9、C提供了绘制和打印的全部函数。为了能让用户使用一些特殊的设备环境,CDC还派生了CPaintDC、CClientDC、CWindowDC和CMetaFileDC类。 (1)CPaintDC比较特殊,它的构造函数和析构函数都是针对OnPaint进行的,但用户一旦获得相关的CDC指针,就可以将它当成任何设备环境(包括屏幕、打印机)指针来使用。CPaintDC类的构造函数会自动调用BeginPaint,而它的析构函数则会自动调用EndPaint。 (2)CClientDC只能在窗口的客户区(不包括边框、标题栏、菜单栏以及状态栏)中进行绘图,点(0,0)通常指的是客户区的左上角。而CWindowDC允
10、许在窗口的任意位置中进行绘图,点(0,0)指整个窗口的左上角。CWindowDC和CClientDC构造函数分别调用GetWindowDC和GetDC,但它们的析构函数都是调用ReleaseDC函数2.3 CRect 类 常 用 的 成 员 函 数成员函数功能说明int Width( ) const;返回矩形的宽度int Height( ) const;返回矩形的高度CSize Size( ) const;返回矩形的大小,CSize中的cx和cy成员分别表示矩形的宽度和高度CPoint& TopLeft( );返回矩形左下角的点坐标CPoint& BottomRight( );返回矩形右下角的
11、点坐标CPoint CenterPoint( ) const;返回CRect的中点坐标BOOL IsRectEmpty() const;如果一个矩形的宽度或高度是0或负值,则称这个矩形为空,返回TRUEBOOL IsRectNull() const;如果一个矩形的上、左、下和右边的值都等于0,则返回TRUEBOOL PtInRect( POINT point ) const;如果点point位于矩形中(包括点在矩形的边上),则返回TRUEvoid SetRect( int x1, int y1, int x2, int y2 );将矩形的各边设为指定的值,左上角点为(x1, y1),右下角点为
12、(x2, y2)void SetRectEmpty();将矩形的所有坐标设置为零void NormalizeRect( );使矩形符合规范void OffsetRect( int x, int y );void OffsetRect( POINT point );void OffsetRect( SIZE size );移动矩形,水平和垂直移动量分别由x、y或point、size的两个成员来指定2.4、画笔和画刷 画笔是Windows应用程序中用来绘制各种直线和曲线的一种图形工具,它可分为修饰画笔和几何画笔两种类型。在这两种类型中,几何画笔的定义最复杂,它不但有修饰画笔的属性,而且还跟画刷的样
13、式、阴影线类型有关,通常用在对绘图有较高要求的场合。而修饰画笔只有简单的几种属性,通常用在简单的直线和曲线等场合。 一个修饰画笔通常具有宽度、风格和颜色三种属性。画笔的宽度用来确定所画的线条宽度,它是用设备单位表示的。默认的画笔宽度是一个像素单位。画笔的颜色确定了所画的线条颜色。画笔的风格确定了所绘图形的线型,它通常有实线、虚线、点线、点划线、双点划线、不可见线和内框线等七种风格。 画刷用于指定填充的特性,许多窗口、控件以及其他区域都需要用画刷进行填充绘制,它比画笔的内容更加丰富。 画刷的属性通常包括填充色、填充图案和填充样式三种。画刷的填充色和画笔颜色一样,都是使用COLORREF颜色类型,
14、画刷的填充图案通常是用户定义的8 x 8位图,而填充样式往往是CDC内部定义的一些特性,它们都是以HS_为前缀的标识。3、 图像处理3.1、使用的CDC类的位图函数来输出图像。BOOL StretchBit(int x,int y,int nWidth,int nHeight,CDC* pSrcDC,int xSrc,int ySrc,int nSrcWidth,int nSrcHeight,DWORD dwRop);x,y :表示目标矩形区域左上角的x,y坐标点;nWidth,nHeight:表示目标设备中绘制位图的宽度和高度;pSrcDC :表示源设备上下文对象指针;xSrc,ySrc:表
15、示源设备上下文的起点x,y轴坐标;nSrcWidth,nSrcHeight:表示需要复制的位图宽度和高度;dwRop:表示光栅操作代码。COLORREF GetPixel( int x, int y ) const; /返回坐标点的颜色值。COLORREF SetPixel( int x, int y, COLORREF crColor ); /设置的颜色值BYTE GetRValue(DWORD rgb ); /获取一个颜色值的RGB各个分量:BYTE GetGValue(DWORD rgb );BYTE GetBValue(DWORD rgb );3.2、获取鼠标位置的颜色值获取某一点的颜
16、色只要得到当前鼠标的设备环境CDC类对象即可,因为调用CDC类的GetPixel方法可获取某一点的颜色值。VC提供了三个宏,用于获取某一颜色的红、绿、蓝三基色。1)GetRValue宏 该宏用于获取指定颜色的红颜色值2)GetGValue宏 该宏用于获取指定颜色的绿颜色值3)GetBValue宏 该宏用于获取指定颜色的蓝颜色值BYTE GetRValue(DWORD rgb ); rgb标识一个颜色值。返回值:指定颜色的红色值。BYTE GetGValue(DWORD rgb );rgb标识一个颜色值。返回值:指定颜色的绿色值。BYTE GetBValue(DWORD rgb );rgb标识一
17、个颜色值。返回值:指定颜色的蓝色值。3.3、GetPixel和SetPixel介绍1)GetPixel方法该方法用于获取某一点的颜色值。语法:COLORREF GetPixel( int x, int y ) const; COLORREF GetPixel( POINT point ) const;参数:x、y、point标识坐标点。返回值:坐标点的颜色值。2)SetPixel方法 该方法用于设置某一点的颜色值。语法: COLORREF SetPixel( int x, int y, COLORREF crColor );COLORREF SetPixel( POINT point, COL
18、ORREF crColor );参数 x、y、point标识坐标点。crColor标识设置的颜色值。返回值:坐标点实际显示的颜色值。3.4、与位图相关的方法4、 音频视频播放需要使用WMP控件来完成播放音频视频文件的功能。对话框中还要使用到列表框。列表框的部分函数如下:int AddString(LPCTSTR lpszItem); /添加列表项int DeleteString(UINT nIndex); /删除列表项void GetText(int nIndex,CString& rString) const;/获取某列表项字符串int GetCount(); /获取列表项总数参数lpszI
19、tem表示添加的字符串,nIndex表示索引值。添加与删除两个函数成功调用时返回列表项在列表框中的索引,错误时返回LB_ERR。参数rString用来存放列表项的文本。三、 设计方法及步骤1、 首先启动VS2008创建一个基于对话框的应用程序,然后在资源中添加四个菜单栏,分别将ID号改为IDR_MANUMAIN、IDR_MANUWORD、IDR_MANUDRAW、IDR_MANUIMG,并将住对话框与IDR_MANUMAIN连接起来,在菜单栏里添加文字处理、简单绘图、图像处理、音频视频播放四个菜单项。接着添加四个对话框,标题分别改为文字处理、简单绘图、图像处理、音频视频播放,将ID号对应设为I
20、DD_WORDDLG、IDD_DRAWDLG、IDD_IMGDLG、IDD_WMPDLG,并将其与对应的菜单项连接起来。然后将给四个对话框添加对话框类,给主菜单的四个子菜单添加消息响应函数,并调用对应的对话框,将四个子对话框设为无模式对话框,使点击主菜单的四个子菜单弹出对应的对话框。ID标题MENU 的IDIDD_WANGJIANJUN_DIALOGwangjianjunIDR_MANUMAINIDD_WORDDLG文字处理IDR_MANUWORDIDD_DRAWDLG简单绘图IDR_MANUDRAWIDD_IMGDLG图像处理IDR_MANUIMGIDD_WMPDLG音频视频播放对话框的ID
21、号及对应的菜单栏如下:给对话框添加类:选中对话框点击右键,选择添加类,然后进入如下对话框,填入相应的类名,点击“完成”。添加代码如下:首先在中添加四个对话框类的头文件#include DrawDlg.h#include ImagDlg.h#include WmpDlg.h#include WordDlg.h然后给主对话框的子菜单添加对应的消息响应函数,代码如下:void CWangjianjunDlg:OnWord()/ TODO: 在此添加命令处理程序代码CWordDlg *pDlg=new CWordDlg;pDlg-Create(IDD_WORDDLG);pDlg-ShowWindow(
22、SW_NORMAL);void CWangjianjunDlg:OnDraw()/ TODO: 在此添加命令处理程序代码DrawDlg *pDlg=new DrawDlg;pDlg-Create(IDD_DRAWDLG);pDlg-ShowWindow(SW_NORMAL);/DrawDlg dlg;/dlg.DoModal();void CWangjianjunDlg:OnImg()/ TODO: 在此添加命令处理程序代码CImagDlg *pDlg=new CImagDlg;pDlg-Create(IDD_IMGDLG);pDlg-ShowWindow(SW_NORMAL);void CW
23、angjianjunDlg:OnWmp()/ TODO: 在此添加命令处理程序代码CWmpDlg *pDlg=new CWmpDlg;pDlg-Create(IDD_WMPDLG);pDlg-ShowWindow(SW_NORMAL);2、 利用flash制作一个flash动画,打开主对话框,点击右键选择添加ActiveX控件,选择ShockwaveFlashObject控件,点击确定。如下图然后右击控件,添加变量,弹出对话框如下,添加变量名点击确定即可;系统将自动为其添加一个CShockwaveflash类,接着在的OnInitDialog()函数中添加如下代码:CString str=_T
24、(C:Documents and SettingsAdministrator桌面202080232_王建军_多媒体Wangjianjunres未命名-2.swf);/此路径为绝对路径,每次运行前都需先检查其路径是否正确flasher.LoadMovie(0,str);flasher.Play();点击运行即可显示是界面LOG的动画效果3、 文字处理首先进入资源视图,添加一个位图资源如下图所示,点击导入;然后给CWordDlg类添加消息映射函数BOOL CWordDlg:OnEraseBkgnd(CDC* pDC),添加以下代码以实现根据窗口大小按比例显示添加的背景图片。代码如下:BOOL CW
25、ordDlg:OnEraseBkgnd(CDC* pDC)/ TODO: 在此添加消息处理程序代码和/或调用默认值CBitmap bitmap;/构建位图对象bitmap.LoadBitmapA(IDB_BITMAP5);/加载位图CDC dcCompatible;/创建于当前DC兼容的DCdcCompatible.CreateCompatibleDC(pDC);/BITMAP bmp;bitmap.GetBitmap(&bmp);dcCompatible.SelectObject(&bitmap);CRect rect;GetClientRect(&rect);/pDC-BitBlt(0,0
26、,rect.Width(),rect.Height(),&dcCompatible,0,0,SRCCOPY);pDC-StretchBlt(0,0,rect.Width(),rect.Height(),&dcCompatible,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);return TRUE;然后添加四个菜单项,修改其对应的ID值,如下:名称ID文字镂空ID_LUNKUO文字旋转ID_Xuanzhuan颜色渐变ID_Jianbian倾斜文字ID_Qingxie然后给各个菜单项添加对应的消息映射函数,代码如下:void CWordDlg:OnLoukong()
27、m=0;Invalidate();void CWordDlg:OnXuanzhuan()m=1;SetTimer(1,50,NULL);Invalidate();void CWordDlg:OnJianbian()m=2;Invalidate();void CWordDlg:OnQingxie()m=3;Invalidate();在CWordDlg:OnPaint()函数中添加一个Swhich选择语句,根据m的值选择执行相应的消息响应程序。然后给CWordDlg类添加消息响应函数CWordDlg:OnTimer(UINT_PTR nIDEvent)在函数中添加代码,使m=1或m=2时调用此函数
28、实现定时刷新重绘屏幕以实现颜色渐变及空间旋转地效果。相应代码如下:void CWordDlg:OnPaint()CPaintDC dc(this); / device context for paintingCDC *pDC=GetDC();switch(m)case 0:CFont mFont;VERIFY(mFont.CreateFont(45,30,0,0,FW_HEAVY,TRUE,FALSE,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH|FF_SWISS,宋体);
29、CPen pen(PS_SOLID,2,RGB(255,0,0);pDC-SelectObject(&pen);pDC-BeginPath();CFont *pOldFont=pDC-SelectObject(&mFont);pDC-TextOut(100,100,多媒体王建军);pDC-EndPath();pDC-StrokePath();mFont.DeleteObject();pDC-SelectObject(pOldFont);break;case 1:/CString str10=多,媒,体,零,捌,壹,王,建,军;pDC-SelectStockObject(NULL_BRUSH);
30、pDC-SetBkMode(TRANSPARENT);CFont font;CBrush brush;CPen pen;if(bdraw)for(int i=0;iSelectObject(&font);pDC-SetTextColor(coli);pDC-TextOut(posxi,100,stri);pDC-SelectObject(oldfont);font.Detach();break;case 2:SetTimer(0,300,NULL);CFont font;font.CreatePointFont(500,黑体,pDC);CFont* pOldFont=pDC-SelectObj
31、ect(&font);/创建输出字符串.CString str (_T (多媒体班王建军!);/设置字体颜色pDC-SetTextColor (RGB (m_nRed,m_nGreen,m_nBlue);/输出字体pDC-TextOut(50,100,str);pDC-SelectObject(pOldFont);ReleaseDC(pDC);break;case 3:CRect rcClient;GetClientRect (rcClient);/创建输出字符串.CString str (_T (.I am Wangjianjun!);/输出透明红色字体pDC-SetBkMode (TRAN
32、SPARENT);pDC-SetTextColor (RGB (255,0,0);CFont font;LOGFONT stFont; /字体定义结构/设置字体格式memset(&stFont, 0, sizeof(LOGFONT);stFont.lfHeight=MulDiv(14, -pDC-GetDeviceCaps(LOGPIXELSY), 72);stFont.lfWeight=FW_NORMAL;stFont.lfClipPrecision=CLIP_LH_ANGLES;strcpy (stFont.lfFaceName, Arial);/每隔度输出字符串for (int nAng
33、le=0; nAngleSelectObject(&font);/输出字体pDC-TextOut(rcClient.left + rcClient.Width()/2,rcClient.top + rcClient.Height()/2,str);/原来字体pDC-SelectObject(pOldFont);font.DeleteObject();break;void CWordDlg:OnTimer(UINT_PTR nIDEvent)/ TODO: 在此添加消息处理程序代码和/或调用默认值if(m=2)if(m_nRed=25)m_nGreen -= 20;else if(m_nRed
34、= 0)m_nGreen = 255; elsem_nGreen = 0;if(m_nBlue=235)m_nBlue += 20;else if(m_nBlue = 255)m_nBlue = 0; elsem_nBlue = 255;Invalidate();/重画文字else if(m=1)KillTimer(1);Alpha=Alpha-I_Alpha;for(int i=0;i10;i+)Alpha1=Alpha+Decal*i;Cosine=cos(Alpha1);fontsizei=(Taille+30*Cosine)*7;posxi=Midx+100*sin(Alpha1);c
35、oli=RGB(27+Cosine*80+50),(127+Cosine*80+50),0);bdraw=TRUE;Invalidate();SetTimer(1,50,NULL);elseKillTimer(0);KillTimer(1);CDialog:OnTimer(nIDEvent);/改变文字的rgb值3、 简单绘图工具首先给绘图的菜单栏中添加两个主菜单“绘图”和“设置”,然后在其对应的子菜单中添加菜单项如下图,更改其ID号如表所示。名称ID点ID_DOT直线ID_LINE矩形ID_RECTANGLE椭圆ID_ELLIPSE涂鸦ID_TUYA线宽/线型ID_LINEWIDTH颜色ID
36、M_COLOR给对应的菜单项添加消息响应函数,代码如下:void DrawDlg:OnBnClickedCancel()OnCancel();/DestroyWindow();/delete this;void DrawDlg:OnDot()m_nDrawType=1;void DrawDlg:OnLine()m_nDrawType=2;void DrawDlg:OnRectangle()m_nDrawType=3;void DrawDlg:OnEllipse()m_nDrawType=4;void DrawDlg:OnTuya()m_nDrawType=5;添加消息响应函数OnMouseMo
37、ve、OnLButtonDown()、OnLButtonUp(),在头文件中添加需要用到的变量,在OnMouseMove、OnLButtonUp()和OnLButtonUp()函数中添加相应的代码,以实现简单的点、线、椭圆、矩形、涂鸦以及矩形内部填充色的颜色渐变功能。代码如下:1) 头文件DrawDlg.h中private:UINT m_nDrawType;CPoint m_ptOrigin;private:UINT m_nLineWidth;int m_nLineStyle;public:afx_msg void OnColor();private:COLORREF m_clr;public
38、:afx_msg void OnMouseMove(UINT nFlags, CPoint point);protected:HCURSOR m_Hcursor;CPoint m_pOld;bool m_bDraw;2) DrawDlg.cpp中void DrawDlg:OnLButtonDown(UINT nFlags, CPoint point)m_ptOrigin=point;if(m_nDrawType=5)SetCursor(m_Hcursor);m_bDraw=TRUE;m_pOld=point;SetCapture();CRect rect;GetClientRect(&rect
39、);ClientToScreen(&rect);ClipCursor(rect);CDialog:OnLButtonDown(nFlags, point);void DrawDlg:OnLButtonUp(UINT nFlags, CPoint point)CClientDC dc(this);CPen pen(m_nLineStyle,m_nLineWidth,m_clr);/设置画笔dc.SelectObject(&pen);/选择画笔CBrush *pBrush=CBrush:FromHandle(HBRUSH)GetStockObject(NULL_BRUSH);/NULL_BRUSH调用GetStockObject函数创建透明画刷dc.SelectObject(pBrush);switch(m_nDrawType)case 1:dc.SetPixel(point,m_clr);break;case 2:dc.MoveTo(m_ptOrigin);dc.LineTo(point);break;case 3: int m=(point.x-m_ptOrigin.x)/20;