MP3Player界面编程技术揭秘.docx
- 文档编号:8211504
- 上传时间:2023-01-29
- 格式:DOCX
- 页数:11
- 大小:110.67KB
MP3Player界面编程技术揭秘.docx
《MP3Player界面编程技术揭秘.docx》由会员分享,可在线阅读,更多相关《MP3Player界面编程技术揭秘.docx(11页珍藏版)》请在冰豆网上搜索。
MP3Player界面编程技术揭秘
MP3Player界面编程技术揭秘
VC的初学者都会觉得编写一个对话框程序是最简单的,高手是那些会编写单文档、多文档应用程序的人。
但是利用VC单文档、多文档模板编写出来的程序非常单调,缺乏个性,能不能用VC编写出一个类似千千静听这样酷界面的程序呢?
本文就带你进入这样一个世界!
一、首先创建一个对话框工程:
MP3PlayerDemo
注意,由于我们是要自己构造全新的界面,因此在向导模板下,不要做过多的选项,例如去掉“系统菜单”、“关于框”,这样,如图我们就只创建了2个类:
应用程序类App、对话框类Dlg。
二、完成播放器程序开发的一些基础编程
1、修改主对话框的属性
打开资源视图,修改主对话框的border属性:
None,同时删除主对话框上的多余按钮,如上图。
2、导入播放器所用所有图片
首先,将播放器所用图片全部拷贝到新工程res目录下,如下图。
随后,打开VC的资源视图,将这些图片导入,并修改图片ID,如图。
3、为主对话框类添加一个初始化矩形区域的成员函数iniRect()。
在播放器程序开发中,我们没有使用VC常规的按钮,因为这种按钮风格太没有个性。
在这里,所有的按钮都是采用绘图、检测鼠标点击的位置坐标,响应鼠标事件的方式实现的。
因此,首先我们需要定义一个函数,定义各按钮的矩形区域。
成员函数iniRect()代码如下:
voidCMP3PlayerDemoDlg:
:
iniRect(intleft,inttop,intwidth,intheight,CRect&burect)
{
burect.left=left;
burect.top=top;
burect.right=burect.left+width;
burect.bottom=burect.top+height;
}
4、打开主对话框类的头文件,为按钮及其矩形区域添加2组变量,如下:
//hwpbegin
staticintm_BItPlayFlg;//Play按键图标从原图标导出位置
staticintm_BItStopFlg;//stop按键图标从原图标导出位置
staticintm_BItOnUpFlg;//OnUp按键图标从原图标导出位置
staticintm_BItNextFlg;//Next按键图标从原图标导出位置
staticintm_BItChgSkinFlg;//换肤键从原图标导出位置
staticintm_BItExitFlg;//Exit按键图标从原图标导出位置
staticintsinkflag;//只做初始化显示的图片的变量
//hwpend
boolm_flagSkin;//皮肤的状态
boolm_flag;//播放的状态
CRectm_rectPlay;//Play按键矩形区域
CRectm_rectStop;//stop按键矩形区域
CRectm_rectNext;//Next按键矩形区域
CRectm_rectOnUp;//Prev按键矩形区域
CRectm_rectChgSkin;//换肤矩形区域
CRectm_rectExit;//Exit按键矩形区域
5、为主对话框类添加一个成员函数Draw(CDC*pDC),用VC画图的方式,初始化播放器的按钮。
代码如下:
//绘制对话框及图片按钮
voidCMP3PlayerDemoDlg:
:
Draw(CDC*pDC)
{
CDCpDisplayMemDC,tempDC;
CBitmapbitmap0;
bitmap0.CreateCompatibleBitmap(pDC,301,347);//内存图片,该函数创建与指定的设备环境相关的设备兼容的位图。
pDisplayMemDC.CreateCompatibleDC(pDC);//内存DC
CBitmap*pOldBufBitmap=pDisplayMemDC.SelectObject(&bitmap0);
tempDC.CreateCompatibleDC(pDC);//内存DC
if(!
sinkflag)//用画图的方式,初始化所有按钮
{
//play按钮
iniRect(135,96,36,33,m_rectPlay);
//stop
iniRect(221,105,20,20,m_rectStop);
//next
iniRect(174,96,33,33,m_rectNext);
//prev
iniRect(95,96,33,33,m_rectOnUp);
//changeSkin
iniRect(176,0,35,17,m_rectChgSkin);
//exit
iniRect(260,0,26,17,m_rectExit);
}
//装载对话框界面的图片,即播放器的背景图片
CBitmapbitmap01;
if(m_flagSkin)//换肤
{
bitmap01.LoadBitmap(IDB_SKIN1);
}
else
{
bitmap01.LoadBitmap(IDB_SKIN2);
}
tempDC.SelectObject(bitmap01);
//pDisplayMemDC.BitBlt(0,0,301,347,&tempDC,0,0,SRCCOPY);
TransparentBlt(pDisplayMemDC.m_hDC,0,0,301,347,tempDC.m_hDC,0,0,301,347,RGB(255,0,255));//变透明
bitmap01.DeleteObject();
if(m_flag)//判断当前播放状态,如果当前正在播放歌曲,显示暂停按钮可用
{
CBitmapbitmap10;
//如果当前正在播放歌曲,显示暂停按钮可用
bitmap10.LoadBitmap(IDB_PAUSE);
tempDC.SelectObject(bitmap10);
TransparentBlt(pDisplayMemDC.m_hDC,m_rectPlay.left,m_rectPlay.top,36,33,tempDC.m_hDC,
0,0,36,33,RGB(0,0,0));
bitmap10.DeleteObject();
}
//缓存内存绘制到对话框句柄,即将内存中的播放器图片显示到对话框上
pDC->BitBlt(0,0,301,347,&pDisplayMemDC,0,0,SRCCOPY);
pDisplayMemDC.SelectObject(pOldBufBitmap);
bitmap0.DeleteObject();
pOldBufBitmap->DeleteObject();
tempDC.DeleteDC();
pDisplayMemDC.DeleteDC();
}
6、重载主对话框类的DefWindowProc成员函数,添加如下代码。
LRESULTCMP3PlayerDemoDlg:
:
DefWindowProc(UINTmessage,WPARAMwParam,LPARAMlParam)
{
//TODO:
在此添加专用代码和/或调用基类
LRESULTlrst=CDialog:
:
DefWindowProc(message,wParam,lParam);
if(!
:
:
IsWindow(m_hWnd))
returnlrst;
if(message==WM_MOVE||message==WM_PAINT||message==WM_NCPAINT||message==WM_NCACTIVATE||message==WM_NOTIFY)
{
try
{
CDC*pWinDC=GetWindowDC();
if(pWinDC)
Draw(pWinDC);
ReleaseDC(pWinDC);
}
catch(CException*e)
{
e->Delete();
}
}
returnlrst;
}
注意:
这段代码主要负责调用Draw成员函数绘制播放器的主界面。
我们没有使用原来对话框主界面,而是加载了一张播放器的背景图片,以此作为我们的主界面,当然,更换这张图片就可以实现换肤功能了。
为了实现换肤,我们需要设置一个默认的界面皮肤,打开主对话框类的构造函数,添加如下代码:
//hwpbegin
m_flag=false;//初始化播放状态
m_flagSkin=true;//初始化默认皮肤
//hwpend
完成到这一步,运行一下程序,你会发现你的程序已经出现播放器的画面了,怎么样,是不是很酷!
7、为主对话框类添加另一个成员函数DrawData,用来改变按钮被按下后的图片状态,代码如下:
//当按钮被按下,鼠标滑过时,调用该函数可以改变按钮的显示状态。
实际上就是显示不同的图片
voidCMP3PlayerDemoDlg:
:
DrawData(UINTidBitmap,intleft,inttop,intwidth,intheight,CDC*pDC,intflag,intcx,intcy)
{
CBitmap*pBitmap=newCBitmap;
CDC*pDisplayMemDC=newCDC;
pDisplayMemDC->CreateCompatibleDC(pDC);
pBitmap->LoadBitmap(idBitmap);
CBitmap*pOldBitmap=pDisplayMemDC->SelectObject(pBitmap);
if(flag==0)
//该函数对指定的源设备环境区域中的像素进行位块(bit_block)转换,以传送到目标设备环境
//此函数同样用来拷贝位图资源,但不具备缩放功能
pDC->BitBlt(left,top,width,height,pDisplayMemDC,cx,cy,SRCCOPY);
else
//该函数对指定的源设备环境中的矩形区域像素的颜色数据进行位块(bit_block)转换,并将结果置于目标设备环境。
//此函数同样具有缩放功能,但此函数最后一个参数用来指定作为透明色的RGB;
//系统中需要包含Msimg32.dll!
!
TransparentBlt(pDC->m_hDC,left,top,width,height,pDisplayMemDC->m_hDC,
cx,cy,width,height,RGB(0,0,0));
pDisplayMemDC->SelectObject(pOldBitmap);
deletepDisplayMemDC;
deletepBitmap;
}
三、为主对话框类添加鼠标按下、抬起、滑过按钮响应函数
1、添加鼠标按下响应函数
选择主对话框类,如下图,添加鼠标按下消息响应函数。
同时添加如下代码:
//鼠标按下按钮响应函数,按下鼠标后,根据鼠标位置,判断用户点击了哪个图片按钮,
//据此改变按钮的形态
voidCMP3PlayerDemoDlg:
:
OnLButtonDown(UINTnFlags,CPointpoint)
{
//TODO:
在此添加消息处理程序代码和/或调用默认值
CDC*pDC=GetWindowDC();
//Play
if(m_rectPlay.PtInRect(point))
{
if(!
m_flag)
{
m_BItPlayFlg=72;
DrawData(IDB_PLAY,m_rectPlay.left,m_rectPlay.top,36,33,pDC,1,m_BItPlayFlg,0);//OK
}
else
{
m_BItPlayFlg=72;
DrawData(IDB_PAUSE,m_rectPlay.left,m_rectPlay.top,36,33,pDC,1,m_BItPlayFlg,0);
}
}
//ChgSkin
elseif(m_rectChgSkin.PtInRect(point))
{
m_BItChgSkinFlg=70;
DrawData(IDB_CHGSKIN,m_rectChgSkin.left,m_rectChgSkin.top,35,17,pDC,1,m_BItChgSkinFlg,0);
}
//exit
elseif(m_rectExit.PtInRect(point))
{
m_BItExitFlg=52;
DrawData(IDB_EXIT,m_rectExit.left,m_rectExit.top,26,17,pDC,1,m_BItExitFlg,0);
}
ReleaseDC(pDC);
CDialog:
:
OnLButtonDown(nFlags,point);
}
2、同理,添加鼠标抬起、滑过按钮响应函数,代码如下:
//鼠标抬起按钮响应函数
voidCMP3PlayerDemoDlg:
:
OnLButtonUp(UINTnFlags,CPointpoint)
{
//TODO:
在此添加消息处理程序代码和/或调用默认值
CDC*pDC=GetWindowDC();
//如果play按钮被按下,程序根据鼠标点击的位置坐标来判断用户点击了哪个按钮,相应地调用自定义的按钮响应函数
//Play
if(m_rectPlay.PtInRect(point))
{
if(!
m_flag)
{
m_BItPlayFlg=36;
DrawData(IDB_PLAY,m_rectPlay.left,m_rectPlay.top,36,33,pDC,1,m_BItPlayFlg,0);
}
else
{
m_BItPlayFlg=36;
DrawData(IDB_PAUSE,m_rectPlay.left,m_rectPlay.top,36,33,pDC,1,m_BItPlayFlg,0);
}
OnPlay();
}
//ChgSkin
if(m_rectChgSkin.PtInRect(point))
{
m_BItChgSkinFlg=35;
DrawData(IDB_CHGSKIN,m_rectChgSkin.left,m_rectChgSkin.top,35,17,pDC,1,m_BItChgSkinFlg,0);
ChangeSkin();
}
//exit
if(m_rectExit.PtInRect(point))
{
m_BItExitFlg=26;//
DrawData(IDB_EXIT,m_rectExit.left,m_rectExit.top,26,17,pDC,1,m_BItExitFlg,0);
SendMessage(WM_CLOSE);
}
ReleaseDC(pDC);
CDialog:
:
OnLButtonUp(nFlags,point);
}
完成到这一步,你会发现播放器上的按钮已经会响应你的鼠标动作了。
只是我们没有添加按钮响应函数,它还没有起到作用。
四、添加按钮响应函数
为了简单起见,这里我们只添加2个按钮的处理函数。
1、换肤按钮
为了实现换肤功能,你需要检查以下步骤是否完成:
1)导入换肤按钮的图片IDB_CHGSKIN(已完成)
2)声明换肤按钮的变量m_BItChgSkinFlg(已完成)
3)声明换肤矩形区域的变量m_rectChgSkin(已完成)
4)在Draw成员函数中,初始化换肤按钮(已完成)
5)在鼠标按下、抬起、滑过按钮响应函数中,添加对换肤按钮的响应和处理(已完成)
注意,这里我们是在鼠标抬起按钮响应函数中,调用换肤的按钮响应处理的。
其他2个函数仅仅是改变按钮的外观。
6)定义换肤按钮的处理函数(未完成)
这里,换肤按钮处理函数的定义可以采用主对话框普通类成员函数定义的方法,代码如下:
//换肤按钮响应函数
voidCMP3PlayerDemoDlg:
:
ChangeSkin()
{
m_flagSkin=!
m_flagSkin;
CDC*pDC=GetWindowDC();
Draw(pDC);
ReleaseDC(pDC);
}
2、播放按钮
播放按钮响应函数的定义与换肤是类似的,因为这是一个界面演示程序,我们没有添加实际的播放功能,其演示代码如下:
//Play按钮响应函数
voidCMP3PlayerDemoDlg:
:
OnPlay()
{
m_flag=true;
AfxMessageBox("你按下了PLAY按钮");
}
未完成之路:
本例子程序只是解释了如何在VS2008SP1下,利用VC编写一个个性化的程序界面。
如何给进程条贴皮肤还没有完成。
在关闭VS2008时,程序会导致开发环境重启。
另外,其他按钮还没有添加消息响应。
如果你解决了这个问题,欢迎邮寄一份新程序给我:
hwp67@
更详细的程序可以看本文档配套的源程序。
其中,一个是利用VS2008创建的例子工程,另一个是VC6编写的完整源程序。
你可以到pudn或csdn上下载(文件名:
MP3PlayerVs2008hwp.rar)!
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- MP3Player 界面 编程 技术 揭秘