音乐播放器课设报告要点_音乐播放器课设

2020-02-27 其他范文 下载本文

音乐播放器课设报告要点由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“音乐播放器课设”。

音乐播放器

音乐播放器问题定义和可行性研究................................................................2

(1)问题定义.......................................................................................................................2(2)可行性研究.....................................................................................................................3需求分析........................................................................................3功能需求...............................................................................................................................3

1.1 功能描述....................................................................................................................3 2 性能需求...............................................................................................................................4 3 将来可能提出的要求...........................................................................................................4 4项目描述................................................................................................................................5

4.1编写目的.....................................................................................................................5 4.2项目背景.....................................................................................................................5 4.3开发工具及环境简介.................................................................................................6 3 概要设计和详细设计....................................................................6

3.1概要设计.............................................................................................................................6 3.2 详细设计............................................................................................................................7 3.3音乐编码设计.....................................................................................................................7

5主界面界面介绍.............................................................................8 6 系统的实现..................................................................................11

一、主要的对话框.................................................................................................................11

二、全局变量.........................................................................................................................12

三、初始化函数.....................................................................................................................12

三、播放、暂停功能.............................................................................................................15

四、添加文件到播放列表.....................................................................................................18

五、下一首上一首................................................................................................................20

六、停止播放.........................................................................................................................21

七、播放模式.........................................................................................................................21

八、显示时间和播放进度.....................................................................................................22

九、删除歌曲.........................................................................................................................23 5.2 单元测试..........................................................................................................................25 6.总结...............................................................................................26问题定义和可行性研究

本章分为两部分,问题定义和可行性研究。问题定义阶段主要研究我们所学的知识能做什么项目,而可行性研究给出了制作音乐播放器的可行性。

(1)问题定义

通过开发音乐播放器,来练习本学期软件工程课程所学知识。熟悉软件开发的各个阶段,将书本上的知识与实践性的开发活动联系起来。实现音乐播放器基本的功能。(2)可行性研究

大一的时候已经学过了基本的C++编程的知识,在这个基础上,有三个星期的时间来学习MFC编程,学习文件的读写操作,以及系统API函数调用等知识。边学边用,具备开发软件的能力。需求分析

本章给出了音乐播放器应该具备的功能,并给出了功能示意图,最后提出了实现该播放器应该具备的条件。功能需求 1.1 功能描述

本播放器主要有如下功能:1.对文件进行操作。2.对按钮的处理

1.对文件的操作

通过文件的读写知识,实现浏览目录以选择文件,添加歌曲到播放列表,删除播放列表中的歌曲,对已经选中的文件进行播放、暂停,以及通过双击播放列表中的歌曲来播放文件。

2.对控件的处理

对各种按钮添加了事件响应函数,可以处理基本的播放,暂停,上一首/下一首,删除,选择播放模式等操作。功能如下图:性能需求

本项目是一个普通的音乐播放器,运行环境为VS2010,项目运行速率正常,可以满足用户需求。1.时间性能要求:越低越好。

2.便捷性:运用了可视化编程,更有助于人机交互,更人性化。程序的运行,符合正常的操作习惯,程序功能明了简洁!将来可能提出的要求

(1)歌曲列表的保存(2)菜单操作(3)更换背景图片

(4)提供网络下载功能:支持通过歌名和歌手名进行歌曲检索和下载功能;(5)支持歌词显示和同步播放;(6)支持歌曲在线播放;

(7)支持更友好的歌曲检索和下载功能;(8)提供更良好的操作界面。

4项目描述 4.1编写目的设计一个基于windows平台的音乐点播系统,实现音乐库的管理以及播放功能。

音乐播放器能够满足音乐的播放功能,实现一款播放器的基本功能。

4.2项目背景

本项目作为《软件课程设计》课程的训练项目提出,在基本的设计实现基础上,将不断对已有的设计进行进一步的修改和完善,最终完成整个软件开发过程。本次项目的旨在通过不同软件工程设计方法与技术的实践,了解和掌握各种技术、工具平台的特点与局限性,体会协同开发方式。

