www.pudn.com > PLAYMP3.rar > PLAYMP3Dlg.cpp
// PLAYMP3Dlg.cpp : implementation file // #include "stdafx.h" #include "PLAYMP3.h" #include "PLAYMP3Dlg.h" //#include "OpenFileDlg.h" #include#include #include #include "lrc.h" #include "fullpathfile.h" //#define WM_SUSPEND WM_USER+9 extern CString strPath; #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif //COpenFileDlg openfile_dlg; CFullPathFile openfile_dlg; ///////////////////////////////////////////////////////////////////////////// // CPLAYMP3Dlg dialog #define WM_SUSPEND WM_USER+9 #define SLIDER_TIMER 100 #define WM_SET_VOL WM_USER+229 static TCHAR gszBaseInstance[256] = _T("ControlPanel\\Volume"); HKEY g_hkVolume = NULL;// CPLAYMP3Dlg::CPLAYMP3Dlg(CWnd* pParent /*=NULL*/) : CDialog(CPLAYMP3Dlg::IDD, pParent) { //{{AFX_DATA_INIT(CPLAYMP3Dlg) //}}AFX_DATA_INIT // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 mFilterGraph = NULL; mSourceFile = ""; mSliderTimer = 0; b_play_or_pause = true; str_lrc = L""; b_yesLrc = false; mp3Info = false; b_mp3info = false; b_btn_round = true; b_beginPlay = false;//最开始不播放 temp_time = "00:00"; m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } CPLAYMP3Dlg::~CPLAYMP3Dlg() { mp3DestroyGraph(); } void CPLAYMP3Dlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CPLAYMP3Dlg) DDX_Control(pDX, IDC_STATE_DIAN, m_StateDian); DDX_Control(pDX, IDC_VOL_DIAN, m_VolDian); DDX_Control(pDX, IDC_NAMEING, m_Nameing); DDX_Control(pDX, IDC_PLAYING, m_Playing); DDX_Control(pDX, IDC_PLAYTIME, m_PlayTime); DDX_Control(pDX, IDC_LRCNEW, m_NewLrc); DDX_Control(pDX, IDC_LIST, m_ListMp3); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CPLAYMP3Dlg, CDialog) //{{AFX_MSG_MAP(CPLAYMP3Dlg) ON_WM_CTLCOLOR() ON_WM_KEYDOWN() ON_WM_LBUTTONDOWN() ON_WM_LBUTTONUP() ON_WM_PAINT() ON_WM_ERASEBKGND() ON_WM_TIMER() ON_WM_CLOSE() ON_MESSAGE(WM_SUSPEND,OnSuspend) ON_LBN_SELCHANGE(IDC_LIST, OnSelchangeList) ON_WM_SETFOCUS() ON_WM_HSCROLL() ON_BN_CLICKED(IDC_BUTTON1, OnOK) ON_WM_MOUSEMOVE() //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CPLAYMP3Dlg message handlers BOOL CPLAYMP3Dlg::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 m_StateDian.MoveWindow(150,201,29,20); ::SetWindowPos(this->GetSafeHwnd(), HWND_TOPMOST,0, 0, 480, 272,SWP_SHOWWINDOW); RegOpenKeyEx(HKEY_CURRENT_USER, gszBaseInstance, 0, 0, &g_hkVolume); xxx = 0; bei = 0; m_ListMp3.MoveWindow(41,56,67,162);// m_ListMp3.SetItemHeight(NULL ,18);//设LIST列表行间矩 m_ListMp3.ShowWindow(SW_HIDE); kkk_minute= ""; kkk_second= ""; b_volume = true; CoInitialize(NULL); GetVolume();//得到当前声音 CenterWindow(GetDesktopWindow()); // center to the hpc screen // TODO: Add extra initialization here m_BackScreenBitmap.LoadBitmap(IDB_BKG); SetToolRectangle(); m_listPick = 0; BYTE m_Byte[16]={0x33 ,0x26,0xB2 ,0x75, 0x8E ,0x66 ,0xCF, 0x11 ,0xA6 ,0xD9, 0x00, 0xAA ,0x00 ,0x62 ,0xCE, 0x6C};//wma文件头。 char cBuffer[100]; memcpy(cBuffer,m_Byte,sizeof(m_Byte)); strWmaTAG = cBuffer;//得到标准的WMA前字节字符串。 m_Playing.MoveWindow(180,53,220,27); m_Nameing.MoveWindow(180,80,220,27); m_PlayTime.MoveWindow(180,126-6,220,14); m_NewLrc.MoveWindow(180,150-4,225,35); return TRUE; // return TRUE unless you set the focus to a control } void CPLAYMP3Dlg::DrawInterface(CDC &dc) { CDC memDC ; memDC.CreateCompatibleDC ( &dc ) ; CBitmap* pBitmap ; //load all bitmap CBitmap* pOldBitmap ; //save old bitmap temp ///////////////////////////////////////////////// //分配bitmap对象内存 pBitmap = new CBitmap ; pBitmap ->LoadBitmap ( IDB_UP_W) ; pOldBitmap = memDC.SelectObject ( pBitmap ) ; dc.BitBlt ( m_rect[0].TopLeft().x, m_rect[0].TopLeft().y, 158, 158, &memDC, 0, 0, SRCCOPY ) ; memDC.SelectObject ( pOldBitmap ) ; delete pBitmap ; ////////////////////////////////////////////// //............................................................. //分配bitmap对象内存 pBitmap = new CBitmap ; pBitmap ->LoadBitmap ( IDB_DOWN_W ) ; pOldBitmap = memDC.SelectObject ( pBitmap ) ; dc.BitBlt ( m_rect[1].TopLeft().x, m_rect[1].TopLeft().y, 111, 111, &memDC, 0, 0, SRCCOPY ) ; memDC.SelectObject ( pOldBitmap ) ; delete pBitmap ; //............................................................... //分配bitmap对象内存 pBitmap = new CBitmap ; pBitmap ->LoadBitmap ( IDB_ADD_W ) ; pOldBitmap = memDC.SelectObject ( pBitmap ) ; dc.BitBlt ( m_rect[2].TopLeft().x, m_rect[2].TopLeft().y, 111, 111, &memDC, 0, 0, SRCCOPY ) ; memDC.SelectObject ( pOldBitmap ) ; delete pBitmap ; //................................................................ //分配bitmap对象内存 pBitmap = new CBitmap ; pBitmap ->LoadBitmap ( IDB_SUB_W ) ; pOldBitmap = memDC.SelectObject ( pBitmap ) ; dc.BitBlt ( m_rect[3].TopLeft().x, m_rect[3].TopLeft().y, 111, 111, &memDC, 0, 0, SRCCOPY ) ; memDC.SelectObject ( pOldBitmap ) ; delete pBitmap ; //................................................................ //分配bitmap对象内存 pBitmap = new CBitmap ; if (!b_play_or_pause) { pBitmap ->LoadBitmap ( IDB_SPAUSE_B ) ; pOldBitmap = memDC.SelectObject ( pBitmap ) ; //将图片COPY到指定的像素位置 dc.BitBlt ( m_rect[4].TopLeft().x, m_rect[4].TopLeft().y, 111, 111, &memDC, 0, 0, SRCCOPY ) ; } else { pBitmap ->LoadBitmap ( IDB_PLAYMP3_W ) ; pOldBitmap = memDC.SelectObject ( pBitmap ) ; //将图片COPY到指定的像素位置 dc.BitBlt ( m_rect[4].TopLeft().x, m_rect[4].TopLeft().y, 111, 111, &memDC, 0, 0, SRCCOPY ) ; } memDC.SelectObject ( pOldBitmap ) ; delete pBitmap ; //................................................................ //分配bitmap对象内存 pBitmap = new CBitmap ; pBitmap ->LoadBitmap ( IDB_STOP_W ) ; pOldBitmap = memDC.SelectObject ( pBitmap ) ; dc.BitBlt ( m_rect[5].TopLeft().x, m_rect[5].TopLeft().y, 111, 111, &memDC, 0, 0, SRCCOPY ) ; memDC.SelectObject ( pOldBitmap ) ; //释放bitmap对象内存 delete pBitmap ; /////////////////////////////////////// //分配bitmap对象内存 pBitmap = new CBitmap ; pBitmap ->LoadBitmap ( IDB_LEFT_W ) ; pOldBitmap = memDC.SelectObject ( pBitmap ) ; dc.BitBlt ( m_rect[6].TopLeft().x, m_rect[6].TopLeft().y, 111, 111, &memDC, 0, 0, SRCCOPY ) ; memDC.SelectObject ( pOldBitmap ) ; delete pBitmap ; //////////////////////// ////////////////////// //分配bitmap对象内存 pBitmap = new CBitmap ; pBitmap ->LoadBitmap ( IDB_RIGHT_W ) ; pOldBitmap = memDC.SelectObject ( pBitmap ) ; dc.BitBlt ( m_rect[7].TopLeft().x, m_rect[7].TopLeft().y, 111, 111, &memDC, 0, 0, SRCCOPY ) ; memDC.SelectObject ( pOldBitmap ) ; delete pBitmap ; ///////////////////////////////////////////////// //分配bitmap对象内存 pBitmap = new CBitmap ; pBitmap ->LoadBitmap ( IDB_ROUND_W ) ; pOldBitmap = memDC.SelectObject ( pBitmap ) ; dc.BitBlt ( m_rect[8].TopLeft().x, m_rect[8].TopLeft().y, 111, 111, &memDC, 0, 0, SRCCOPY ) ; memDC.SelectObject ( pOldBitmap ) ; delete pBitmap ; ///////////////////// ////////////////////// //分配bitmap对象内存 pBitmap = new CBitmap ; pBitmap ->LoadBitmap ( IDB_CLOSE_W ) ; pOldBitmap = memDC.SelectObject ( pBitmap ) ; dc.BitBlt ( m_rect[9].TopLeft().x, m_rect[9].TopLeft().y, 111, 111, &memDC, 0, 0, SRCCOPY ) ; memDC.SelectObject ( pOldBitmap ) ; delete pBitmap ; //分配bitmap对象内存 pBitmap = new CBitmap ; pBitmap ->LoadBitmap ( IDB_CANCEL_W ) ; pOldBitmap = memDC.SelectObject ( pBitmap ) ; dc.BitBlt ( m_rect[10].TopLeft().x, m_rect[10].TopLeft().y, 111, 111, &memDC, 0, 0, SRCCOPY ) ; memDC.SelectObject ( pOldBitmap ) ; //释放bitmap对象内存 delete pBitmap ; //分配bitmap对象内存 pBitmap = new CBitmap ; pBitmap ->LoadBitmap ( IDB_volume ) ; pOldBitmap = memDC.SelectObject ( pBitmap ) ; dc.BitBlt ( m_rect[11].TopLeft().x, m_rect[11].TopLeft().y, 111, 111, &memDC, 0, 0, SRCCOPY ) ; memDC.SelectObject ( pOldBitmap ) ; //释放bitmap对象内存 delete pBitmap ; memDC.DeleteDC () ; } HBRUSH CPLAYMP3Dlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); // TODO: Change any attributes of the DC here if(nCtlColor == CTLCOLOR_LISTBOX) { // pDC->SetBkMode(TRANSPARENT); pDC->SetTextColor(RGB(255,255,255)); pDC->SetBkColor(RGB(0,0,0)); m_brMine = ::CreateSolidBrush(RGB(0,0,0)); return m_brMine; } if(nCtlColor == CTLCOLOR_EDIT) { // pDC->SetBkMode(TRANSPARENT); pDC->SetTextColor(RGB(250,200,150)); pDC->SetBkColor(RGB(99,99,99)); m_brMine = ::CreateSolidBrush(RGB(99,99,99)); return m_brMine; } if(nCtlColor == CTLCOLOR_STATIC ) { // pDC->SetBkMode(TRANSPARENT); pDC->SetTextColor(RGB(255,255,255)); pDC->SetBkColor(RGB(99,99,99)); m_brMine = ::CreateSolidBrush(RGB(99,99,99)); return m_brMine; } // TODO: Return a different brush if the default is not desired return hbr; } void CPLAYMP3Dlg::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) { // TODO: Add your message handler code here and/or call default CDialog::OnKeyDown(nChar, nRepCnt, nFlags); } void CPLAYMP3Dlg::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default for ( int i = 0 ; i < 12 ; i ++ ) { if ( m_rect[i].PtInRect (point) ) { CDC* pDC = GetDC () ; CDC memDC ; memDC.CreateCompatibleDC ( pDC ) ; CBitmap bmp1 ; switch ( i ) { case 0: { bmp1.LoadBitmap ( IDB_UP_B ) ; CBitmap* pOldBitmap = memDC.SelectObject ( &bmp1 ) ; pDC->BitBlt ( m_rect[i].TopLeft().x, m_rect[i].TopLeft().y, m_rect[i].Width(), m_rect[i].Height(), &memDC, 0, 0, SRCCOPY ) ; memDC.SelectObject ( pOldBitmap ) ; break ; } case 1: { bmp1.LoadBitmap ( IDB_DOWN_B) ; CBitmap* pOldBitmap = memDC.SelectObject ( &bmp1 ) ; pDC->BitBlt ( m_rect[i].TopLeft().x, m_rect[i].TopLeft().y, m_rect[i].Width(), m_rect[i].Height(), &memDC, 0, 0, SRCCOPY ) ; memDC.SelectObject ( pOldBitmap ) ; break ; } case 2: { bmp1.LoadBitmap ( IDB_ADD_B ) ; CBitmap* pOldBitmap = memDC.SelectObject ( &bmp1 ) ; pDC->BitBlt ( m_rect[i].TopLeft().x, m_rect[i].TopLeft().y, m_rect[i].Width(), m_rect[i].Height(), &memDC, 0, 0, SRCCOPY ) ; memDC.SelectObject ( pOldBitmap ) ; break ; } case 3: { bmp1.LoadBitmap ( IDB_SUB_B) ; CBitmap* pOldBitmap = memDC.SelectObject ( &bmp1 ) ; pDC->BitBlt ( m_rect[i].TopLeft().x, m_rect[i].TopLeft().y, m_rect[i].Width(), m_rect[i].Height(), &memDC, 0, 0, SRCCOPY ) ; memDC.SelectObject ( pOldBitmap ) ; break ; } case 4: break ; case 5: { bmp1.LoadBitmap ( IDB_STOP_B ) ; CBitmap* pOldBitmap = memDC.SelectObject ( &bmp1 ) ; pDC->BitBlt ( m_rect[i].TopLeft().x, m_rect[i].TopLeft().y, m_rect[i].Width(), m_rect[i].Height(), &memDC, 0, 0, SRCCOPY ) ; memDC.SelectObject ( pOldBitmap ) ; break ; } case 6: { bmp1.LoadBitmap ( IDB_LEFT_B ) ; CBitmap* pOldBitmap = memDC.SelectObject ( &bmp1 ) ; pDC->BitBlt ( m_rect[i].TopLeft().x, m_rect[i].TopLeft().y, m_rect[i].Width(), m_rect[i].Height(), &memDC, 0, 0, SRCCOPY ) ; memDC.SelectObject ( pOldBitmap ) ; break ; } case 7: { bmp1.LoadBitmap ( IDB_RIGHT_B ) ; CBitmap* pOldBitmap = memDC.SelectObject ( &bmp1 ) ; pDC->BitBlt ( m_rect[i].TopLeft().x, m_rect[i].TopLeft().y, m_rect[i].Width(), m_rect[i].Height(), &memDC, 0, 0, SRCCOPY ) ; memDC.SelectObject ( pOldBitmap ) ; break ; } case 8: { bmp1.LoadBitmap ( IDB_ROUND_B ) ; CBitmap* pOldBitmap = memDC.SelectObject ( &bmp1 ) ; pDC->BitBlt ( m_rect[i].TopLeft().x, m_rect[i].TopLeft().y, m_rect[i].Width(), m_rect[i].Height(), &memDC, 0, 0, SRCCOPY ) ; memDC.SelectObject ( pOldBitmap ) ; break ; } case 9: { bmp1.LoadBitmap ( IDB_CLOSE_B ) ; CBitmap* pOldBitmap = memDC.SelectObject ( &bmp1 ) ; pDC->BitBlt ( m_rect[i].TopLeft().x, m_rect[i].TopLeft().y, m_rect[i].Width(), m_rect[i].Height(), &memDC, 0, 0, SRCCOPY ) ; memDC.SelectObject ( pOldBitmap ) ; break ; } case 10: { bmp1.LoadBitmap ( IDB_CANCEL_B ) ; CBitmap* pOldBitmap = memDC.SelectObject ( &bmp1 ) ; pDC->BitBlt ( m_rect[i].TopLeft().x, m_rect[i].TopLeft().y, m_rect[i].Width(), m_rect[i].Height(), &memDC, 0, 0, SRCCOPY ) ; memDC.SelectObject ( pOldBitmap ) ; break ; } } memDC.DeleteDC () ; ReleaseDC ( pDC ) ; } } } void CPLAYMP3Dlg::OnLButtonUp(UINT nFlags, CPoint point) { if(b_beginPlay)//开始播放后才可能按进度条。 if (point.x > 151 && point.x < 270 && point.y > 200 &&point.y < 220) { double duration = 1.; mFilterGraph->GetDuration(&duration); if (point.x < 151+15) { double pos = duration * (point.x - 151) / 101; //-15,是为了,到按纽中间 mFilterGraph->SetCurrentPosition(pos); } else { double pos = duration * (point.x - 151 - 15) / 101; //-15,是为了,到按纽中间 mFilterGraph->SetCurrentPosition(pos); } } CopyBMP(IDB_UP_W,0); CopyBMP(IDB_DOWN_W,1); CopyBMP(IDB_ADD_W,2); CopyBMP(IDB_SUB_W,3); // CopyBMP(IDB_PLAYMP3_B,4); CopyBMP(IDB_STOP_W,5); CopyBMP(IDB_LEFT_W,6); CopyBMP(IDB_RIGHT_W,7); CopyBMP(IDB_ROUND_W,8); CopyBMP(IDB_CLOSE_W,9); CopyBMP(IDB_CANCEL_W,10); for ( int i = 0 ; i < 12 ; i ++ ) { if ( m_rect[i].PtInRect (point) ) { switch (i) { case 0: Btn_Up(); break ; case 1: Btn_Down(); break; case 2: Btn_Add(); break ; case 3: Btn_Sub(); break ; case 4: Btn_Play(); break ; case 5: Btn_Stop(); break ; case 6: Btn_Left(); break ; case 7: Btn_Right(); break ; case 8: Btn_Round(); break ; case 9: Btn_Close(); break ; case 10: Btn_Cancel(); break ; case 11: Btn_NoVolume(); break; } } } } void CPLAYMP3Dlg::OnPaint() { CPaintDC dc(this); // device context for painting DrawInterface(dc); if (b_mp3info &&(m_ListMp3.GetCount() > 0)) { //设字体大小 CFont font; LOGFONT lf; memset(&lf, 0, sizeof(LOGFONT)); lf.lfHeight = 18; lf.lfWeight = FW_BOLD;//粗体 // lf.lfItalic = TRUE;//斜体 dc.SetTextColor(RGB(255,255,255)); lstrcpy(lf.lfFaceName, _T("Arial")); VERIFY(font.CreateFontIndirect(&lf)); CFont* def_font = dc.SelectObject(&font); CString _str_temp_stater = ""; dc.SetBkMode(TRANSPARENT);//透明 _name1 = _name2 = ""; _name1.Format(L"正在播放: %s",mp3Title); _name2.Format(L"演唱: %s",mp3Artist); //显示歌曲信息时,如果长度大于,20时。左对齐。反。之中间对齐 if (GetCStringLen(_name1) > 23) { // m_Playing.SetMargins() m_Playing.SetWindowText(_name1); //dc.DrawText(_name1,CRect(103,53,291,70),ETO_CLIPPED| DT_LEFT); } else m_Playing.SetWindowText(_name1); //dc.DrawText(_name1,CRect(103,53,291,70),ETO_CLIPPED| DT_CENTER); if (GetCStringLen(_name2) > 23) { m_Nameing.SetWindowText(_name2); //dc.DrawText(_name2,CRect(102,77,294,96),ETO_CLIPPED| DT_LEFT); } else m_Nameing.SetWindowText(_name2); //dc.DrawText(_name2,CRect(102,77,294,96),ETO_CLIPPED| DT_CENTER); //显示。状态情况 dc.SetTextColor(RGB(255,255,255)); } } BOOL CPLAYMP3Dlg::OnEraseBkgnd(CDC* pDC) { // TODO: Add your message handler code here and/or call default BITMAP bmpInfo; m_BackScreenBitmap.GetBitmap(&bmpInfo); // Create an in-memory DC compatible with the // display DC we're using to paint CDC dcMemory; dcMemory.CreateCompatibleDC(pDC); // Select the bitmap into the in-memory DC CBitmap* pOldBitmap = dcMemory.SelectObject(&m_BackScreenBitmap); // Find a centerpoint for the bitmap in the client area CRect rect; GetClientRect(&rect); // Copy the bits from the in-memory DC into the on- // screen DC to actually do the painting. Use the centerpoint // we computed for the target offset. pDC->BitBlt(0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight, &dcMemory, 0, 0, SRCCOPY); dcMemory.SelectObject(pOldBitmap); return TRUE; } void CPLAYMP3Dlg::CopyBMP(int m_map, int i) { CDC* pDC = GetDC () ; CDC memDC ; memDC.CreateCompatibleDC ( pDC ) ; CBitmap bmp,bmp1 ; CBitmap* pOldBitmap ; bmp1.LoadBitmap ( m_map) ; pOldBitmap = memDC.SelectObject ( &bmp1 ) ; pDC->BitBlt ( m_rect[i].TopLeft().x, m_rect[i].TopLeft().y, m_rect[i].Width(), m_rect[i].Height(), &memDC, 0, 0, SRCCOPY ) ; memDC.SelectObject ( pOldBitmap ) ; memDC.DeleteDC () ; ReleaseDC ( pDC ) ; } void CPLAYMP3Dlg::SetToolRectangle() { m_rect[0].SetRect(41,26,41+68,26+26);//up m_rect[1].SetRect(41,218,41+68,218+27);//down m_rect[2].SetRect(277,225,277+32,225+32);//+ m_rect[3].SetRect(312,225,312+32,225+32);//- m_rect[4].SetRect(139,225,139+27,225+27);//spause play m_rect[5].SetRect(173,225,173+27,225+27);//stop m_rect[6].SetRect(207,225,207+27,225+27);//left m_rect[7].SetRect(244,225,244+27,225+27);//right m_rect[8].SetRect(382,224,382+27,224+27); //round m_rect[9].SetRect(388,25,388+21,25+20);//close m_rect[10].SetRect(436,221,436+33,221+33);//cancel m_rect[11].SetRect(290,201,290+21,201+20);//vol } void CPLAYMP3Dlg::Btn_Up() { if (bei ==0 ) return; bei --; int n_height = bei * 5; m_ListMp3.SetTopIndex(n_height); } void CPLAYMP3Dlg::Btn_Down() { int yu; int lllll = m_ListMp3.GetCount() ; yu = (m_ListMp3.GetCount()/5) * 5 + 1; if (bei == (m_ListMp3.GetCount()/5)) { return; } int n_height = 0; n_height = (++bei) * 5 ; if (n_height > m_ListMp3.GetCount() ) { m_ListMp3.SetTopIndex(yu); } else m_ListMp3.SetTopIndex(n_height); } void CPLAYMP3Dlg::Btn_Add() { //int nResponse = openfile_dlg.DoModal(); int nResponse = openfile_dlg.DoModal(); if (nResponse == IDOK) { //没有名称,不显示。 if (openfile_dlg.array_str.GetSize() > 0) { newPos = 0; //4.10后添的。 AddToListBox(); //可以去掉虚线框 if (m_ListMp3.GetCount() > 0 ) { m_ListMp3.ShowWindow(SW_SHOW); } else m_ListMp3.ShowWindow(SW_HIDE); } } if(nResponse == IDCANCEL) { b_mp3info = FALSE; newPos = 0; Invalidate(); } } void CPLAYMP3Dlg::Btn_Sub() { // b_sub = true; // InvalidateRect(CRect(103,53,294,96)); newPos = 0; mp3Stop(); mp3DestroyGraph(); int xxxx,yyyy; if (m_ListMp3.GetCurSel() < 0)// { xxxx = m_ListMp3.GetCount(); yyyy = openfile_dlg.array_str.GetSize(); CString pppp; // m_ListMp3.GetText(0,pppp); pppp = openfile_dlg.array_str.GetAt(0); m_ListMp3.DeleteString(0); if (yyyy == 0) { return; } for(int i = 0;i 0) { CopyBMP(IDB_PLAYMP3_W,4); CString name_ ; m_ListMp3.SetCurSel(0);//设定蓝条。 // m_ListMp3.GetText(0,name_); name_ = openfile_dlg.array_str.GetAt(0); mSourceFile = name_; // mSourceFile.Format(strPath + L"mp3\\%s",name_); GetMp3INFO(mSourceFile); b_mp3info = true; str_lrc = L""; CString strMP3NAME,strLRCNAME; strMP3NAME = mSourceFile.Left(mSourceFile.GetLength() - 4); strLRCNAME = strMP3NAME + ".lrc"; lrc.Free(); if ((lrc.Open(strLRCNAME))) { b_yesLrc = true; } else { str_lrc = L""; //m_lrc.SetWindowText(str_lrc); m_NewLrc.SetWindowText(str_lrc); // m_lrc.ShowWindow(SW_HIDE); } InvalidateRect(CRect(103,53,293,110),false); mp3CreateGraph(); b_play_or_pause = true; } if (b_play_or_pause)//开始和暂停切换 { b_beginPlay = true;//开始播放,此时可以按快进,快退,和停止 CopyBMP(IDB_SPAUSE_B,4); mp3PLAY(); } if (!b_play_or_pause) { CopyBMP(IDB_PLAYMP3_W,4); mp3Pause(); } b_play_or_pause = !b_play_or_pause; } void CPLAYMP3Dlg::Btn_Stop() { CopyBMP(IDB_PLAYMP3_W,4); newPos = 0;//要按两下才可以再播放。以后再改。 mp3Stop(); } void CPLAYMP3Dlg::Btn_Left() { if (m_ListMp3.GetCount() == 1) { return; } if (m_ListMp3.GetCount() <= 0 )//没有歌曲时。 { return; } //左移 int x = m_ListMp3.GetCurSel() - 1; CopyBMP(IDB_SPAUSE_B,4); if (!b_btn_round)//随 机 { int l_max = m_ListMp3.GetCount(); srand( WCE_FCTN(time) (NULL) ); x = rand()%(l_max ); } else//循环 if (x == -1) x = m_ListMp3.GetCount() - 1; CString name_ ; m_ListMp3.SetCurSel(x); // m_ListMp3.GetText(x,name_); name_ = openfile_dlg.array_str.GetAt(x); // mSourceFile.Format(strPath + L"mp3\\%s",name_); mSourceFile = name_; GetMp3INFO(mSourceFile); b_mp3info = true; str_lrc = L""; CString strMP3NAME,strLRCNAME; strMP3NAME = mSourceFile.Left(mSourceFile.GetLength() - 4); strLRCNAME = strMP3NAME + ".lrc"; lrc.Free(); if ((lrc.Open(strLRCNAME))) { b_yesLrc = true; } else { str_lrc = L""; // m_lrc.ShowWindow(SW_HIDE); } InvalidateRect(CRect(103,53,293,110),false); mp3CreateGraph(); mp3PLAY(); b_play_or_pause = true; } void CPLAYMP3Dlg::Btn_Right() { if (m_ListMp3.GetCount() == 1)//一个歌时不可以左右。 { return; } if (m_ListMp3.GetCount() <= 0 )//没有歌曲时。 { return; } int x = m_ListMp3.GetCurSel() + 1; CopyBMP(IDB_SPAUSE_B,4); if (!b_btn_round)//随 机 { int l_max = m_ListMp3.GetCount(); srand( WCE_FCTN(time) (NULL) ); x = rand()%(l_max ); } else//循环 { if (x == m_ListMp3.GetCount() ) { x = 0; } } // m_ListMp3.SetCurSel(x); CString name_ ; m_ListMp3.SetCurSel(x); // m_ListMp3.GetText(x,name_); name_ = openfile_dlg.array_str.GetAt(x); // mSourceFile.Format(strPath + L"mp3\\%s",name_); mSourceFile = name_; GetMp3INFO(mSourceFile); b_mp3info = true; str_lrc = L""; CString strMP3NAME,strLRCNAME; strMP3NAME = mSourceFile.Left(mSourceFile.GetLength() - 4); strLRCNAME = strMP3NAME + ".lrc"; lrc.Free(); if ((lrc.Open(strLRCNAME))) { b_yesLrc = true; } else { str_lrc = L""; // m_lrc.ShowWindow(SW_HIDE); } InvalidateRect(CRect(103,53,293,110),false); mp3CreateGraph(); mp3PLAY(); b_play_or_pause = true; } void CPLAYMP3Dlg::Btn_Round() { // CString ss; // ss.Format(L"%d",m_ListMp3.GetCount()); // AfxMessageBox(ss); // if (m_ListMp3.GetCount() == 1) { return; } if (m_ListMp3.GetCount() <= 0 )//没有歌曲时。 { return; } b_btn_round = !b_btn_round; if (!b_btn_round) { CopyBMP (IDB_RANDOM_W,8); } else { CopyBMP(IDB_ROUND_W,8); } } void CPLAYMP3Dlg::Btn_Close() { RegCloseKey(g_hkVolume); if (mFilterGraph) { delete mFilterGraph; mFilterGraph = NULL; // Stop the timer if (mSliderTimer) { KillTimer(mSliderTimer); mSliderTimer = 0; CDialog::OnOK(); } CDialog::OnOK(); } CDialog::OnOK(); } void CPLAYMP3Dlg::Btn_Cancel() { m_Playing.ShowWindow(false); m_Nameing.ShowWindow(false); m_PlayTime.ShowWindow(false); m_NewLrc.ShowWindow(false); RegCloseKey(g_hkVolume); this->ShowWindow(SW_HIDE); } void CPLAYMP3Dlg::Btn_NoVolume() { DWORD sVolume,dwVolume,dw = 0; DWORD sv = 0; if (!b_volume) { CopyBMP(IDB_volume,11); switch ( out ) { case 0: sVolume = 0; break; case 1: sVolume=((DWORD)0xffff/9*1-1); break; case 2: sVolume=((DWORD)0xffff/9*2-1); break; case 3: sVolume=((DWORD)0xffff/9*3-1); break; case 4: sVolume=((DWORD)0xffff/9*4-1); break; case 5: sVolume=((DWORD)0xffff/9*5-1); break; case 6: sVolume=((DWORD)0xffff/9*6-1); break; case 7: sVolume=((DWORD)0xffff/9*7-1); break; case 8: sVolume=((DWORD)0xffff/9*8-1); break; case 9: sVolume=0xffff; break; } dwVolume=(sVolume<<16)|(sVolume); waveOutSetVolume(0,dwVolume); int x ; switch(out) { case 0: x = 315; break; case 1: x = 322; break; case 2: x = 329; break; case 3: x = 336; break; case 4: x = 343; break; case 5: x = 350; break; case 6: x = 357; break; case 7: x = 364; break; case 8: x = 371; break; case 9: x = 378; break; } } else { CopyBMP (IDB_MUTE,11); //按静音按纽时,先保存当前声音 DWORD dwVolume; DWORD sVolume; DWORD dwType ; dwType = REG_DWORD ; waveOutGetVolume(0, &dwVolume); sVolume=dwVolume>>16; if(sVolume==0) out=0; else if(sVolume<((DWORD)0xffff/9*1)) out=1; else if(sVolume<((DWORD)0xffff/9*2)) out=2; else if(sVolume<((DWORD)0xffff/9*3)) out=3; else if(sVolume<((DWORD)0xffff/9*4)) out=4; else if(sVolume<((DWORD)0xffff/9*5)) out=5; else if(sVolume<((DWORD)0xffff/9*6)) out=6; else if(sVolume<((DWORD)0xffff/9*7)) out=7; else if(sVolume<((DWORD)0xffff/9*8)) out=8; else out=9; //为点静音按纽,保丰收当前音量。 waveOutSetVolume(0,0); } b_volume = !b_volume; } LPCTSTR CPLAYMP3Dlg::CStringDownMP3(CString m_string) { return LPCTSTR(m_string); } void CPLAYMP3Dlg::mp3CreateGraph() { mp3DestroyGraph(); mFilterGraph = new CDXGraph(); if (mFilterGraph->Create()) { mFilterGraph->RenderFile(mSourceFile); mFilterGraph->Pause(); } } void CPLAYMP3Dlg::mp3DestroyGraph() { if (mFilterGraph) { // Stop the filter graph first mFilterGraph->Stop(); mFilterGraph->SetNotifyWindow(NULL); delete mFilterGraph; mFilterGraph = NULL; } } void CPLAYMP3Dlg::mp3PLAY() { if (mFilterGraph) { mFilterGraph->Run(); // Start a timer if (mSliderTimer == 0) { mSliderTimer = SetTimer(SLIDER_TIMER, 1000, NULL); } } } void CPLAYMP3Dlg::mp3Pause() { if (mFilterGraph) { mFilterGraph->Pause(); // Start a timer if (mSliderTimer == 0) { mSliderTimer = SetTimer(SLIDER_TIMER, 1000, NULL); } } } void CPLAYMP3Dlg::mp3Stop() { if (mFilterGraph) { mFilterGraph->SetCurrentPosition(0); // ShowRate(0); mFilterGraph->Stop(); // Stop the timer if (mSliderTimer) { KillTimer(mSliderTimer); mSliderTimer = 0; } } } void CPLAYMP3Dlg::OnTimer(UINT nIDEvent) { if (nIDEvent == mSliderTimer && mFilterGraph) { double pos = 0, duration = 1.; mFilterGraph->GetCurrentPosition(&pos); mFilterGraph->GetDuration(&duration); if (b_yesLrc&&b_beginPlay) //如果有歌词。 { for(int i=0; i m_time; int lll = (int)(nnn/100); if (lll == ll) { str_lrc = lrc.m_recordArray[i]->m_str; m_NewLrc.SetWindowText(L"歌词:" + str_lrc); } } } int fen,miao; if (duration < 60) { fen = 0; miao = duration; } else { miao = (int)duration%60; fen = (int)duration /60; } CString s1; s1.Format(L"%02d:%02d",fen,miao); if (pos<60) { temp_second = (int)pos; temp_minute = 0; } else if (pos>=60) { temp_second = (int)pos % 60; temp_minute = (int)pos / 60; } kkk_minute.Format(L"%02d",temp_minute); kkk_second.Format(L"%02d",temp_second); temp_time = L"播放时间: "+kkk_minute + ":" + kkk_second + " | " +s1; if (b_beginPlay) { m_PlayTime.SetWindowText(temp_time); } //播放下一首 if (pos == duration) { if (!b_btn_round)//随 机 { int l_max = m_ListMp3.GetCount(); xxx = rand()%(l_max ); } else//循环 { if (m_ListMp3.GetCount() == 1) { xxx = 0; } else if (xxx == m_ListMp3.GetCount() - 1) xxx = 0; else xxx++; } CString name_ ; m_ListMp3.SetCurSel(xxx); // m_ListMp3.GetText(xxx,name_); name_ = openfile_dlg.array_str.GetAt(xxx); // mSourceFile.Format( strPath + L"mp3\\%s",name_); mSourceFile = name_; /////////////// lrc.Free(); CString strMP3NAME,strLRCNAME; strMP3NAME = mSourceFile.Left(mSourceFile.GetLength() - 4); strLRCNAME = strMP3NAME + ".lrc"; str_lrc = L""; if ((lrc.Open(strLRCNAME))) { b_yesLrc = true; } else { // m_lrc.ShowWindow(SW_HIDE); } GetMp3INFO(mSourceFile); b_mp3info = true; mp3CreateGraph(); InvalidateRect(CRect(19,182,155 + 19,182+11),false); mp3PLAY(); b_play_or_pause = true; return; } newPos = int(pos * 101 / duration); m_StateDian.MoveWindow(newPos + 151 ,201,29,20); } CDialog::OnTimer(nIDEvent); } void CPLAYMP3Dlg::GetVolume() { DWORD dwVolume; DWORD sVolume; DWORD dwType ; dwType = REG_DWORD ; waveOutGetVolume(0, &dwVolume); sVolume=dwVolume>>16; if(sVolume==0) out=0; else if(sVolume<((DWORD)0xffff/9*1)) out=1; else if(sVolume<((DWORD)0xffff/9*2)) out=2; else if(sVolume<((DWORD)0xffff/9*3)) out=3; else if(sVolume<((DWORD)0xffff/9*4)) out=4; else if(sVolume<((DWORD)0xffff/9*5)) out=5; else if(sVolume<((DWORD)0xffff/9*6)) out=6; else if(sVolume<((DWORD)0xffff/9*7)) out=7; else if(sVolume<((DWORD)0xffff/9*8)) out=8; else out=9; int x =0; switch(out) { case 0: x = 315; break; case 1: x = 322; break; case 2: x = 329; break; case 3: x = 336; break; case 4: x = 343; break; case 5: x = 350; break; case 6: x = 357; break; case 7: x = 364; break; case 8: x = 371; break; case 9: x = 378; break; } //为点静音按纽,保丰收当前音量。 m_VolDian.MoveWindow(x,201,14,20); } // //void CPLAYMP3Dlg::ShowVolume(UCHAR volume) //{ // //} // BOOL CPLAYMP3Dlg::DestroyWindow() { // TODO: Add your specialized code here and/or call the base class if (mSliderTimer) { KillTimer(mSliderTimer); mSliderTimer = 0; } return CDialog::DestroyWindow(); } HRESULT CPLAYMP3Dlg::FindFilterByInterface(REFIID riid, IBaseFilter **ppFilter) { *ppFilter = NULL; if (!mFilterGraph) { return E_FAIL; } IEnumFilters* pEnum; HRESULT hr = mFilterGraph->GetGraph()->EnumFilters(&pEnum); if (FAILED(hr)) { return hr; } IBaseFilter* pFilter = NULL; while (pEnum->Next(1, &pFilter, NULL) == S_OK) { // Check for required interface IUnknown* pUnk; HRESULT hrQuery = pFilter->QueryInterface(riid, (void**)&pUnk); if (SUCCEEDED(hrQuery)) { pUnk->Release(); pEnum->Release(); *ppFilter = pFilter; return S_OK; } pFilter->Release(); } pEnum->Release(); return E_FAIL; } /* void CPLAYMP3Dlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) { // TODO: Add your message handler code here and/or call default if (pScrollBar->GetSafeHwnd() == m_SliderGraph.GetSafeHwnd()) { } else { CDialog::OnHScroll(nSBCode, nPos, pScrollBar); } } */ void CPLAYMP3Dlg::GetMp3INFO(CString _tempPath) { _WMAINFO wmainfo; // mp3Artist = ""; // mp3Title = ""; CString _p = _tempPath.Right(4); // CString _p2 = _p.MakeUpper(); CString _p3 = ".wma"; int i = _p.CompareNoCase(_p3);//0 为等 if (i == 0)//如果是WMA格式则有眺过。因为我没有做出来。CompareNoCase { mp3Title = GetWmaINFO(_tempPath) .Artist; mp3Artist = GetWmaINFO(_tempPath) .Title; return; } CFile file; if(!file.Open(_tempPath,CFile::modeRead)) { // AfxMessageBox(L"Can not open file."); return ; //文件^无法打开 } //把文件的最后128字节信息读给pbuf数组 long seekPos = 128; file.Seek(-seekPos,CFile::end); BYTE pbuf[128]; memset(pbuf,0,sizeof(pbuf)); file.Read(pbuf,128); mp3Info=(MP3INFO *) new BYTE[sizeof(MP3INFO)]; ZeroMemory(mp3Info,sizeof(MP3INFO)); // memcpy(mp3Info->Identify,pbuf,3); //获得tag memcpy(mp3Info->Title,pbuf+3,30); //获得歌名 memcpy(mp3Info->Artist,pbuf+33,30); //获得作者 /* memcpy(mp3Info->Album,pbuf+63,30); //获得唱片名 memcpy(mp3Info->Year,pbuf+93,4); //获得年 memcpy(mp3Info->Comment,pbuf+97,28); //获得注释 memcpy(&mp3Info->reserved,pbuf+125,1); //获得保留 memcpy(&mp3Info->reserved2,pbuf+126,1); memcpy(&mp3Info->reserved3,pbuf+127,1); */ mp3Title = mp3Info->Title; mp3Artist = mp3Info->Artist; /* mp3Album = mp3Info->Album; mp3Year = mp3Info->Year; */ file.Close(); delete mp3Info; } int CPLAYMP3Dlg::GetCStringLen(CString str) { int len = 0; bool c = true; int n = 0; int l = str.GetLength(); while (c) { if (str.GetAt(n) > 0xa1) { len = len + 2; } else len++; n++; if ( n == l) { c = false; } } return len; } void CPLAYMP3Dlg::OnClose() { // TODO: Add your message handler code here and/or call default //AfxMessageBox(L"sadfasdfasdf"); if (mFilterGraph) { delete mFilterGraph; mFilterGraph = NULL; // Stop the timer if (mSliderTimer) { KillTimer(mSliderTimer); mSliderTimer = 0; } } CDialog::OnOK(); } void CPLAYMP3Dlg::OnOK() { // this->ShowWindow(SW_HIDE); // // HWND h1; // // h1 = ::FindWindow(TEXT("OPENPLAY"),NULL); // if (h1 !=NULL) // { // ::SendMessage(h1,WM_CLOSE,0,0 ); // } // // // // HWND h; // h = ::FindWindow(TEXT("PLAY"),NULL); // // if(h !=NULL) // // ::SendMessage(h,WM_CLOSE,0,0 ); } HRESULT CPLAYMP3Dlg::OnSuspend() { HWND h1; h1 = ::FindWindow(TEXT("OPENPLAY"),NULL); if (h1 !=NULL) { ::SendMessage(h1,WM_CLOSE,0,0 ); } HWND h; h = ::FindWindow(TEXT("PLAY"),NULL); if(h !=NULL) ::SendMessage(h,WM_CLOSE,0,0 ); return true; } LRESULT CPLAYMP3Dlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) { // TODO: Add your specialized code here and/or call the base class if (message == VOLMUTE) { DWORD dwVolume; DWORD sVolume; waveOutGetVolume(0, &dwVolume); sVolume=dwVolume>>16; if(sVolume==0) Btn_NoVolume(); } if (message == HIDEMP3) { RegCloseKey(g_hkVolume); this->ShowWindow(SW_HIDE); } if (message == WM_SET_VOL) { b_volume = true; int x ; switch(wParam) { case 0: x = 315; break; case 1: x = 322; break; case 2: x = 329; break; case 3: x = 336; break; case 4: x = 343; break; case 5: x = 350; break; case 6: x = 357; break; case 7: x = 364; break; case 8: x = 371; break; case 9: x = 378; break; } //设为非静音量,用currentVolume m_VolDian.MoveWindow(x,201,14,20); if (wParam > 0) { CopyBMP(IDB_volume,11); } } if (message == SHOWMP3WINDOW)//显示歌曲信息控件。 { m_Playing.ShowWindow(true); m_Nameing.ShowWindow(true); m_PlayTime.ShowWindow(true); m_NewLrc.ShowWindow(true); } return CDialog::WindowProc(message, wParam, lParam); } _WMAINFO CPLAYMP3Dlg::GetWmaINFO(CString _strWmaPath) { _WMAINFO _str_Wma_info;//定义WMA信息,包括两个变量。 //return _str_Wma_info; /* BYTE m_Byte[16]={0x33 ,0x26,0xB2 ,0x75, 0x8E ,0x66 ,0xCF, 0x11 ,0xA6 ,0xD9, 0x00, 0xAA ,0x00 ,0x62 ,0xCE, 0x6C};//wma文件头。 char cBuffer[100]; memcpy(cBuffer,m_Byte,sizeof(m_Byte)); CString strWmaTAG= cBuffer;//得到标准的WMA前字节字符串。 */ ////////////////////////////////////////////////////////////////// ////////////////////以下十行为读WMA文件头。 CFile file11; if(!file11.Open(_strWmaPath,CFile::modeRead)) { file11.Close(); _str_Wma_info.Artist = " "; _str_Wma_info.Title = " "; return _str_Wma_info; //文件无法打开 } long seekPos11 = 30; bool x = true; BYTE pbuf11[16]; while (x) { file11.Seek(seekPos11,CFile::begin); memset(pbuf11,seekPos11,16); file11.Read(pbuf11,16); if (pbuf11 == strWmaTAG) { x = false; } seekPos11 = seekPos11 + 1; } TCHAR pbuf22[100]; CString strppp ; seekPos11 = seekPos11 + 33; file11.Seek(seekPos11,CFile::begin); memset(pbuf22,seekPos11,100); file11.Read(pbuf22,100); TCHAR name1[50]={0}; TCHAR name2[50]={0}; int l =0;//读唱者 for(int i = 0;i < 100;i++) { if (pbuf22[i] == '\0') { for(int j = 0;j < i;j++) { name1[j] = pbuf22[j]; } l = i+1; break; } } //读歌名。 for(int ii = l;ii < 100;ii++) { if (pbuf22[ii] == '\0') { for(int j = 0;j < ii;j++) { name2[j] = pbuf22[l++]; } break; } } CString na1,na2; na1 = name1; na2 = name2; _str_Wma_info.Artist = name1; _str_Wma_info.Title = name2; // AfxMessageBox(name1); // AfxMessageBox(name2); file11.Close(); return _str_Wma_info; } void CPLAYMP3Dlg::AddToListBox() { int zzz = m_ListMp3.GetCount(); for(int o11 = 0;o11 151 && point.x < 270 && point.y > 200 &&point.y < 220) { m_StateDian.MoveWindow(point.x-15 ,201,29,20); //MOUSE抬起里,设定当前播放段//这里设不可以托了。 } if (b_volume) if (point.x >= 315 && point.x < 390 && point.y > 201 && point.y < 220) { if (point.x > 378) { point.x = 378; } m_VolDian.MoveWindow(point.x,201,14,20); //将音量分为,85份。 DWORD dwVolume; DWORD sVolume=((DWORD)0xffff/65*(point.x - 315)); dwVolume=(sVolume<<16)|(sVolume); //最小声 if (point.x <= 315) { dwVolume = 0; } //最大声 if (point.x >= 375) { dwVolume == 0xffff; } waveOutSetVolume(0,dwVolume); } CDialog::OnMouseMove(nFlags, point); } // // // // int all_second,all_minute; // CString all_T; // if (duration<60) // { // all_second = (int)duration; // all_minute = 0; // } // else // if (duration>=60) // { // all_second = (int)duration % 60; // all_minute = (int)duration / 60; // } // // all_T.Format(L"%02d:%02d"); CString CPLAYMP3Dlg::GetMp3Name(CString strName) { CString tempstr; for (int i = strName.GetLength() -1 ; ; i--) { tempstr = strName.GetAt(i); if (tempstr == "\\") { break; } } CString ppp = strName.Right(strName.GetLength() -1 - i); return ppp; }