学位论文面向对象c程序设计.docx
- 文档编号:4338604
- 上传时间:2022-11-29
- 格式:DOCX
- 页数:18
- 大小:350.30KB
学位论文面向对象c程序设计.docx
《学位论文面向对象c程序设计.docx》由会员分享,可在线阅读,更多相关《学位论文面向对象c程序设计.docx(18页珍藏版)》请在冰豆网上搜索。
学位论文面向对象c程序设计
浙江工商大学计算机与信息工程学院
课程设计报告
课程名称:
面向对象程序设计_
专业:
计算机科学与技术
班级:
计科0902______
学号:
0912300201__
姓名:
周永强_
题目:
音乐播放器_______
指导教师:
2011年1月
计算机与信息工程学院
班级
计科0902
姓名
学号
0912300201
题目
音乐播放器
时间
2011年1月
目
的
通过使用微软的MFC编程实现windows系统下的简单播放器的功能,使之能够播放常见的音频文件,并且实现用户与窗口程序的简单交互。
要求运用窗口界面设计。
本课题将生成一个播放器,能够实现*.mp3,*.wma等常见的音频文件播放,并且还有一个对话框,点击上面的连接能够实现调用outlook进行发邮件反馈信息。
为实现友好的和美观的操作界面,本例中将调用位图资源,以及常见的播放器操作,以更好的满足用户的要求。
内
容
和
要
求
播放器的基本要素:
打开文件、播放文件、录制文件、删除列表中文件、暂停播放、停止播放、上一曲、下一曲。
窗口操作:
播放清单弹出和关闭、窗口关闭、窗口最小化到托盘、窗口子对话框。
其他功能:
用户反馈(发送邮件)。
成
绩
指导教师(签名):
2009级《面向对象程序设计》课程设计任务书
设计说明书
需求分析:
本课题通过对WindowsAPI的多媒体和资源文件的高层控制MCI进行封装,建立了一个播放器类KuWfPlayer(酷狼),不必过分追究MCI内部函数,仅是根据自己的需要,直接调用其接口,即可轻松实现基本的播放器所具有的功能。
该案例提供给用户以下服务:
1,高层音频服务
2,媒体控制接口
3,连接媒体设备
4,顺序播放加入列表的音频文件
5,程序托盘功能
6,实现复读机功能
7,超级链接的使用
其中后两项功能并非目前所有播放器都具备的功能,可以算得上本课题的创新之处。
程序设计思想:
Windows系统提供了强大的多媒体系统,为我们提供了WINMM.DLL动态链接库,通过调用它所提供的API函数,就可以实现MCI指令进行多方面的操作了,就想普通播放器一样,只是此处是通过命令的方式。
MCI的全称是MediaControlInterface,译为媒体控制接口,就像一个解释器,通过调用函数的形式解释命令。
MCI工作过程中需要在指令中需要调用API函数实现程序与多媒体设备的连接。
有三个重要的API,分别是mciSendString(),mciExecute()和mciGetErrorString(),本程序中将展现其各自的功能。
概要设计:
1,建立MFC工程,选择类型为DialogBased模式,其他均默认。
2,此时工程会自动生成两个对话框,对于本例已经够了。
3,设计界面,如下图:
4,给控件设置ID值,本案例中ID值为上图中控件上的标识,前面再加上IDC_标志。
5,给控件添加成员变量,其中按钮空间添加CButton类型,滚动条为CSliderCtrl类型,列表为CListBox类型。
6,一切结束后,右击工程图标属性linkinputAdditionalDependences中加入winmm.lib,注意此处一定要加,不然会连接错。
8,添加位图资源,本例使用别人提供的位图资源,把位图复制到工程下的res目录中,然后在资源视图中,通过导入位图资源,把已有资源导入,ID值为默认,不再修改。
9,位图添加后,要把对话框的成员变量那些CButton类型的对象修改为CBitmapButton类型,并设置属性值ownerdraw为true。
10,在About对话框中添加CStatic控件,设置ID为IDC_EMAIL,标题设为Emaito:
zyqhi2010@
11,窗口设计工作基本文成,以下开始是代码工作。
12,以下是程序的类关系图。
程序框架及详细实现:
本例充分利用面向对象的思想,创建了几个程序所需要的类,来实现特定的功能,下面将分别介绍:
第一个类:
KuWfPlayerDlg通过public:
继承CDialogEx而来,是一个对话框类,为实现其功能,添加了以下必要的函数,其层次和成员函数、数据成员UML图.
本类主要是实现窗口显示控制,文件播放控制,和音频功能的实现,由于函数名很直观,可以从上表中基本看出起功能,因此下面只分析重要的函数和几个关键步骤。
构造函数:
构造函数是每个类必不可少的部分,是类的对象在创建后能够正确的初始化,下面是本类的构造函数:
KuWfPlayerDlg:
:
KuWfPlayerDlg(CWnd*pParent/*=NULL*/)
:
CDialogEx(KuWfPlayerDlg:
:
IDD,pParent)
{
m_hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);
aa==_T("");
hour=minute=second=0;
fi=-1;
fr=0;
}
以下几个函数主要用于界面的显示,即构造外观:
BOOLKuWfPlayerDlg:
:
OnInitDialog()
该函数是窗口的初始化函数,在窗口显示后已经完成,对整个窗口的显示起决定性作用,位图的加载以及图标的加载都在该函数中实现,是本课题第一个目标,即实现美观的外表的重要函数。
例如:
界面背景位图加载:
m_bg.LoadBitmap(IDB_BITMAP2);
按钮位图加载:
m_open.LoadBitmaps(IDB_BITMAP3,IDB_BITMAP3);
m_bexit.LoadBitmaps(IDB_BITMAP6,IDB_BITMAP6);
图标的加载:
SetIcon(m_hIcon,TRUE);//Setbigicon
SetIcon(m_hIcon,FALSE);//Setsmallicon
以及相关变量的初始化工作:
m_flag=TRUE;
m_flag1=TRUE;
voidKuWfPlayerDlg:
:
OnPaint()
该函数是负责程序主界面的绘制工作,在上个函数中,资源得到加载,在本函数中资源得到使用,下面是一些重要的语句及解释:
CPaintDCdc(this);
CRectrect;
GetClientRect(&rect);
//以上是获得当前的设备环境dc,和操作区域rect
CDCdcMem;
dcMem.CreateCompatibleDC(&dc);
BITMAPbitMap;
m_bg.GetBitmap(&bitMap);
CBitmap*pbmpOld=dcMem.SelectObject(&m_bg);
dc.StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,bitMap.bmWidth,bitMap.bmHeight,SRCCOPY);
//该语句实现背景的位图填充
以下函数主要用于实现播放功能,通过调用MCI指令:
首先保证添加头文件#include“mmsystem.h”
voidKuWfPlayerDlg:
:
OnPlay()
播放和暂停函数:
播放:
MCI_OPEN_PARMSmciopenparms;
//播放
MCI_PLAY_PARMSmciplayparms;
//播放路径
mciopenparms.lpstrElementName=aa;
//文件类型
mciopenparms.lpstrDeviceType=NULL;
//向MCI设备发送命令消息,使其包含文件的类型和路径
mciSendCommand(0,MCI_OPEN,MCI_DEVTYPE_WAVEFORM_AUDIO,(DWORD)(LPVOID)&mciopenparms);
//获取多媒体设备类型编号
m_count=mciopenparms.wDeviceID;
//歌曲播放支持类型
mciplayparms.dwCallback=(DWORD)GetSafeHwnd();
//cdlen的前三位是歌曲长度,以秒为单位
cdlen=getinfo(MCI_STATUS_LENGTH);
//设置播放完成所需要时间
cdto=MCI_MAKE_HMS(MCI_HMS_HOUR(cdlen),MCI_HMS_MINUTE(cdlen),MCI_HMS_SECOND(cdlen));
mciplayparms.dwFrom=cdfrom;
mciplayparms.dwTo=cdto;
//向设备发送播放的消息
mciSendCommand(m_count,MCI_PLAY,MCI_TO|MCI_FROM,(DWORD)(LPVOID)&mciplayparms);
//设置及时系统,用于进度的随时显示
SetTimer(0,1000,NULL);
///设置进度条范围
m_sl.SetRange(0,(cdlen/1000));
//将信息显示到窗口
UpdateData(FALSE);
暂停:
m_flag=TRUE;
m_play.RedrawWindow();
//取消计时器
KillTimer(0);
//获取¨当前状态
DWORDdwsf=getinfo(MCI_STATUS_POSITION);
//记录播放位置
cdfrom=MCI_MAKE_MSF(MCI_MSF_MINUTE(dwsf),MCI_MSF_SECOND(dwsf),MCI_MSF_FRAME(dwsf));
//向设备发送暂停请求¨
mciSendCommand(m_count,MCI_CLOSE,0,NULL);
voidKuWfPlayerDlg:
:
OnOpen()
由于本例要从磁盘上选择文件,所以,函数中定义了一个问价对话框的对象
CFileDialogf(TRUE);
用fileNmae表示读取文件的名字
CStringfileName;
constintc_cMaxFiles=100;
constintc_cbBuffSize=(c_cMaxFiles*(MAX_PATH+1))+1;
f.GetOFN().lpstrFile=fileName.GetBuffer(c_cbBuffSize);
f.GetOFN().nMaxFile=c_cMaxFiles;
用pos表示位置
POSITIONpos=f.GetStartPosition();
打开文件对话框
f.DoModal()==IDOK
以下操作不再赘述。
voidKuWfPlayerDlg:
:
OnTimer(UINT_PTRnIDEvent)
由前面的函数可以看到本案例中调用了该函数,由于播放器的进度要随时显示到屏幕上,以获取最新的进度,所以必须要每个一定的时间来获取歌曲播放信息,所以用到了OnTimer(…),在windowsSDK编程中实现该功能是通过响应WM_TIMER来实现的,MFC中也不例外,所以为WM_TIMER添加消息响应函数后,MFC通过三个函数实现对时间的控制,分别为:
SetTimer(…)
KillTimer(…)
OnTimer(…)
来实现的,当程序调用函数SetTimer(…)时,OnTimer(…)开始执行,当KillTimer(…)调用时,不再计时,以此实现对时间的控制。
函数的内容不再赘述。
voidKuWfPlayerDlg:
:
Thide()
该函数用于实现程序的最小化,我们常见的许多程序,都有点击最小化按钮后最小化到托盘,本例中夜集成了该功能,下面是主要代码及解释:
//创建任务栏图标对象
NOTIFYICONDATAtnd;
tnd.cbSize=sizeof(NOTIFYICONDATA);
tnd.hWnd=this->m_hWnd;
tnd.uID=IDR_MAINFRAME;
tnd.uFlags=NIF_MESSAGE|NIF_ICON|NIF_TIP;
tnd.uCallbackMessage=MY_MESSAGE;
tnd.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));
下面是提示:
lstrcpy(tnd.szTip,_T("Mp3Player,单击图标弹出窗口"));
//向任务添加图标
Shell_NotifyIcon(NIM_ADD,&tnd);
voidKuWfPlayerDlg:
:
Tdehide()
与上述函数类似
voidKuWfPlayerDlg:
:
OnLButtonDown(UINTnFlags,CPointpoint)
该函数是为了发送鼠标左键按下的消息,以实现相应的事项
PostMessage(WM_NCLBUTTONDOWN,HTCAPTION,MAKELPARAM(point.x,point.y));
LRESULTKuWfPlayerDlg:
:
WindowProc(UINTmessage,WPARAMwParam,LPARAMlParam)
消息处理函数,本例牵涉到消息的发送和处理,该处通过消息处理函数来接收并予以处理,其全部代码如下面
{
//TODO:
Addyourspecializedcodehereand/orcallthebaseclass
switch(message)
{
caseMY_MESSAGE:
if(lParam==WM_RBUTTONUP||lParam==WM_LBUTTONUP)
{
ShowWindow(SW_SHOW);
Tdehide();
}
break;
}
returnCDialogEx:
:
WindowProc(message,wParam,lParam);
}
将原路径数组转移到临时路径数组中
voidKuWfPlayerDlg:
:
forfor()
临时路径转移到原路径数组中
voidKuWfPlayerDlg:
:
forfor1()
其他函数机制和实现都相对简单,只是做一些常见的操作,因此此处不再赘述.
第二个类:
CHyperLink通过public从CStatic而来。
是一个超链接类,为实现其功能,添加了以下必要的函数,其层次和成员见UML图:
下面介绍其主要函数:
CHyperLink:
:
CHyperLink()
在构造函数中进行下列初始化,以保证类的对象创建时能够正确的初始化
m_hLinkCursor=NULL;
m_crLinkColour=RGB(0,20,238);
m_crVisitedColour=RGB(85,26,239);
m_crHoverColour=:
:
GetSysColor(COLOR_HIGHLIGHT);
m_bOverControl=FALSE;
m_bVisited=FALSE;
m_bUnderline=TRUE;
m_bAdjustToFit=TRUE;
m_strURL.Empty();
voidCHyperLink:
:
OnMouseMove(UINTnFlags,CPointpoint)
本函数用于检测鼠标的移动,由于本例要使用超链接,并且当鼠标滑动到鼠标上侧时,要做出相应的响应,因此,在类中添加了成员函数。
首先调用父类的函数,如下:
CStatic:
:
OnMouseMove(nFlags,point);
当鼠标目前处于url上方时,将鼠标指针设为手形
m_hLinkCursor=LoadCursor(NULL,IDC_HAND);
SetLinkCursor(m_hLinkCursor);
不在上方时
CRectrect;
GetClientRect(rect);
m_bOverControl=FALSE;
ReleaseCapture();
RedrawWindow();
以此来实现鼠标的响应。
voidCHyperLink:
:
PreSubclassWindow()
PreSubclassWindow()函数里面对文本框执行的设置字体大小创建静态文本框控件。
BOOLCHyperLink:
:
PreTranslateMessage(MSG*pMsg)
此函数时时MFC的虚函数,此处进行了重写,仍然是为了实现函数的消息的响应。
m_ToolTip.RelayEvent(pMsg);
voidCHyperLink:
:
PositionWindow()
在该函数中,移动并重新绘制用户区窗口的大小,这样用户区和超链接文本就有相同的尺寸;而且可以防止空间不在文本上时,防止激活链接。
下面是一些主要的代码:
首先获取当前窗口位置
CRectrect;
GetWindowRect(rect);
CWnd*pParent=GetParent();
并判断是不是父窗口
if(pParent)
{
pParent->ScreenToClient(rect);
}
获取当前窗口类型
DWORDdwStyle=GetStyle();
i
LONGretval=RegOpenKeyEx(key,subkey,0,KEY_QUERY_VALUE,&hKey);
获取成功后
if(retval==ERROR_SUCCESS)
{
longdatasize=MAX_PATH;
TCHARdata[MAX_PATH];
RegQueryValue(hKey,NULL,data,&datasize);
lstrcpy(retdata,data);
RegCloseKey(key);
}
将其返回
returnretval;
}
voidCHyperLink:
:
ReportError(intnError)
如果发送邮件不成功,如要处理错误的原因,此函数中通过对错误原因来进行逐个处理,以实现不成功时响应的操作,增强操作的安全性。
此处使用的是switch语句进行判断:
(str字符串的内容限于篇幅以省略)
switch(nError){
case0:
str="……";break;
caseSE_ERR_PNF:
str="……";break;
caseSE_ERR_FNF:
str="……";break;
caseERROR_BAD_FORMAT:
str="……";break;
caseSE_ERR_ACCESSDENIED:
str="……;break;
caseSE_ERR_ASSOCINCOMPLETE:
str="……";break;
caseSE_ERR_DDEBUSY:
str="……;break;
caseSE_ERR_DDEFAIL:
str="……";break;
caseSE_ERR_DDETIMEOUT:
str="……";break;
caseSE_ERR_DLLNOTFOUND:
str="……";break;
caseSE_ERR_NOASSOC:
str="……";break;
caseSE_ERR_OOM:
str="……";break;
caseSE_ERR_SHARE:
str="……";
default:
str.Format(_T("UnknownError(%d)occurred."),nError);break;
}
str=_T("Unabletoopenhyperlink:
\n\n")+str;
发送消息框提示:
AfxMessageBox(str,MB_ICONEXCLAMATION|MB_OK);
HINSTANCECHyperLink:
:
GotoURL(LPCTSTRurl,intshowcmd)
该类的重量级成员函数,也就是前往链接,当一切工作做好以后,就是要打开对应的链接,下面着重分析代码及原理:
TCHARkey[MAX_PATH+MAX_PATH];
尝试使用ShellExecute()
HINSTANCEresult=ShellExecute(NULL,_T("open"),url,NULL,NULL,showcmd);
如果获取失败。
则获取.htm注册键值并查找程序
if((UINT)result<=HINSTANCE_ERROR)
{
if(GetRegKey(HKEY_CLASSES_ROOT,key,key),_T(".htm")==ERROR_SUCCESS)
{
TCHAR*pos;
pos=_tcsstr(key,_T("\"%1\""));
//未发现引用%1
if(pos==NULL)
{
pos=StrStr(key,_T("%1"));
如果还是空
if(pos==NULL)
{
pos=key+lstrlen(key)-1;
}
else
//删除参数
*pos='\0';
}
else
*pos='\0';
lstrcat(pos,_T(""));
lstrcat(pos,url);
result=(HINSTANCE)WinExec((LPCSTR)key,showcmd);
}
}
将结果返回
returnresult;
}
其余函数由于比较简单,所以此处不再解释,详细可参见代码。
第三个类:
CAboutDlg通过public从CDialogEx而来。
是一个对话框类,为实现其功能,添加了以下必要的函数,其层次和成员见UML图。
该类的目的是调出ABOUT对话框,获取用户帮助信息,以及用户的反馈。
都是基本函数。
第四个类:
CTESTApp:
publicCWinApp,MFC中的主应用程序类封装用于Windows操作系统的应用程序的初始化、运行和终止。
基于框架生成的应用程序必须有且仅有一个从CWinApp派生的类的对象。
在创建窗口之前先构造该对象。
至此,该类中主要的函数及实现机制都已经介绍完了,限于篇幅原因,部分非重要简单函数并未介绍,如有需要,可以参见后附录代码,或发送邮件给本人:
zyqhi2010@获取代码。
设计成果展示
程序主界面如下图:
:
播放按钮,选中播放列表内的文件按下按钮或双击,会开始播放,再
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 学位 论文 面向 对象 程序设计