第1阶段:主要目的是通过对项目需求的分析和理解,通过面向对象的设计方式完成项目前期的准备工作。

第2阶段:我们会根据既定需求,完善设计模式。第3阶段:在设计文档和需求分析的文档下,完成音乐点播系统原型的开发,并完成整个开发流程的测试报告

第4阶段:通过音乐点播系统软件的设计开发,了解软件文档的编写原则,训练掌握软件各类文档写作的技巧,同时在文档的编写过程中提高和增加C++开发的能力和经验。

4.3开发工具及环境简介

操作系统:windows xp或以上版本

C++ 6.0: Visual C++是一个功能强大的可视化软件开发工具。自1993年Microsoft公司推出Visual C++1.0后,随着其新版本的不断问世,Visual C++已成为专业程序员进行软件开发的首选工具。

Microsoft Office Word 2003:经典办公软件,本项目中用于编写文档。概要设计和详细设计

3.1概要设计

通过这个阶段的工作将划分出组成系统的物理元素——程序,文件和文档等,但是每个物理元素仍然处于黑盒子级,这些黑盒子里的具体内容将在以后仔细设计。总体设计的另一项重要任务是设计软件的结构,也就是要确定该软件由哪些模块组成的,以及这些模块之间的关系。

运用传统软件工程方法学的知识将音乐播放器软件的开发分成:

一、MFC的使用以及实现方法

二、文件的读写操作

三、系统API函数的调用

3.2 详细设计

根据概要设计所划分的四个模块,该阶段应详细地完成这四个模块的任务:

一、MFC的实现

通过MFC窗口以及函数的使用,创建出播放器的主界面,主界面应包括文件的打开、添加、播放以及线程按键。另外,还要各种函数应该实现相应组件上的各种事件。

二、文件读写操作的实现

通过以前的学过的文件读写操作知识,实现对音乐文件的读以及写操作。

三、系统API函数的调用

通过调用系统媒体控制接口函数实现对mp3,wav,wma等格式的音乐的播放的功能。

3.3音乐编码设计

一、编码原理

1.音乐的十二平均率规定(1)每两个八度音之间的频率相差一倍。

(2)两个八度音之间又可以分为十二个伴音,每两个伴音的频率比为1.059463。

(3)低音6(音名A)的频率是440Hz,音名B到C之间、E到F之间为伴音,其余为全音。2.乐谱编码

选取65536Hz为基准频率,以此频率分频得到简谱高音各音调的分频比。计算公式为N=65536/f。

二、编码参照

为了让ROM能够识别各音频的分频系数,需将个音频分频系数按照一定格式转换成十六进制格式。我们采用8位的ROM,D6D5位表示高中低音,如表1-2所示,11为高音,10为中音,01为低音;用D4D3D2D1D0位表示分频系数,将表1-1的分频系数转换成二进制格式表示;ROM的高位全部补0。然后转换成十六进制如表1-2所示。之所以采用高音分频比的二分之一为基准分频系数,是因为ROM的位宽限制,而每两个八度音频率相差一倍,所以我们后面用译码器译成各音频的分频系数输出给分频器,这样由分频器输出到扬声器,扬声器就可发声了。

5主界面界面介绍

1、界面图:

2添加歌曲按钮

3、删除歌曲按钮

4、音量的变大变小按钮

5、歌曲时间和进度的显示图像

6、下一首歌按钮

7、上一首歌按钮

8、停止播放按钮

9、播放按钮

10、单曲播放/随机播放/顺序播放按钮

11、空白部分为歌曲的菜单列表 6 系统的实现

一、主要的对话框

cla CMCIPlayerDlg : public CDialogEx { // 构造 public: CMCIPlayerDlg(CWnd* pParent = NULL);// 标准构造函数 // 对话框数据

enum { IDD = IDD_MCIPLAYER_DIALOG };

protected: virtual void DoDataExchange(CDataExchange* pDX);//

DDX/DDV 支持

// 实现 protected: HICON m_hIcon;

// 生成的消息映射函数

virtual BOOL OnInitDialog();afx_msg void OnSysCommand(UINT nID, LPARAM lParam);afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();DECLARE_MESSAGE_MAP()public: // 列表

CListBox m_list;afx_msg void OnBnClickedOnstart();afx_msg void OnBnClickedOnloadmusic();void load(music a);int isplay;int index;CSliderCtrl volume;afx_msg void OnNMCustomdrawVolun(NMHDR *pNMHDR, LRESULT

*pResult);afx_msg void OnBnClickedOnnext();afx_msg void OnBnClickedOnper();afx_msg void OnBnClickedOnstop();LRESULT OnMciNotify(WPARAM wParam, LPARAM lParam);//设置播放

模式

afx_msg void OnBnClickedOrder();afx_msg void OnLbnDblClk();void OnTimer(UINT nIDEvent);// 进度条

CSliderCtrl m_progre;afx_msg DWORD getinfo(DWORD item);afx_msg void OnBnClickedDeletemusic();};

二、全局变量

struct music { string name;string mPath;};int m_max;//进度条的最大位置变量

int hour,minute,second;//时间变量:小时、分钟、秒钟 DWORD cdlen;//某个音频文件的总时间长度 DWORD m_count;//设备型号

DWORD cdfrom,cdto;//歌曲的起点和终点 DWORD DeviceID;

list mus;//全局歌曲链表

vector allpath;//保存已有的歌

三、初始化函数

BOOL CMCIPlayerDlg::OnInitDialog(){ CDialogEx::OnInitDialog();

// 将“关于...”菜单项添加到系统菜单中。

//volume.SetBkColor(RGB(37,38,37));

HBITMAP

hBitmap;

hBitmap = LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP4));

((CButton *)GetDlgItem(IDC_ONSTART))->SetBitmap(hBitmap);

hBitmap = LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP1));

((CButton *)GetDlgItem(IDC_ONPER))->SetBitmap(hBitmap);

hBitmap = LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP2));

((CButton *)GetDlgItem(IDC_ONNEXT))->SetBitmap(hBitmap);

hBitmap = LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP5));

((CButton *)GetDlgItem(IDC_ONSTOP))->SetBitmap(hBitmap);

hBitmap = LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP7));

((CButton *)GetDlgItem(IDC_ORDER))->SetBitmap(hBitmap);

SetBackgroundImage(IDB_BITMAP6,BACKGR_TILE,NULL);

isplay=0;

//未播放状态

index=-1;

m_list.SetCurSel(0);//设置初始选择位置

volume.SetRange(0,1000);//滑块的移动范围0~1000

volume.SetPos(500);//滑块指针的初始位置设为500代表初始音

量为50

ifstream rin;

//导入原先数据

rin.open(“Mylist.txt”);

//int rere;

string str[2];

if(rin>>setw(50)>>str[0]>>setw(150)>>str[1])

while(!rin.eof())

{

music mu;

mu.name=str[0];

mu.mPath=str[1];

CString name;

for(int i=0;i

{

if(mu.name[i]=='/')

mu.name[i]=' ';

}

name=mu.name.c_str();

CString mPath;

for(int i=0;i

{

if(mu.mPath[i]=='/')

mu.mPath[i]=' ';

}

mPath=mu.mPath.c_str();

int j=m_list.GetCount();// 把名字和地址插

入到list控件

m_list.InsertString(j,name);

//CString *p=&mPath;

allpath.push_back(mPath);

rin>>str[0]>>str[1];

}

rin.close();

// IDM_ABOUTBOX 必须在系统命令范围内。

ASSERT((IDM_ABOUTBOX & 0xFFF0)== IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX

CMenu* pSysMenu = GetSystemMenu(FALSE);if(pSysMenu!= NULL){

BOOL bNameValid;

CString strAboutMenu;

bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);

ASSERT(bNameValid);

if(!strAboutMenu.IsEmpty())

{

pSysMenu->AppendMenu(MF_SEPARATOR);

pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBOX, strAboutMenu);

} }

// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将

自动

// 执行此操作

SetIcon(m_hIcon, TRUE);

// 设置大图标

SetIcon(m_hIcon, FALSE);// 设置小图标

// TODO: 在此添加额外的初始化代码

return TRUE;// 除非将焦点设置到控件,否则返回 TRUE }

三、播放、暂停功能

void CMCIPlayerDlg::OnBnClickedOnstart()//开始播放 { // TODO: 在此添加控件通知处理程序代码

if(isplay==0){ // TODO: 在此添加控件通知处理程序代码

if(m_list.GetCurSel()==-1)//判断有没有歌曲被选中,若

没有,则从第一首开始播放-1代表没有被选中

m_list.SetCurSel(0);

if(m_list.GetCurSel()==index){

SetTimer(0,1000,NULL);

mciSendCommand(DeviceID,MCI_RESUME,0,0);

HBITMAP

hBitmap;

hBitmap = LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP3));

((CButton *)GetDlgItem(IDC_ONSTART))->SetBitmap(hBitmap);

SetDlgItemText(IDC_ONSTART,“暂停”);

isplay=1;} else {

index = m_list.GetCurSel();CString data;//m_list.GetDlgItemTextA(index,data);//CString c=dat

MCI_OPEN_PARMS mciopenparms;//打开

MCI_PLAY_PARMS mciplayparms;//播放

second=0;minute=0;hour=0;mciopenparms.lpstrElementName=allpath[index];//将音乐文件路

径传给设备

DWORD dwReturn;if(dwReturn=mciSendCommand(NULL,MCI_OPEN,MCI_OPEN_ELEMENT|

MCI_WAIT,(DWORD)(LPVOID)&mciopenparms)){

//如果打开文件失败,则将出错信息储存在buffer,并显示

出错警告

char buffer[256];

mciGetErrorString(dwReturn,buffer,256);

MeageBox(buffer,“出错警告!”,MB_ICONHAND|

MB_ICONERROR|MB_ICONSTOP);

} DeviceID=mciopenparms.wDeviceID;

mciopenparms.lpstrDeviceType=NULL;//文件类型

m_count=mciopenparms.wDeviceID;//多媒体设备类型编号

mciplayparms.dwFrom=0;//每次播放都是从0开始播放

HWND hwnd = GetSafeHwnd();

mciplayparms.dwCallback =(DWORD)hwnd;cdlen=getinfo(MCI_STATUS_LENGTH);

CString stime;CClientDC dc(this);dc.SetBkColor(RGB(255,255,255));//设置放置计数器区域的外观

dc.SetTextColor(RGB(95,180,66));stime.Format(“%02d:%02d:%02d”,cdlen/3600000,(cdlen

%3600000)/60000,((cdlen%3600000)%60000)/1000);//显示时间进度

dc.TextOut(328,13,stime);

mciSendCommand(DeviceID,MCI_PLAY,/*MCI_FROM|*/MCI_NOTIFY,(DWORD)(LPVOID)&mciplayparms);

SetTimer(0,1000,NULL);//设置系统计数器,显示歌曲播放的进度

HBITMAP

hBitmap;

hBitmap = LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP3));

((CButton *)GetDlgItem(IDC_ONSTART))->SetBitmap(hBitmap);

SetDlgItemText(IDC_ONSTART,“暂停”);isplay=1;}

} else {

KillTimer(0);

mciSendCommand(DeviceID,MCI_PAUSE,0,0);

HBITMAP

hBitmap;

hBitmap = LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP4));

((CButton *)GetDlgItem(IDC_ONSTART))->SetBitmap(hBitmap);

SetDlgItemText(IDC_ONSTART,“播放”);

isplay=0;} }

四、添加文件到播放列表

void CMCIPlayerDlg::OnBnClickedOnloadmusic()//导入歌曲 { // TODO: 在此添加控件通知处理程序代码

CFileDialog dlg(TRUE, _T(“*.*”), NULL,OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY,_T(“mp3文件(*.mp3)|*.mp3|”

“wma文件(*.wma)|*.wma|”

“wav文件(*.wav)|*.wav|”

“所有文件(*.*)|*.*|”), NULL);

// 选项图片的约定

dlg.m_ofn.lpstrTitle = _T(“打开音乐文件”);

// 打开文件对话框 的标题名

if(dlg.DoModal()!= IDOK)

// 判断是否获得图

return;

CString mPath = dlg.GetPathName();// 获取音乐路径

CString mmpath=mPath;

allpath.push_back(mPath);

int i = mPath.ReverseFind('');//从磁盘地址中获取歌曲名字

CString name;

name = mPath.Right(mPath.GetLength()-1-mPath.ReverseFind(''));

int j=m_list.GetCount();// 把名字和地址插入到list控件

m_list.InsertString(j,name);//m_shelllist.SetItemText(j,0,name);music mu;mu.name=name.GetBuffer();mu.mPath=mPath.GetBuffer();load(mu);}

void CMCIPlayerDlg::load(music a){ list mus;

ifstream rin;

rin.open(“Mylist.txt”);

//int rere;

string str[2];

if(rin>>str[0]>>str[1])

while(!rin.eof())

{

music mu;

mu.name=str[0];

mu.mPath=str[1];

if(mu.name!=a.name)

mus.push_back(mu);

else

{

MeageBox(“已经有该歌曲”);

return;

}

rin>>str[0]>>str[1];

}

rin.close();

for(int i=0;i

//把名

字里面的空格变为'_'

{

if(a.name[i]==' ')

a.name[i]='/';

}

for(int i=0;i

//把地

址里面的空格变为'*'

{

if(a.mPath[i]==' ')

a.mPath[i]='/';

}

mus.push_back(a);

ofstream out(“Mylist.txt”);list::iterator it=mus.begin();while(it!=mus.end()){

out

(*it).mPath

it++;} out.close();}

五、下一首上一首

void CMCIPlayerDlg::OnBnClickedOnnext()//下一首 { // TODO: 在此添加控件通知处理程序代码

KillTimer(0);

second=0;minute=0;hour=0;mciSendCommand(DeviceID,MCI_CLOSE,0,0);//在加载文件前先清空 上一次播放的设备

isplay=0;index = m_list.GetCurSel();if(index+1==m_list.GetCount()){

m_list.SetCurSel(0);} else {

m_list.SetCurSel(index+1);}

OnBnClickedOnstart();

isplay=1;}

void CMCIPlayerDlg::OnBnClickedOnper()//上一首 { // TODO: 在此添加控件通知处理程序代码

KillTimer(0);

second=0;minute=0;hour=0;mciSendCommand(DeviceID,MCI_CLOSE,0,0);//在加载文件前先清空 上一次播放的设备

isplay=0;

} index = m_list.GetCurSel();if(index==0){ m_list.SetCurSel(m_list.GetCount()-1);} else { m_list.SetCurSel(index-1);} OnBnClickedOnstart();isplay=1;

六、停止播放

void CMCIPlayerDlg::OnBnClickedOnstop()//停止 { // TODO: 在此添加控件通知处理程序代码

KillTimer(0);

second=0;minute=0;hour=0;mciSendCommand(DeviceID,MCI_CLOSE,0,0);//在加载文件前先清空 上一次播放的设备

isplay=0;SetDlgItemText(IDC_ONSTART,“播放”);HBITMAP

hBitmap;

hBitmap = LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP4));

((CButton *)GetDlgItem(IDC_ONSTART))->SetBitmap(hBitmap);

index=-1;UpdateData(false);}

七、播放模式

void CMCIPlayerDlg::OnBnClickedOrder()//设置播放模式 { // TODO: 在此添加控件通知处理程序代码

CString pattern;GetDlgItemText(IDC_ORDER,pattern);if(pattern==“顺序”){

SetDlgItemText(IDC_ORDER,“随机”);

HBITMAP

hBitmap;

hBitmap = LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP8));

((CButton *)GetDlgItem(IDC_ORDER))->SetBitmap(hBitmap);

} if(pattern==“随机”){

SetDlgItemText(IDC_ORDER,“单曲”);

HBITMAP

hBitmap;

hBitmap = LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP9));

