📄 playdlg.cpp
字号:
// PlayDlg.cpp : implementation file
//
#include "stdafx.h"
#include "gps.h"
#include "PlayDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CPlayDlg dialog
#pragma comment (lib, "Ole32.lib ")
#pragma comment (lib, "Strmiids.lib ")
//--------------------音量控制-------------------------------
DWORD volumeValue_bk; //恢复原始音量
CPlayDlg::CPlayDlg(CWnd* pParent /*=NULL*/)
: CDialog(CPlayDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CPlayDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
isPlay=FALSE;
isActiveVol=FALSE;
isActiveBf=FALSE;
isActiveTz=FALSE;
isActiveKt=FALSE;
isActiveKj=FALSE;
isActiveRe=FALSE;
pauseStatus=FALSE;
Wavpath="";
songNum=0;
m_pMediaControl=NULL;
// time=0;
curTime=totalTime=0;
waveOutGetVolume(0,&volumeValue);
volumeValue_bk=volumeValue;
}
void CPlayDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CPlayDlg)
DDX_Control(pDX, IDC_LIST1, m_musicList);
// DDX_Control(pDX, IDC_MEDIAPLAYER2, m_thePlayer);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CPlayDlg, CDialog)
//{{AFX_MSG_MAP(CPlayDlg)
ON_WM_PAINT()
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_CTLCOLOR()
ON_WM_ERASEBKGND()
ON_WM_CREATE()
ON_WM_TIMER()
ON_LBN_DBLCLK(IDC_LIST1, OnDblclkList)
ON_LBN_SELCHANGE(IDC_LIST1, OnSelchangeList1)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CPlayDlg message handlers
void CPlayDlg::OnPaint()
{
CPaintDC dc(this); // device context for painting
int cur;
int delValue;
CBitmap bitmap;
BITMAP bmp;
CDC memDC;
CFont font;
CRect rect;
// -----------------背景--------------------------------------
bitmap.LoadBitmap(IDB_BITMAP1);//IDB_NAV
bitmap.GetObject (sizeof(BITMAP),&bmp);
memDC.CreateCompatibleDC (&dc);
memDC.SelectObject (bitmap);
dc.BitBlt (0,0,bmp.bmWidth ,bmp.bmHeight ,&memDC,0,0,SRCCOPY);
bitmap.DeleteObject();
//--------------------------------------------------------------
CString str=TEXT("播放器");//TEXT("音频");
font.CreatePointFont(180,L"黑体");
dc.SelectObject(&font);
dc.SetBkMode(TRANSPARENT);
dc.SetTextColor(RGB(255,255,255));
dc.DrawText(str, CRect(128,8,200,40), 0);
bitmap.LoadBitmap(IDB_YLYT);
bitmap.GetObject (sizeof(BITMAP),&bmp);
memDC.CreateCompatibleDC (&dc);
memDC.SelectObject (bitmap);
dc.BitBlt (172,205,bmp.bmWidth ,bmp.bmHeight ,&memDC,0,0,SRCCOPY);
bitmap.DeleteObject();
bitmap.LoadBitmap(IDB_BFJD);
bitmap.GetObject (sizeof(BITMAP),&bmp);
memDC.CreateCompatibleDC (&dc);
memDC.SelectObject (bitmap);
dc.BitBlt (110,165,bmp.bmWidth ,bmp.bmHeight ,&memDC,0,0,SRCCOPY);
bitmap.DeleteObject();
if(isActiveBf==FALSE)
{
if(isPlay==TRUE)
{//如果是正在播放,显示停止
bitmap.LoadBitmap(IDB_ZANTING1);
bitmap.GetObject (sizeof(BITMAP),&bmp);
memDC.CreateCompatibleDC (&dc);
memDC.SelectObject (bitmap);
dc.BitBlt (19,200,bmp.bmWidth ,bmp.bmHeight ,&memDC,0,0,SRCCOPY);
bitmap.DeleteObject();
}
else
{
bitmap.LoadBitmap(IDB_BOFANG1);
bitmap.GetObject (sizeof(BITMAP),&bmp);
memDC.CreateCompatibleDC (&dc);
memDC.SelectObject (bitmap);
dc.BitBlt (19,200,bmp.bmWidth ,bmp.bmHeight ,&memDC,0,0,SRCCOPY);
bitmap.DeleteObject();
}
}
else
{
if(isPlay==TRUE)
{//如果是正在播放,显示停止
bitmap.LoadBitmap(IDB_ZANTING2);
bitmap.GetObject (sizeof(BITMAP),&bmp);
memDC.CreateCompatibleDC (&dc);
memDC.SelectObject (bitmap);
dc.BitBlt (19,200,bmp.bmWidth ,bmp.bmHeight ,&memDC,0,0,SRCCOPY);
bitmap.DeleteObject();
}
else
{//停止播放
bitmap.LoadBitmap(IDB_BOFANG2);
bitmap.GetObject (sizeof(BITMAP),&bmp);
memDC.CreateCompatibleDC (&dc);
memDC.SelectObject (bitmap);
dc.BitBlt (19,200,bmp.bmWidth ,bmp.bmHeight ,&memDC,0,0,SRCCOPY);
bitmap.DeleteObject();
}
}
if(isActiveTz==FALSE)
{
bitmap.LoadBitmap(IDB_TINGZHI1);
bitmap.GetObject (sizeof(BITMAP),&bmp);
memDC.CreateCompatibleDC (&dc);
memDC.SelectObject (bitmap);
dc.BitBlt (57,200,bmp.bmWidth ,bmp.bmHeight ,&memDC,0,0,SRCCOPY);
bitmap.DeleteObject();
}
else
{
bitmap.LoadBitmap(IDB_TINGZHI2);
bitmap.GetObject (sizeof(BITMAP),&bmp);
memDC.CreateCompatibleDC (&dc);
memDC.SelectObject (bitmap);
dc.BitBlt (57,200,bmp.bmWidth ,bmp.bmHeight ,&memDC,0,0,SRCCOPY);
bitmap.DeleteObject();
}
if(isActiveKt==FALSE)
{
bitmap.LoadBitmap(IDB_KUAITUI1);
bitmap.GetObject (sizeof(BITMAP),&bmp);
memDC.CreateCompatibleDC (&dc);
memDC.SelectObject (bitmap);
dc.BitBlt (94,200,bmp.bmWidth ,bmp.bmHeight ,&memDC,0,0,SRCCOPY);
bitmap.DeleteObject();
}
else
{
bitmap.LoadBitmap(IDB_KUAITUI2);
bitmap.GetObject (sizeof(BITMAP),&bmp);
memDC.CreateCompatibleDC (&dc);
memDC.SelectObject (bitmap);
dc.BitBlt (94,200,bmp.bmWidth ,bmp.bmHeight ,&memDC,0,0,SRCCOPY);
bitmap.DeleteObject();
}
if(isActiveKj==FALSE)
{
bitmap.LoadBitmap(IDB_KUAIJIN1);
bitmap.GetObject (sizeof(BITMAP),&bmp);
memDC.CreateCompatibleDC (&dc);
memDC.SelectObject (bitmap);
dc.BitBlt (132,200,bmp.bmWidth ,bmp.bmHeight ,&memDC,0,0,SRCCOPY);
bitmap.DeleteObject();
}
else
{
bitmap.LoadBitmap(IDB_KUAIJIN2);
bitmap.GetObject (sizeof(BITMAP),&bmp);
memDC.CreateCompatibleDC (&dc);
memDC.SelectObject (bitmap);
dc.BitBlt (132,200,bmp.bmWidth ,bmp.bmHeight ,&memDC,0,0,SRCCOPY);
bitmap.DeleteObject();
}
if(isActiveRe==FALSE)
{
bitmap.LoadBitmap(IDB_RETURNYP1);
bitmap.GetObject (sizeof(BITMAP),&bmp);
memDC.CreateCompatibleDC (&dc);
memDC.SelectObject (bitmap);
dc.BitBlt (258,183,bmp.bmWidth ,bmp.bmHeight ,&memDC,0,0,SRCCOPY);
bitmap.DeleteObject();
}
else
{
bitmap.LoadBitmap(IDB_RETURNYP2);
bitmap.GetObject (sizeof(BITMAP),&bmp);
memDC.CreateCompatibleDC (&dc);
memDC.SelectObject (bitmap);
dc.BitBlt (258,183,bmp.bmWidth ,bmp.bmHeight ,&memDC,0,0,SRCCOPY);
bitmap.DeleteObject();
}
//音量start------------------------------
int i=0;
cur=(volumeValue/0x33333333);
CBrush brush1(RGB(250,174,106)); //Choice adapted one color
dc.SelectObject(&brush1);
rect.left=193;
rect.top=212-i; //100;
rect.right=0;
rect.bottom=213+8;
for(i=0;i<6;i++,cur--){
if(cur>=0) {
CBrush brush1(RGB(250,174,106)); //Choice adapted one color
dc.SelectObject(&brush1);
}
else{
CBrush brush1(RGB(0,250,250)); //Choice adapted one color
dc.SelectObject(&brush1);
}
rect.left++;
rect.top=212-i; //100;
rect.right=rect.left+8;
rect.bottom=213+8;
dc.Rectangle(&rect);
rect.left=rect.right;
}
//当前播放时间
dc.SetTextColor(RGB(104,149,10));
//差值修复,例共219秒的歌慢13秒,每秒慢13/219
delValue=13.0/219.0*(curTime/10/1000/1000);
str.Format(_T("%02d"),(curTime/10/1000/1000+delValue)/60);
dc.DrawText(str,CRect(20,155,100,178),0);
dc.DrawText(":",CRect(20+20,155,100,178),0);
str.Format(_T("%02d"),(curTime/10/1000/1000+delValue)%60);
dc.DrawText(str,CRect(20+20+10,155,100,178),0);
if(totalTime!=0)
{
cur=((float)curTime+(float)delValue*10000000)/(float)totalTime*(float)188;//当前时间占的进度条
rect.left=111;
rect.top=166;
rect.right=111+cur;
rect.bottom=171;
CBrush brush(RGB(104,149,10));
dc.FillRect(&rect,&brush);
}
// str.Format(_T("%f"),g_Len);
// dc.DrawText(str,CRect(100,155,310,178),0);
// dc.DrawText(":",CRect(255+20,155,310,178),0);
// str.Format(_T("%02d"),totalTime/10/1000/1000%60);
// dc.DrawText(str,CRect(255+20+10,155,310,178),0);
}
void CPlayDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if(PtInRect(CRect(19,200,19+26,200+26),point))
{//播放
if(isActiveBf==FALSE)
{
isActiveBf=TRUE;
InvalidateRect(CRect(19,200,19+26,200+26),FALSE);
}
}
else if(PtInRect(CRect(57,200,57+26,200+26),point))
{//停止
if(isActiveTz==FALSE)
{
isActiveTz=TRUE;
InvalidateRect(CRect(57,200,57+26,200+26),FALSE);
}
}
else if(PtInRect(CRect(94,200,94+26,200+26),point))
{//快退
if(isActiveKt==FALSE)
{
isActiveKt=TRUE;
InvalidateRect(CRect(94,200,94+26,200+26),FALSE);
}
}
else if(PtInRect(CRect(132,200,132+26,200+26),point))
{//快进
if(isActiveKj==FALSE)
{
isActiveKj=TRUE;
InvalidateRect(CRect(132,200,132+26,200+26),FALSE);
}
}
else if(PtInRect(CRect(258,183,258+50,183+50),point))
{//返回
if(isActiveRe==FALSE)
{
isActiveRe=TRUE;
InvalidateRect(CRect(258,183,258+65,183+65),FALSE);
}
}
else if(PtInRect(CRect(187,203,240,250),point))
{//音量调节
if(isActiveVol==FALSE)
{
isActiveVol=TRUE;
volumeValue=((point.x-193)/8)*0x33333333;
if(volumeValue>=0xffffffff) volumeValue=0xffffffff;
waveOutSetVolume(0,volumeValue);
InvalidateRect(CRect(187,203,246,250),FALSE);
}
}
else if(PtInRect(CRect(110,160,110+190,175),point))
{//播放进度调节
//进度条上每个象素点表示的时间,totalTime/188
int cur,delValue;
delValue=13.0/219.0*(curTime/10/1000/1000);
cur=111+((float)curTime+(float)delValue*10000000)/(float)totalTime*(float)188;//当前时间占的进度条
//根据前面的算法解方程
curTime= ((float)point.x-111.0) / ((1.0+13.0/219.0)/(float)totalTime*188.0 );
m_pMediaSeeking->SetPositions(&curTime,AM_SEEKING_AbsolutePositioning, NULL, 0);
m_pMediaControl->Run();
}
CDialog::OnLButtonDown(nFlags, point);
}
void CPlayDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CString str;
if(isActiveBf==TRUE)
{//播放
isActiveBf=FALSE;
if(cursel<0)
{
InvalidateRect(CRect(0,0,320,240),FALSE);
return;
}
else
{
if(isPlay==FALSE)
{
isPlay=TRUE;
InvalidateRect(CRect(0,0,320,240),FALSE);
if(m_pMediaControl != NULL && pauseStatus==FALSE)
{//播放过没有停止的
m_pMediaControl->Stop();
Wavpath="";
m_pMediaControl->Release();
// 释放对象
m_pGraph-> Release();
// 程序结束时调用
m_pMediaSeeking->Release();
g_pMediaPosition->Release();
CoUninitialize();
}
if(pauseStatus==TRUE)
{//如果是暂停状态开始播放
pauseStatus=FALSE;
m_pGraph->QueryInterface(IID_IMediaControl, (void **)&m_pMediaControl);
m_pMediaControl->Run();
}
else
{
CoInitialize(NULL);
CoCreateInstance(CLSID_FilterGraph,NULL,CLSCTX_INPROC,IID_IGraphBuilder,(void **)&m_pGraph);
m_pGraph->QueryInterface(IID_IMediaSeeking, (void **)&m_pMediaSeeking);
m_pGraph->QueryInterface(IID_IMediaControl, (void **)&m_pMediaControl);
m_pGraph-> RenderFile(Wavpath,NULL);
m_pGraph->QueryInterface(IID_IMediaPosition,(LPVOID*)&g_pMediaPosition);
g_pMediaPosition->get_Duration(&g_Len);
g_pMediaPosition->put_CurrentPosition(0);
m_pMediaControl->Run();
}
m_pMediaSeeking->SetTimeFormat(&TIME_FORMAT_MEDIA_TIME); // frameformat => timeformat
m_pMediaSeeking->GetDuration(&totalTime); //得到的时间单位为100ns
m_pMediaSeeking->GetCurrentPosition(&curTime);
if(pauseStatus==FALSE)
{//如果是新的开始
SetTimer(1,1000,NULL);
}
}
else
{//暂停
pauseStatus=TRUE;
isPlay=FALSE;
InvalidateRect(CRect(0,0,320,240),FALSE);
if(m_pMediaControl != NULL) // isplaying
{
m_pMediaControl->Pause();
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -