770 lines
17 KiB
C++
Executable File
770 lines
17 KiB
C++
Executable File
// MusicPlayerDlg.cpp : implementation file
|
|
//
|
|
|
|
#include "stdafx.h"
|
|
#include "MusicPlayer.h"
|
|
#include "MusicPlayerDlg.h"
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CMusicPlayerDlg dialog
|
|
|
|
CMusicPlayerDlg::CMusicPlayerDlg(CWnd* pParent /*=NULL*/)
|
|
: CDialog(CMusicPlayerDlg::IDD, pParent)
|
|
{
|
|
//{{AFX_DATA_INIT(CMusicPlayerDlg)
|
|
//}}AFX_DATA_INIT
|
|
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
|
|
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
|
|
|
|
m_InitDC = false;
|
|
|
|
// 初始化背景画刷
|
|
CBitmap tmpBmp;
|
|
// 从资源中加载背景图片
|
|
tmpBmp.LoadBitmap(IDB_MUSIC_WND);
|
|
|
|
m_BgDC.CreateCompatibleDC(NULL);
|
|
m_BgDC.SelectObject(&tmpBmp);
|
|
|
|
tmpBmp.DeleteObject();
|
|
|
|
|
|
// 加载资源文件
|
|
theApp.LoadLanguageRes(theApp.GetLanguage());
|
|
|
|
m_txtFont.CreateFont(18,0,0,0,FW_BOLD,0,0,0,GB2312_CHARSET,OUT_DEFAULT_PRECIS,
|
|
CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH|FF_SWISS,_T("Arial"));
|
|
|
|
WCHAR strRes[MAX_PATH];
|
|
CString(LoadString(theApp.GetResourceLib(),IDS_MUSICPLAYER_TITLE,strRes,MAX_PATH));
|
|
m_TitleText = strRes;
|
|
|
|
m_SourceFile = L"";
|
|
|
|
m_pGraph = NULL;
|
|
m_pSeek = NULL;
|
|
m_pEvent = NULL;
|
|
m_pMediaControl = NULL;
|
|
m_InitGraph = FALSE;
|
|
|
|
m_BlockD = FALSE;
|
|
m_ReplayAll = TRUE;
|
|
m_RandomPlay = TRUE;
|
|
|
|
m_Timer = NULL;
|
|
}
|
|
|
|
CMusicPlayerDlg::~CMusicPlayerDlg()
|
|
{
|
|
m_BgDC.DeleteDC();
|
|
m_MemDC.DeleteDC();
|
|
m_BlockDC.DeleteDC();
|
|
m_BlockDCD.DeleteDC();
|
|
m_txtFont.DeleteObject();
|
|
|
|
if (m_Timer)
|
|
{
|
|
timeKillEvent(m_Timer);
|
|
}
|
|
|
|
if (m_pGraph)
|
|
{
|
|
m_pGraph->Release(); // Graph
|
|
m_pGraph = NULL;
|
|
}
|
|
if (m_pEvent)
|
|
{
|
|
m_pEvent->Release(); // 事件接口
|
|
m_pEvent = NULL;
|
|
}
|
|
if (m_pSeek)
|
|
{
|
|
m_pSeek->Release(); // 数据流定位接口
|
|
m_pSeek = NULL;
|
|
}
|
|
if (m_pMediaControl)
|
|
{
|
|
m_pMediaControl->Release(); // 播放器接口
|
|
m_pMediaControl = NULL;
|
|
}
|
|
}
|
|
|
|
void CMusicPlayerDlg::DoDataExchange(CDataExchange* pDX)
|
|
{
|
|
CDialog::DoDataExchange(pDX);
|
|
//{{AFX_DATA_MAP(CMusicPlayerDlg)
|
|
DDX_Control(pDX, IDC_STATIC_TIME, m_labTime);
|
|
DDX_Control(pDX, IDC_STATIC_FILENAME, m_labFile);
|
|
DDX_Control(pDX, IDC_STATIC_ALL, m_labAllTime);
|
|
DDX_Control(pDX, IDC_BUTTON_STOP, m_butStop);
|
|
DDX_Control(pDX, IDC_BUTTON_REDOM, m_butRandom);
|
|
DDX_Control(pDX, IDC_BUTTON_PRE, m_butPre);
|
|
DDX_Control(pDX, IDC_BUTTON_OPEN, m_butOpen);
|
|
DDX_Control(pDX, IDC_BUTTON_PLAY, m_butPlay);
|
|
DDX_Control(pDX, IDC_BUTTON_NEXT, m_butNext);
|
|
DDX_Control(pDX, IDC_BUTTON_EXIT, m_butExit);
|
|
DDX_Control(pDX, IDC_BUTTON_CIRCLE, m_butAll);
|
|
//}}AFX_DATA_MAP
|
|
}
|
|
|
|
BEGIN_MESSAGE_MAP(CMusicPlayerDlg, CDialog)
|
|
//{{AFX_MSG_MAP(CMusicPlayerDlg)
|
|
ON_WM_PAINT()
|
|
ON_WM_ERASEBKGND()
|
|
ON_BN_CLICKED(IDC_BUTTON_CIRCLE, OnButtonCircle)
|
|
ON_BN_CLICKED(IDC_BUTTON_EXIT, OnButtonExit)
|
|
ON_BN_CLICKED(IDC_BUTTON_NEXT, OnButtonNext)
|
|
ON_BN_CLICKED(IDC_BUTTON_OPEN, OnButtonOpen)
|
|
ON_BN_CLICKED(IDC_BUTTON_PLAY, OnButtonPlay)
|
|
ON_BN_CLICKED(IDC_BUTTON_PRE, OnButtonPre)
|
|
ON_BN_CLICKED(IDC_BUTTON_REDOM, OnButtonRedom)
|
|
ON_BN_CLICKED(IDC_BUTTON_STOP, OnButtonStop)
|
|
ON_MESSAGE(WM_DSPLAYER,OnDSPlayer)
|
|
ON_MESSAGE(WM_DRAWPLAYTIME, OnPlayerTimer)
|
|
ON_WM_TIMER()
|
|
ON_WM_LBUTTONDOWN()
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CMusicPlayerDlg message handlers
|
|
|
|
BOOL CMusicPlayerDlg::OnInitDialog()
|
|
{
|
|
CDialog::OnInitDialog();
|
|
|
|
// Set the icon for this dialog. The framework does this automatically
|
|
// when the application's main window is not a dialog
|
|
SetIcon(m_hIcon, TRUE); // Set big icon
|
|
SetIcon(m_hIcon, FALSE); // Set small icon
|
|
|
|
CenterWindow(GetDesktopWindow()); // center to the hpc screen
|
|
|
|
// TODO: Add extra initialization here
|
|
MoveWindow(0,0,320,240);
|
|
|
|
m_butExit.MoveWindow(282,6,25,25);
|
|
m_butExit.LoadBitmaps(IDB_MUSIC_CLOSE,IDB_MUSIC_CLOSED);
|
|
|
|
if (m_ReplayAll)
|
|
{
|
|
m_butAll.LoadBitmaps(IDB_MUSIC_CIRCLE);
|
|
}
|
|
else
|
|
{
|
|
m_butAll.LoadBitmaps(IDB_MUSIC_CIRCLED);
|
|
}
|
|
|
|
m_butAll.MoveWindow(2,56,46,46);
|
|
|
|
|
|
if (m_RandomPlay)
|
|
{
|
|
m_butRandom.LoadBitmaps(IDB_MUSIC_RANDOM);
|
|
}
|
|
else
|
|
{
|
|
m_butRandom.LoadBitmaps(IDB_MUSIC_RANDOMD);
|
|
}
|
|
m_butRandom.MoveWindow(2,113,46,46);
|
|
|
|
m_butOpen.MoveWindow(2,170,46,46);
|
|
m_butOpen.LoadBitmaps(IDB_MUSIC_OPEN,IDB_MUSIC_OPEND);
|
|
|
|
m_butPlay.MoveWindow(272,37,46,46);
|
|
m_butPlay.LoadBitmaps(IDB_MUSIC_PLAY,IDB_MUSIC_PLAYD,NULL,IDB_MUSIC_PLAYDIS);
|
|
|
|
m_butStop.MoveWindow(272,87,46,46);
|
|
m_butStop.LoadBitmaps(IDB_MUSIC_STOP,IDB_MUSIC_STOPD,NULL,IDB_MUSIC_STOPDIS);
|
|
|
|
m_butPre.MoveWindow(272,137,46,46);
|
|
m_butPre.LoadBitmaps(IDB_MUSIC_BACK,IDB_MUSIC_BACKD,NULL,IDB_MUSIC_BACKDIS);
|
|
|
|
m_butNext.MoveWindow(272,187,46,46);
|
|
m_butNext.LoadBitmaps(IDB_MUSIC_NEXT,IDB_MUSIC_NEXTD,NULL,IDB_MUSIC_NEXTDIS);
|
|
|
|
m_labTime.MoveWindow(87,107,99,31);
|
|
m_labTime.SetTxtFont(1);
|
|
m_labTime.SetWindowText(L"00:00/");
|
|
|
|
m_labAllTime.MoveWindow(186,113,50,22);
|
|
m_labAllTime.SetTxtFont(2);
|
|
m_labAllTime.SetWindowText(L"00:00");
|
|
|
|
m_labFile.MoveWindow(60,158,199,22);
|
|
m_labFile.SetWindowText(L"");
|
|
|
|
SetTimer(1,500,NULL);
|
|
|
|
m_Timer = timeSetEvent(1000,100,(LPTIMECALLBACK)PlayerTimeProc,(DWORD)this,TIME_PERIODIC);
|
|
return TRUE; // return TRUE unless you set the focus to a control
|
|
}
|
|
|
|
|
|
|
|
void CMusicPlayerDlg::OnPaint()
|
|
{
|
|
CPaintDC dc(this); // device context for painting
|
|
|
|
// TODO: Add your message handler code here
|
|
|
|
m_MemDC.BitBlt(0,0,320,240,&m_BgDC,0,0,SRCCOPY);
|
|
m_MemDC.DrawText(m_TitleText,CRect(43,4,320,32),DT_LEFT|DT_VCENTER);
|
|
ShowProgress();
|
|
dc.BitBlt(0,0,320,240,&m_MemDC,0,0,SRCCOPY);
|
|
// Do not call CDialog::OnPaint() for painting messages
|
|
}
|
|
|
|
BOOL CMusicPlayerDlg::OnEraseBkgnd(CDC* pDC)
|
|
{
|
|
// TODO: Add your message handler code here and/or call default
|
|
if (!m_InitDC)
|
|
{
|
|
CBitmap tmpBmp;
|
|
tmpBmp.CreateCompatibleBitmap(pDC,320,240);
|
|
m_MemDC.CreateCompatibleDC(pDC);
|
|
m_MemDC.SelectObject(&tmpBmp);
|
|
m_MemDC.SelectObject(&m_txtFont);
|
|
m_MemDC.SetBkMode(TRANSPARENT);
|
|
m_MemDC.SetTextColor(RGB(255,255,255));
|
|
tmpBmp.DeleteObject();
|
|
|
|
tmpBmp.LoadBitmap(IDB_MUSIC_BAR);
|
|
m_BlockDC.CreateCompatibleDC(pDC);
|
|
m_BlockDC.SelectObject(&tmpBmp);
|
|
|
|
tmpBmp.DeleteObject();
|
|
tmpBmp.LoadBitmap(IDB_MUSIC_BAR);
|
|
m_BlockDCD.CreateCompatibleDC(pDC);
|
|
m_BlockDCD.SelectObject(&tmpBmp);
|
|
tmpBmp.DeleteObject();
|
|
|
|
m_InitDC = true;
|
|
}
|
|
return FALSE;
|
|
//return CDialog::OnEraseBkgnd(pDC);
|
|
}
|
|
|
|
void CMusicPlayerDlg::OnButtonCircle()
|
|
{
|
|
// TODO: Add your control notification handler code here
|
|
|
|
if (m_ReplayAll)
|
|
{
|
|
m_butAll.LoadBitmaps(IDB_MUSIC_CIRCLED);
|
|
}
|
|
else
|
|
{
|
|
m_butAll.LoadBitmaps(IDB_MUSIC_CIRCLE);
|
|
}
|
|
|
|
m_butAll.Invalidate();
|
|
m_ReplayAll = !m_ReplayAll;
|
|
}
|
|
|
|
void CMusicPlayerDlg::OnButtonExit()
|
|
{
|
|
// TODO: Add your control notification handler code here
|
|
EndDialog(IDOK);
|
|
}
|
|
|
|
void CMusicPlayerDlg::OnButtonNext()
|
|
{
|
|
// TODO: Add your control notification handler code here
|
|
m_SourceFile = g_Playlist.GetNextWorkFileName(false,m_RandomPlay);
|
|
|
|
bool bPlay = IsPlaying();
|
|
|
|
if (m_pMediaControl)
|
|
{
|
|
m_pMediaControl->Stop();
|
|
}
|
|
CreateGraph();
|
|
|
|
if (bPlay)
|
|
{
|
|
m_pMediaControl->Run();
|
|
m_butPlay.LoadBitmaps(IDB_MUSIC_PAUSE,IDB_MUSIC_PAUSED,0,0);
|
|
}
|
|
|
|
m_labFile.SetWindowText(GetFileName(m_SourceFile));
|
|
|
|
Sleep(1000);
|
|
}
|
|
|
|
void CMusicPlayerDlg::OnButtonOpen()
|
|
{
|
|
// TODO: Add your control notification handler code here
|
|
CMusicOpenFileDlg openDlg;
|
|
openDlg.SetWndTitle(m_TitleText);
|
|
if (openDlg.DoModal() == IDOK)
|
|
{
|
|
m_SourceFile = openDlg.GetFilePath();
|
|
|
|
if (g_Playlist.m_TotalFiles > 1)
|
|
{
|
|
m_butNext.EnableWindow(TRUE);
|
|
m_butPre.EnableWindow(TRUE);
|
|
}
|
|
else
|
|
{
|
|
m_butNext.EnableWindow(FALSE);
|
|
m_butPre.EnableWindow(FALSE);
|
|
}
|
|
|
|
if (m_pMediaControl)
|
|
{
|
|
m_pMediaControl->Stop();
|
|
}
|
|
|
|
CreateGraph();
|
|
|
|
OnButtonPlay();
|
|
}
|
|
}
|
|
|
|
void CMusicPlayerDlg::OnButtonPlay()
|
|
{
|
|
// TODO: Add your control notification handler code here
|
|
|
|
if (m_SourceFile.IsEmpty())
|
|
{
|
|
if (m_SourceFile.IsEmpty())
|
|
{
|
|
OnButtonOpen();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (IsPlaying())
|
|
{
|
|
if (m_pMediaControl)
|
|
{
|
|
m_butPlay.LoadBitmaps(IDB_MUSIC_PLAY,IDB_MUSIC_PLAYD);
|
|
m_pMediaControl->Pause();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (m_pMediaControl)
|
|
{
|
|
m_butPlay.LoadBitmaps(IDB_MUSIC_PAUSE,IDB_MUSIC_PAUSED);
|
|
m_pMediaControl->Run();
|
|
}
|
|
}
|
|
}
|
|
|
|
m_labFile.SetWindowText(GetFileName(m_SourceFile));
|
|
m_butStop.EnableWindow(TRUE);
|
|
m_butPlay.Invalidate();
|
|
}
|
|
|
|
void CMusicPlayerDlg::OnButtonPre()
|
|
{
|
|
// TODO: Add your control notification handler code here
|
|
m_SourceFile = g_Playlist.GetNextWorkFileName(true,m_RandomPlay);
|
|
//MessageBox(m_SourceFile);
|
|
//m_labName.SetWindowText(m_Config.m_MusicList.sFileNames[m_Config.m_MusicList.iCurrentFile]);
|
|
|
|
bool bPlay = IsPlaying();
|
|
|
|
if (m_pMediaControl)
|
|
{
|
|
m_pMediaControl->Stop();
|
|
}
|
|
CreateGraph();
|
|
|
|
if (bPlay)
|
|
{
|
|
m_pMediaControl->Run();
|
|
m_butPlay.LoadBitmaps(IDB_MUSIC_PAUSE,IDB_MUSIC_PAUSED,0,0);
|
|
}
|
|
|
|
m_labFile.SetWindowText(GetFileName(m_SourceFile));
|
|
|
|
Sleep(1000);
|
|
}
|
|
|
|
void CMusicPlayerDlg::OnButtonRedom()
|
|
{
|
|
// TODO: Add your control notification handler code here
|
|
if (m_RandomPlay)
|
|
{
|
|
m_butRandom.LoadBitmaps(IDB_MUSIC_RANDOMD);
|
|
}
|
|
else
|
|
{
|
|
m_butRandom.LoadBitmaps(IDB_MUSIC_RANDOM);
|
|
}
|
|
m_butRandom.Invalidate();
|
|
m_RandomPlay = !m_RandomPlay;
|
|
}
|
|
|
|
void CMusicPlayerDlg::OnButtonStop()
|
|
{
|
|
// TODO: Add your control notification handler code here
|
|
if (!IsStopped())
|
|
{
|
|
m_pMediaControl->Stop();
|
|
m_butStop.EnableWindow(FALSE);
|
|
// 设置播放位置
|
|
SetCurrentPosition(0);
|
|
m_butPlay.LoadBitmaps(IDB_MUSIC_PLAY,IDB_MUSIC_PLAYD);
|
|
m_butPlay.Invalidate();
|
|
}
|
|
}
|
|
|
|
void PlayerTimeProc(UINT uTimerID,UINT uMsg,DWORD_PTR dwUser,DWORD_PTR dw1,DWORD dw2)
|
|
{
|
|
CMusicPlayerDlg* pDlg = (CMusicPlayerDlg*)dwUser;
|
|
//pDlg->SendMessage(WM_DRAWPLAYTIME,0,0);
|
|
PostMessage(pDlg->GetSafeHwnd(),WM_DRAWPLAYTIME,NULL,NULL);
|
|
}
|
|
|
|
void CMusicPlayerDlg::CreateGraph()
|
|
{
|
|
// 建立Graph
|
|
CoCreateInstance(CLSID_FilterGraph,NULL,CLSCTX_INPROC,IID_IGraphBuilder,(void **)&m_pGraph);
|
|
m_pGraph->RenderFile(m_SourceFile,NULL);
|
|
|
|
m_pGraph->QueryInterface(IID_IMediaEventEx,(void **)&m_pEvent);
|
|
m_pEvent->SetNotifyWindow((OAHWND)(this->GetSafeHwnd()),WM_DSPLAYER,0);
|
|
|
|
|
|
m_pGraph->QueryInterface(IID_IMediaSeeking,(void**)&m_pSeek);
|
|
m_pSeek->SetTimeFormat(&TIME_FORMAT_MEDIA_TIME);
|
|
|
|
m_pGraph->QueryInterface(IID_IMediaControl,(void **)&m_pMediaControl);
|
|
|
|
m_InitGraph = true;
|
|
}
|
|
|
|
|
|
bool CMusicPlayerDlg::IsPlaying()
|
|
{
|
|
// 判断当前播放器是否正在播放
|
|
if (m_pGraph && m_pMediaControl)
|
|
{
|
|
OAFilterState statePlay = State_Stopped;
|
|
|
|
if (SUCCEEDED(m_pMediaControl->GetState(10,&statePlay)))
|
|
{
|
|
return (statePlay == State_Running);
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
bool CMusicPlayerDlg::IsPaused()
|
|
{
|
|
// 判断当前播放器是否暂停
|
|
if (m_pGraph && m_pMediaControl)
|
|
{
|
|
OAFilterState statePlay = State_Stopped;
|
|
|
|
if (SUCCEEDED(m_pMediaControl->GetState(10,&statePlay)))
|
|
{
|
|
return (statePlay == State_Paused);
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
bool CMusicPlayerDlg::IsStopped()
|
|
{
|
|
// 判断当前播放器是否已经停止
|
|
if (m_pGraph && m_pMediaControl)
|
|
{
|
|
OAFilterState statePlay = State_Stopped;
|
|
|
|
if (SUCCEEDED(m_pMediaControl->GetState(10,&statePlay)))
|
|
{
|
|
return (statePlay == State_Stopped);
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
|
|
HRESULT CMusicPlayerDlg::GetPlayerStatus()
|
|
{
|
|
// 判断当前播放器状态
|
|
if (m_pGraph && m_pMediaControl)
|
|
{
|
|
OAFilterState statePlay = State_Stopped;
|
|
|
|
if (SUCCEEDED(m_pMediaControl->GetState(10,&statePlay)))
|
|
{
|
|
return statePlay;
|
|
}
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
int CMusicPlayerDlg::GetDuration()
|
|
{
|
|
// 获取媒体文件总长度
|
|
__int64 lTime = -1;
|
|
if (m_pGraph && m_pSeek)
|
|
{
|
|
m_pSeek->GetDuration(&lTime);
|
|
lTime /= 10000000;
|
|
}
|
|
return (int)lTime;
|
|
}
|
|
|
|
int CMusicPlayerDlg::GetCurrentPosition()
|
|
{
|
|
// 获取媒体文件总长度
|
|
__int64 lTime = -1;
|
|
if (m_pGraph && m_pSeek)
|
|
{
|
|
m_pSeek->GetCurrentPosition(&lTime);
|
|
lTime /= 10000000;
|
|
}
|
|
return (int)lTime;
|
|
}
|
|
|
|
|
|
void CMusicPlayerDlg::DisposeGraph()
|
|
{
|
|
if (m_pMediaControl)
|
|
{
|
|
m_pMediaControl->Stop();
|
|
}
|
|
}
|
|
|
|
bool CMusicPlayerDlg::SetCurrentPosition(int iPosition)
|
|
{
|
|
// 获取媒体文件总长度
|
|
__int64 lTime = 10000000;
|
|
__int64 possion = (__int64)(iPosition * lTime);
|
|
if (m_pGraph && m_pSeek)
|
|
{
|
|
HRESULT hr = m_pSeek->SetPositions(&possion,AM_SEEKING_AbsolutePositioning |
|
|
AM_SEEKING_SeekToKeyFrame,0,AM_SEEKING_NoPositioning);
|
|
return SUCCEEDED(hr);
|
|
}
|
|
return false;
|
|
}
|
|
|
|
void CMusicPlayerDlg::OnDSPlayer()
|
|
{
|
|
long evCode,param1,param2;
|
|
HRESULT hr;
|
|
while (hr = m_pEvent->GetEvent(&evCode,¶m1,¶m2,0),SUCCEEDED(hr))
|
|
{
|
|
hr = m_pEvent->FreeEventParams(evCode,param1,param2);
|
|
switch(evCode)
|
|
{
|
|
case EC_COMPLETE:
|
|
// 更新按钮图片
|
|
m_butPlay.LoadBitmaps(IDB_MUSIC_PLAY,IDB_MUSIC_PLAYD,0,0);
|
|
m_butPlay.Invalidate();
|
|
m_butStop.EnableWindow(FALSE);
|
|
m_butStop.Invalidate();
|
|
// 停止播放流
|
|
m_pMediaControl->Stop();
|
|
// 复位
|
|
SetCurrentPosition(0);
|
|
m_labTime.SetWindowText(L"00:00");
|
|
if (m_ReplayAll)
|
|
{
|
|
// 更新按钮图片
|
|
m_butPlay.LoadBitmaps(IDB_MUSIC_PAUSE,IDB_MUSIC_PAUSE,0,0);
|
|
m_butPlay.Invalidate();
|
|
OnButtonNext();
|
|
}
|
|
m_pMediaControl->Run();
|
|
m_butStop.EnableWindow(TRUE);
|
|
m_butStop.Invalidate();
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
void CMusicPlayerDlg::OnTimer(UINT nIDEvent)
|
|
{
|
|
// TODO: Add your message handler code here and/or call default
|
|
switch(nIDEvent)
|
|
{
|
|
case 1:
|
|
ShowProgress();
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
CDialog::OnTimer(nIDEvent);
|
|
}
|
|
|
|
void CMusicPlayerDlg::ShowProgress()
|
|
{
|
|
|
|
// 定义设备绘图指针
|
|
CClientDC dc(this);
|
|
|
|
unsigned int len = 0;
|
|
|
|
unsigned int volLen = 0;
|
|
|
|
int startX = 61;
|
|
int startY = 189;
|
|
|
|
int volX = 193;
|
|
DWORD lVolume;
|
|
if (waveOutGetVolume(0,&lVolume) == MMSYSERR_NOERROR)
|
|
{
|
|
lVolume &= 0xFFFF;
|
|
|
|
lVolume = lVolume / 1365;
|
|
|
|
volLen = lVolume;
|
|
|
|
if (volX + volLen > 241)
|
|
{
|
|
volLen = 241 - volX;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
volLen = 0;
|
|
}
|
|
|
|
|
|
if (GetDuration() > 0)
|
|
{
|
|
if(GetCurrentPosition() >= GetDuration())
|
|
{
|
|
len = 83;
|
|
}
|
|
else
|
|
{
|
|
len = (unsigned int)(83 * GetCurrentPosition()
|
|
/ GetDuration());
|
|
}
|
|
}
|
|
|
|
|
|
CDC tmpDC;
|
|
CBitmap tmpBmp;
|
|
|
|
tmpBmp.CreateCompatibleBitmap(&dc,320,240);
|
|
tmpDC.CreateCompatibleDC(&dc);
|
|
|
|
tmpDC.SelectObject(&tmpBmp);
|
|
tmpDC.BitBlt(0,0,320,240,&m_MemDC,0,0,SRCCOPY);
|
|
|
|
TransparentImage(tmpDC.m_hDC,startX + len,startY,18,17,
|
|
m_BlockDC.m_hDC,0,0,18,17,RGB(255,0,0));
|
|
|
|
TransparentImage(tmpDC.m_hDC,volX + volLen,startY,18,17,
|
|
m_BlockDCD.m_hDC,0,0,18,17,RGB(255,0,0));
|
|
|
|
dc.BitBlt(0,0,320,240,&tmpDC,0,0,SRCCOPY);
|
|
|
|
|
|
tmpDC.DeleteDC();
|
|
tmpBmp.DeleteObject();
|
|
}
|
|
|
|
void CMusicPlayerDlg::OnLButtonDown(UINT nFlags, CPoint point)
|
|
{
|
|
// TODO: Add your message handler code here and/or call default
|
|
if (point.x >= 61 && point.y >= 189 && point.x <= 161 && point.y <= 206)
|
|
{
|
|
if (!IsStopped() && m_pSeek)
|
|
{
|
|
int iCurrent = (point.x - 61) * GetDuration() / 83;
|
|
|
|
if (iCurrent > 0)
|
|
{
|
|
if (SetCurrentPosition(iCurrent))
|
|
{
|
|
ShowProgress();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else if (point.x >= 193 && point.y >= 189 && point.x <= 258 && point.y <= 206)
|
|
{
|
|
int iCurrent = 65 / (point.x - 193);
|
|
|
|
if (iCurrent > 0)
|
|
{
|
|
DWORD volume = ((0xFFFF/iCurrent) << 16);
|
|
volume &= 0xFFFF0000;
|
|
volume |= 0xFFFF/iCurrent;
|
|
waveOutSetVolume(0,volume);
|
|
}
|
|
}
|
|
CDialog::OnLButtonDown(nFlags, point);
|
|
}
|
|
|
|
CString CMusicPlayerDlg::GetFileName(CString strFileName)
|
|
{
|
|
CString FileExt;
|
|
FileExt.Empty();
|
|
// 文件名长度
|
|
int strLen = strFileName.GetLength() - 1;
|
|
|
|
for(int i = strLen; i >= 0; i--)
|
|
{
|
|
// 查找文件名中最好一个'.'
|
|
if(strFileName.GetAt(i) == '\\')
|
|
{
|
|
// 提取文件扩展名
|
|
FileExt = strFileName.Right(strLen - i);
|
|
break;
|
|
}
|
|
}
|
|
return FileExt;
|
|
}
|
|
|
|
void CMusicPlayerDlg::OnPlayerTimer(WPARAM wParam, LPARAM lParam)
|
|
{
|
|
ShowPlayTime();
|
|
}
|
|
|
|
void CMusicPlayerDlg::ShowPlayTime()
|
|
{
|
|
if (IsPaused() || IsPlaying())
|
|
{
|
|
int FileTime = GetDuration();
|
|
if(FileTime < 0)
|
|
{
|
|
FileTime = 0;
|
|
}
|
|
int tolSecond = GetCurrentPosition();
|
|
|
|
CString str;
|
|
|
|
if(tolSecond < 0)
|
|
{
|
|
tolSecond = 0;
|
|
}
|
|
|
|
unsigned char Minute = (int)(tolSecond / 60);
|
|
unsigned char Second = tolSecond % 60;
|
|
|
|
str.Format(_T("%02d:%02d"),Minute,Second);
|
|
m_labTime.SetWindowText(str);
|
|
|
|
tolSecond = FileTime;
|
|
Minute = (int)(tolSecond / 60);
|
|
Second = tolSecond % 60;
|
|
|
|
str.Format(L"/%d:%02d",Minute,Second);
|
|
m_labAllTime.SetWindowText(str);
|
|
m_labAllTime.ShowWindow(SW_SHOW);
|
|
m_labTime.ShowWindow(SW_SHOW);
|
|
}
|
|
}
|