((CButton *)GetDlgItem(IDC_ORDER))->SetBitmap(hBitmap);

} if(pattern==“单曲”){

SetDlgItemText(IDC_ORDER,“顺序”);

HBITMAP

hBitmap;

hBitmap = LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP7));

((CButton *)GetDlgItem(IDC_ORDER))->SetBitmap(hBitmap);

} }

八、显示时间和播放进度

void CMCIPlayerDlg::OnTimer(UINT nIDEvent){ CString stime;second++;CClientDC dc(this);dc.SetBkColor(RGB(255,255,255));//设置放置计数器区域的外观

dc.SetTextColor(RGB(95,180,66));

if(second==60)//设置钟表的显示

{minute++;second=0;} if(minute==60){hour++;minute=0;} if(hour==24){hour=0;} stime.Format(“%02d:%02d:%02d”,hour,minute,second);//显示时间

进度

dc.TextOut(68,13,stime);m_progre.SetRange(0,cdlen);//使进度条的范围与歌曲时间一致

UpdateData(false);m_max=cdfrom;//保存歌曲的当前位置信息

if(m_max!=cdlen)//如果歌曲结束,则进度条重新置0 {m_progre.SetPos(cdfrom);} else {m_progre.SetPos(0);m_max=0;OnBnClickedOnstop();}

DWORD cdf=getinfo(MCI_STATUS_POSITION);

cdfrom=MCI_MAKE_MSF(MCI_MSF_MINUTE(cdf),MCI_MSF_SECOND(cdf),MCI_MSF_FRAME(cdf));//获取当前播放文件的信息

UpdateData(false);CDialog::OnTimer(nIDEvent);

九、删除歌曲

void CMCIPlayerDlg::OnBnClickedDeletemusic()//删除歌曲 { // TODO: 在此添加控件通知处理程序代码

if(m_list.GetCurSel()==-1)

MeageBox(“请选中要删除的歌曲”);else {

CString na;

int i=m_list.GetCurSel();

na=allpath[i];

allpath.erase(allpath.begin()+i);

m_list.DeleteString(i);

UpdateData(false);

string pa=na.GetBuffer();

for(int i=0;i

//把地址里面的空格

变为'*'

{

if(pa[i]==' ')

pa[i]='/';

}

list mus;

ifstream rin;

rin.open(“Mylist.txt”);

//int rere;

string str[2];

if(rin>>str[0]>>str[1])

while(!rin.eof())

{

music mu;

mu.name=str[0];

mu.mPath=str[1];

if(mu.mPath!=pa)

mus.push_back(mu);

rin>>str[0]>>str[1];

}

rin.close();

ofstream out(“Mylist.txt”);list::iterator it=mus.begin();while(it!=mus.end()){

out

(*it).mPath

it++;} out.close();

} } 5.2 单元测试

初始界面:

初始界面由一个七个按钮控件,一个列表控件,一个进度条控件组成。

当点击添加歌曲按钮时,弹出文件对话框

弹出的文件对话框

6.总结

自制音乐播放器是运行于VS2010的一款MFC应用程序,该软件通过运用平时所学的知识,把文件的创建、读写操作,MFC控件的使用,系统的MCI函数的知识系统地联系在了一起。

播放器通过文件的读写知识,实现了对音乐文件的添加、删除等操作;通过系统MCI函数,支持MP3,WAV,WMA等格式的音乐文件的播放,而在主界面程序中只是调用这些功能函数,有助于对软件进行更新操作;另外,该软件运用了MFC的知识,实现了按钮,列表框等控件的使用,通过使用事件处理机制,实现了各种按键上的动作事件。

因此,该播放器能够更好地练习本学期所学的各种知识,通过该播放器的开发,回顾了文件的各种操作,加深了对MFC的认识,尤其是对软件开发的各个过程有了较详细的了解。

《音乐播放器课设报告要点.docx》
将本文的Word文档下载,方便收藏和打印
推荐度:
音乐播放器课设报告要点
点击下载文档
相关专题 音乐播放器课设 报告 播放器 要点 音乐播放器课设 报告 播放器 要点
[其他范文]相关推荐
    [其他范文]热门文章
      下载全文