多媒体编程基础课程综合作业说明书.docx
南京工程学院多媒体编程基础课程综合作业说明书题 目 多媒体处理综合应用设计 班 级 学 生 姓 名 刘土豪 学 号 2021003 20一三 年 06 月 07 日一、 程序功能与设计思路设计目标与具有的功能:必须含有文字处理、绘图、图像、音频视频四部分内容各3种以上功能,界面及应用方法自己根据软件的特色综合考虑,每位同学必须自己设计一个动画标志,放在【帮助】对话框中,或者窗口界面上设计思路:1) 图形处理:Ø 可以选择直线,矩形,椭圆,涂鸦进行绘画Ø 可以选择线的形状:实线,虚线,点线Ø 可以改变线条的颜色Ø 可以改变线条的宽度Ø 可以进行多边形填充颜色并可以改变颜色2) 图片处理:Ø 可以打开BMP格式的图片Ø 可以进行锐化,浮雕,反色等图片处理效果Ø 可以显示鼠标在图片上坐标处的颜色值和颜色3) 文字处理:Ø 实现至少少三种文字特效,比如:文字渐变,旋转体,3D,文字倾斜,下划线,空心字等4) 音乐播放器:Ø 可以打开mp3,wma,wvi格式的歌曲Ø 可以控制音乐的播放、暂停、停止Ø 可以指定播放当前音乐的上一个或下一个音乐Ø 在列表中随意选择要播放的音乐Ø 在播放时,可以获取并显示当前播放音乐的信息Ø 可以调节音乐的音量5)视频播放器:Ø 可以打开MP3,WMA,WMV,AVI,RM,RMVB,FLV,MP4等格式Ø 在列表中随意选择要播放的媒体文件Ø 控制媒体文件的播放、暂停、停止、快进、快退Ø 指定播放当前文件的上一个或下一个媒体文件Ø 在播放时,可以获取并显示当前播放媒体的文件信息Ø 播放模式可以进行进行选择Ø 可以对播放列表或列表中的选项进行删除操作二、 相关原理知识介绍(1) 图形处理:画笔和画刷是绘图中最基本的元素1.画笔(Pen):用于在设备环境中绘制直线,曲线和多边形边框。创建画笔:(1) CPen();(2) CPen(int nPenStyle, int nWidth, COLORREF crColor);nPenStyle:画笔的样式PS_SOLID 创建一个实线画笔,PS_DASH 创建一个虚线画笔,PS_DOT 创建一个点线画笔nWidth:画笔的宽度crColor:画笔的颜色(颜色用RGB值来描述) 2.画刷(CBrush):常用于填充个区域诸如多边形,椭圆和路径等图形内部区域 创建画刷:(1) CreateSolidBrush 用指定的颜色初始化画刷(2) CreateHatchBrush 用指定的阴影线初始化画刷。(3) CreateBrushIndirect用结构LOGBRUSH中指定的风格、颜色和模式初始化画刷。3.画直线:LineTo(int x,int y) 画椭圆:Ellipse(int x1,int y1, int x2,int y2) 画矩形:Rectangle(int x1,int y1,int x2,int y2)/x1,y1为边界矩形左上角的坐标,x2,y2为边界矩形右下角的坐标(2) 图片处理: BitBlt,用于从源设备中复制位图到目标设备中,BOOL BitBlt(HDC hdcDest,int nXDest,int nYDest,int nWidth,int nHeight,HDC hdcSrc,int nXSrc,int nYSrc,DWORD dwRop) hdcDest:指向目标设备环境的句柄。nXDest:指定目标矩形区域左上角的X轴逻辑坐标。nYDest:指定目标矩形区域左上角的Y轴逻辑坐标。nWidth:指定源和目标矩形区域的逻辑宽度。nHeight:指定源和目标矩形区域的逻辑高度。hdcSrc:指向源设备环境的句柄。nXSrc:指定源矩形区域左上角的X轴逻辑坐标。nYSrc:指定源矩形区域左上角的Y轴逻辑坐标。dwRop:指定光栅操作代码。这些代码将定义源矩形区域的颜色数据,如何与目标矩形区域的颜色数据组合以完成最后的颜色。(3) 文字处理:输出文字Textout():用当前字体在指定位置处写一个字符串TextOut(int x,int y,Cstring string):文本起点的x坐标和y坐标以及要绘制的字符串创建字体LOGFONT 结构(4) 音频播放器:使用VC+6.0强大的MFC、AppWizard、Class Wizard和其中的多种控件可以很方便地建立各种应用程序。同时想要实现更高级更复杂的功能,也可以借助ActiveX控件资源,用这些现有的控件资源,可以省去自己编程的复杂过程,从而实现更高级的功能。本次课程设计要使用VC+6.0自带的一个ActiveX控件Windows Media Player控件,建立自己的多媒体播放器三、 界面设计和功能实现1. 主界面设计结构框架图:主界面音频播放器音乐播放器图形处理图片处理文字效果2. 打开VC 6.0,新建MFC工程,基于对话框,名称为多媒体课设3. 向主窗口拖一个Tab控件,并调整大小使之占据2/3主窗口大小,并为Tab添加类向导,添加IDC_TAB1的变量:m_tab完成后在 “多媒体课设Dlg.cpp”中的OnInitDialog添加如下代码:/ Set the icon for this dialog. The framework does this automatically/ when the application's main window is not a dialogSetIcon(m_hIcon, TRUE);/ Set big iconSetIcon(m_hIcon, FALSE);/ Set small icon/ TODO: Add extra initialization here m_tab.InsertItem(0,"图形处理"); m_tab.InsertItem(1,"图片处理"); m_tab.InsertItem(2,"文字处理"); m_tab.InsertItem(3,"音乐播放");m_tab.InsertItem(4,"音频播放"); RECT rc;m_tab.GetClientRect(&rc);m_draw.Create(IDD_DRAW_DIALOG,&m_tab);m_draw.SetWindowPos(NULL,5,20,rc.right,rc.bottom,SWP_SHOWWINDOW);m_picture.Create(IDD_PICTURE_DIALOG,&m_tab);m_picture.SetWindowPos(NULL,5,20,rc.right,rc.bottom,SWP_HIDEWINDOW);m_music.Create(IDD_MUSIC_DIALOG,&m_tab);m_music.SetWindowPos(NULL,5,20,rc.right,rc.bottom,SWP_HIDEWINDOW);m_movie.Create(IDD_MOVIE_DIALOG,&m_tab);m_movie.SetWindowPos(NULL,5,20,rc.right,rc.bottom,SWP_HIDEWINDOW);m_word.Create(IDD_WORD_DIALOG,&m_tab);m_word.SetWindowPos(NULL,5,20,rc.right,rc.bottom,SWP_HIDEWINDOW); return TRUE; / return TRUE unless you set the focus to a control在添加类向导OnSelchangeTab1()中添加代码:void CMyDlg:OnSelchangeTab1(NMHDR* pNMHDR, LRESULT* pResult) / TODO: Add your control notification handler code hereCRect rc;m_tab.GetClientRect(&rc);switch(m_tab.GetCurSel()case 0: m_movie.SetWindowPos(NULL,5,20,rc.right,rc.bottom,SWP_HIDEWINDOW);m_music.SetWindowPos(NULL,5,20,rc.right,rc.bottom,SWP_HIDEWINDOW);m_word.SetWindowPos(NULL,5,20,rc.right,rc.bottom,SWP_HIDEWINDOW);m_picture.SetWindowPos(NULL,5,20,rc.right,rc.bottom,SWP_HIDEWINDOW);m_draw.SetWindowPos(NULL,5,20,rc.right,rc.bottom,SWP_SHOWWINDOW);break;case 1:m_movie.SetWindowPos(NULL,5,20,rc.right,rc.bottom,SWP_HIDEWINDOW);m_music.SetWindowPos(NULL,5,20,rc.right,rc.bottom,SWP_HIDEWINDOW);m_word.SetWindowPos(NULL,5,20,rc.right,rc.bottom,SWP_HIDEWINDOW);m_draw.SetWindowPos(NULL,5,20,rc.right,rc.bottom,SWP_HIDEWINDOW);m_picture.SetWindowPos(NULL,5,20,rc.right,rc.bottom,SWP_SHOWWINDOW);break;case 2: m_movie.SetWindowPos(NULL,5,20,rc.right,rc.bottom,SWP_HIDEWINDOW); m_music.SetWindowPos(NULL,5,20,rc.right,rc.bottom,SWP_HIDEWINDOW);m_picture.SetWindowPos(NULL,5,20,rc.right,rc.bottom,SWP_HIDEWINDOW);m_draw.SetWindowPos(NULL,5,20,rc.right,rc.bottom,SWP_HIDEWINDOW);m_word.SetWindowPos(NULL,5,20,rc.right,rc.bottom,SWP_SHOWWINDOW);break;case 3:m_movie.SetWindowPos(NULL,5,20,rc.right,rc.bottom,SWP_HIDEWINDOW);m_word.SetWindowPos(NULL,5,20,rc.right,rc.bottom,SWP_HIDEWINDOW);m_picture.SetWindowPos(NULL,5,20,rc.right,rc.bottom,SWP_HIDEWINDOW); m_draw.SetWindowPos(NULL,5,20,rc.right,rc.bottom,SWP_HIDEWINDOW);m_music.SetWindowPos(NULL,5,20,rc.right,rc.bottom,SWP_SHOWWINDOW);break;case 4:m_music.SetWindowPos(NULL,5,20,rc.right,rc.bottom,SWP_HIDEWINDOW);m_word.SetWindowPos(NULL,5,20,rc.right,rc.bottom,SWP_HIDEWINDOW);m_picture.SetWindowPos(NULL,5,20,rc.right,rc.bottom,SWP_HIDEWINDOW);m_draw.SetWindowPos(NULL,5,20,rc.right,rc.bottom,SWP_HIDEWINDOW);m_movie.SetWindowPos(NULL,5,20,rc.right,rc.bottom,SWP_SHOWWINDOW);break;*pResult = 0;4. 本作业分为5个部分:图形处理,图片处理,文字处理,音乐播放,音频播放(1)分别建立5个资源:选择菜单栏的“插入”,选择窗体,窗体名称分别为:DRAW,Picture,Word,MUSIC,MOVIE并将窗体的样式改为如下:(2)分别为5个窗体创建变量名称:在 “多媒课设Dlg.h”中添加变量:另外将5个部分的头文件全部加到“多媒体课设Dlg.h”中,才能调用哦(3)插入背景图片:菜单栏选择“插入”,选择“资源”,选择“Bitmap”,点击“引入”,选择BMP格式的图片名称为IDB_BITMAP4,在OnPaint()添加如下代码:else/CDialog:OnPaint();CPaintDC dc(this); CRect rect; GetClientRect(&rect); CDC dcMem; dcMem.CreateCompatibleDC(&dc); CBitmap bmpBackground; bmpBackground.LoadBitmap(IDB_BITMAP4);BITMAP bitmap; bmpBackground.GetBitmap(&bitmap); CBitmap *pbmpOld=dcMem.SelectObject(&bmpBackground); dc.StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,bitmap.bmWidth,bitmap.bmHeight,SRCCOPY);二各个板块设计:(1)图形处理:图形处理设计框架图: 图形处理界面选择图形清空面板改变填充颜色选择线型改变画笔颜色输入线宽实线点线虚线椭圆直线矩形涂鸦设计如图:插件名称ID直线IDC_Line矩形IDC_Rect椭圆IDC_Elipse涂鸦IDC_Tuya线型IDC_Linestyle线宽IDC_Linewidth画笔颜色IDC_Pen color填充颜色IDC_Brushcolor清空面板IDC_clear绘画区域IDC_Show功能实现:在Draw.h添加变量:设置默认值:DRAW:DRAW(CWnd* pParent): CDialog(DRAW:IDD, pParent)/AFX_DATA_INIT(DRAW)m_linewidth = 0;f_move=0;color_pen=RGB(255,0,0);color_brush=RGB(255,255,255);Hcursor=AfxGetApp()->LoadStandardCursor(IDC_CROSS);/AFX_DATA_INIT在OnInitDialog()中设置线型的选择和默认值,代码如下:BOOL DRAW:OnInitDialog() CDialog:OnInitDialog();/ TODO: Add extra initialization hereCheckRadioButton(IDC_Line,IDC_Tuya,IDC_Rect);/默认选择画矩形m_linestyle.AddString("实线");m_linestyle.AddString("虚线");m_linestyle.AddString("点线"); m_linestyle.SetCurSel(0);/默认画实线return TRUE; / return TRUE unless you set the focus to a control / EXCEPTION: OCX Property Pages should return FALSE在OnPaint添加如下代码:void DRAW:OnPaint() CPaintDC dc(this); / device context for painting/ TODO: Add your message handler code hereUpdateData(TRUE);CRect rect;GetDlgItem(IDC_SHOW)->GetWindowRect(&rect);ScreenToClient(&rect);CBrush brush(RGB(255,255,255);dc.FillRect(CRect(rect.left,rect.top+8,rect.right,rect.bottom),&brush);/ Do not call CDialog:OnPaint() for painting messages添加LButtonDown函数响应:void DRAW:OnLButtonDown(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call defaultUpdateData(TRUE);m_BeginPoint = point;m_EndPoint = point;SetCapture();/执行这条语句后,当鼠标移动到本窗口以外时,鼠标消息仍然被发送给本窗口;f_move = 1; CRect rect; GetClientRect(&rect);ClientToScreen(&rect);CDialog:OnLButtonDown(nFlags, point);添加LButtonUp函数响应:void DRAW:OnLButtonUp(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call defaultCDC *dc=GetDC();if(f_move):ReleaseCapture();/停止捕获鼠标消息 draw(point,1); f_move = 0;CDialog:OnLButtonUp(nFlags, point);添加MouseMove函数响应:void DRAW:OnMouseMove(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call defaultdraw(point,0);CDialog:OnMouseMove(nFlags, point);给“线型按钮”添加CBN_SELCHANCE响应函数,代码如下:void DRAW:OnSelchangeLinestyle() / TODO: Add your control notification handler code hereCString str;m_linestyle.GetLBText(m_linestyle.GetCurSel(),str);if(0 = strxpare("实线") type = PS_SOLID;if(0 = strxpare("虚线")type = PS_DASH;if(0 = strxpare("点线")type = PS_DOT;添加draw()函数,实现各种功能的绘图:void DRAW:draw(CPoint point, int k)CPen pen(type,m_linewidth,color_pen);CClientDC ClientDC(this);ClientDC.SelectObject(&pen);CBrush brush(color_brush);ClientDC.SelectObject(&brush);int j; j = GetCheckedRadioButton(IDC_Line,IDC_Tuya);if(f_move)switch(j) case IDC_Rect: ClientDC.SetROP2(R2_NOT); ClientDC.MoveTo(m_BeginPoint); ClientDC.Rectangle(m_BeginPoint.x,m_BeginPoint.y,m_EndPoint.x,m_EndPoint.y); if(k=1) ClientDC.SetROP2(R2_COPYPEN); ClientDC.MoveTo(m_BeginPoint); ClientDC.Rectangle(m_BeginPoint.x,m_BeginPoint.y,point.x,point.y); m_EndPoint=point; break; case IDC_Line:ClientDC.SetROP2(R2_NOT);ClientDC.MoveTo(m_BeginPoint);ClientDC.LineTo(point); if(k = 1)ClientDC.SetROP2(R2_COPYPEN);ClientDC.MoveTo(m_BeginPoint);ClientDC.LineTo(point);m_EndPoint=point;break;case IDC_Ellipse:ClientDC.SetROP2(R2_NOT);ClientDC.MoveTo(m_BeginPoint);ClientDC.Ellipse(m_BeginPoint.x,m_BeginPoint.y,m_EndPoint.x,m_EndPoint.y);if(k=1)ClientDC.SetROP2(R2_COPYPEN);ClientDC.MoveTo(m_BeginPoint);ClientDC.Ellipse(m_BeginPoint.x,m_BeginPoint.y,point.x,point.y);m_EndPoint=point;break;case IDC_Tuya:ClientDC.MoveTo(m_BeginPoint);ClientDC.LineTo(point);m_BeginPoint = point;break;给“填充颜色”按钮添加单击响应:void DRAW:OnBrushcolor() / TODO: Add your control notification handler code here CColorDialog m_pColorDlg;m_pColorDlg.m_cc.Flags = CC_ANYCOLOR|CC_ENABLEHOOK;if(m_pColorDlg.DoModal() = IDOK)color_brush = m_pColorDlg.GetColor();给“画笔颜色”按钮添加单击响应:void DRAW:OnPencolor() / TODO: Add your control notification handler code hereCColorDialog m_pColorDlg;m_pColorDlg.m_cc.Flags = CC_ANYCOLOR|CC_ENABLEHOOK;if(m_pColorDlg.DoModal() =IDOK)color_pen = m_pColorDlg.GetColor();添加“情况面板”按钮单击响应:void DRAW:Onclear() / TODO: Add your control notification handler code hereInvalidate();(2)图片处理:图形处理设计框架图: 图片处理界面 打开图片轮廓杂色反色浮雕锐化鼠标处的RGB和颜色蓝绿颜色红设计如图:控件名称ID图形显示区域IDC_DRAW打开IDC_OPEN锐化IDC_sharp浮雕IDC_fudiao反色IDC_fanse轮廓IDC_lunkuo杂色IDC_zase(编辑框)红IDC_RED(编辑框)蓝IDC_GREEN(编辑框)绿IDC_BLUE(编辑框)显示颜色IDC_COLOR实现功能:在Picture.h中添加变量:在OnPaint()添加代码如下:void Picture:OnPaint() CPaintDC dc(this); / device context for painting/ TODO: Add your message handler code hereCDialog:OnPaint();CWnd*pWnd=GetDlgItem(IDC_DRAW);pWnd->UpdateWindow();DrawPhoto();/ Do not call CDialog:OnPaint() for painting messages添加DrawPhoto()函数,代码如下:void Picture:DrawPhoto() if(!m_hBitmap) return; CBitmap m_bmp; m_bmp.Attach(m_hBitmap); BITMAP bm; m_bmp.GetObject(sizeof(BITMAP),&bm); float fScale; fScale=(float)bm.bmHeight/(float)bm.bmWidth; CWnd*pWnd=GetDlgItem(IDC_DRAW); CDC*pDC=pWnd->GetDC(); CRect reClient; int nWidth,nHeight,nX=0,nY=0; pWnd->GetClientRect(reClient); nWidth=reClient.Width(); nHeight=(int)(float)nWidth*fScale); nX=0; nY=(reClient.Height()-nHeight)/2; if(nHeight>reClient.Height() nHeight=reClient.Height(); nWidth=(int)(float)nHeight/fScale); nX=(reClient.Width()-nWidth)/2; nY=0; CDC dcMem; dcMem.CreateCompatibleDC(pDC); CBitmap *pOldbmp=dcMem.SelectObject(&m_bmp); reClient.DeflateRect(0,0); pDC->Rectangle(reClient); pDC->StretchBlt(nX,nY,nWidth,nHeight,&dcMem,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY); dcMem.SelectObject(pOldbmp);给“打开”按钮添加单击响应,代码如下:void Picture:OnOpen() / TODO: Add your control notification handler code herestatic char BASED_CODE szFilter="图片文件(*.bmp)|*.bmp|" CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,szFilter);if(IDOK!=dlg.DoModal()return;m_hBitmap=(HBITMAP):LoadImage(AfxGetInstanceHandle(),dlg.GetPathName(),IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);GetDlgItem(IDC_sharp)->EnableWindow(TRUE);Invalidate();给“锐化”按钮添加单击响应,代码如下:void Picture:Onsharp() / TODO: Add your control notification handler code hereint sharpLaplacian9=-1,-1,-1,-1,9,-1,-1,-1,-1; CWnd*pWnd=GetDlgItem(IDC_DRAW);CDC*pDC=pWnd->GetDC();pWnd->UpdateWindow();CRect reClient;pWnd->GetClientRect(reClient);int nWidth=reClient.Width();int nHeight=reClient.Height();COLORREF bkPixel400300;for(int bi=0;bi<nWidth;bi+) for(int bj=0;bj<nHeight;bj+)bkPixelbibj=pDC->GetPixel(bi,bj);int i,j;for(i=1;i<nWidth-1;i+) for(j=1;j<nHeight-1;j+) int rr=0,gg=0,bb=0,index=0; for(int col=-1;col<=1;col+) for(int row=-1;row<=1;row+) COLORREF clr=bkPixeli+rowj+col; rr+=GetRValue(clr)*sharpLaplacianindex; gg+=GetGValue(clr)*sharpLaplacianindex; bb-=GetBValue(clr)*sharpLaplacianindex; index+; if(rr>255) rr=255; else if(rr<0) rr=-rr; if(gg>255) gg=255; else if(gg<0) gg=-gg; if(bb>255) bb=255; else if(bb<0) bb=-bb; pDC->SetPixelV(i,j,RGB(rr,gg,bb); 给“浮雕”按钮添加单击响应,代码如下:void Picture:Onfudiao() / TODO: Add your control notification handl