⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cdplayerdlg.cpp

📁 Visual C++_ 600 编程学习捷径
💻 CPP
字号:
// CDPlayerDlg.cpp : implementation file
//

#include "stdafx.h"
#include "CDPlayer.h"
#include "CDPlayerDlg.h"
#include "Editer.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About

#define PLAY_LIANXU 0
#define PLAY_SUIJI  1

BOOL bAdded = FALSE;

class CAboutDlg : public CDialog
{
public:
	CAboutDlg();

// Dialog Data
	//{{AFX_DATA(CAboutDlg)
	enum { IDD = IDD_ABOUTBOX };
	//}}AFX_DATA

	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CAboutDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
	//}}AFX_VIRTUAL

// Implementation
protected:
	//{{AFX_MSG(CAboutDlg)
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
	//{{AFX_DATA_INIT(CAboutDlg)
	//}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAboutDlg)
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
	//{{AFX_MSG_MAP(CAboutDlg)
		// No message handlers
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CCDDlg dialog

CCDDlg::CCDDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CCDDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CCDDlg)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
	m_bOpen = FALSE;
	m_bCDAudio = FALSE;
	m_bCDOpen = FALSE;
	m_PlayFormat = PLAY_LIANXU;
}

void CCDDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CCDDlg)
	DDX_Control(pDX, IDC_SLIDER, m_slider);
	DDX_Control(pDX, IDC_COMBO, m_combo);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CCDDlg, CDialog)
	//{{AFX_MSG_MAP(CCDDlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_PLAY, OnPlay)
	ON_BN_CLICKED(IDC_STOP, OnStop)
	ON_BN_CLICKED(IDC_PAUSE, OnPause)
	ON_BN_CLICKED(IDC_FORWARD, OnForward)
	ON_BN_CLICKED(IDC_BACKWARD, OnBackward)
	ON_BN_CLICKED(IDC_NEXT, OnNext)
	ON_BN_CLICKED(IDC_PREV, OnPrev)
	ON_CBN_SELCHANGE(IDC_COMBO, OnSelchangeCombo)
	ON_WM_TIMER()
	ON_BN_CLICKED(IDC_EJECT, OnEject)
	ON_WM_CTLCOLOR()
	ON_WM_HSCROLL()
	ON_COMMAND(IDC_EDIT, OnEdit)
	ON_COMMAND(IDC_SUI, OnSui)
	ON_UPDATE_COMMAND_UI(IDC_SUI, OnUpdateSui)
	ON_COMMAND(IDC_LIAN, OnLian)
	ON_UPDATE_COMMAND_UI(IDC_LIAN, OnUpdateLian)
	ON_COMMAND(IDC_VOICE, OnVolume)
	ON_COMMAND(IDC_ABOUT_MENU, OnAboutMenu)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CCDDlg message handlers

BOOL CCDDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	if(!m_bitmap.LoadBitmap(IDB_BITMAP))
		return FALSE;

	// Add "About..." menu item to system menu.

	// IDM_ABOUTBOX must be in the system command range.
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		CString strAboutMenu;
		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// 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
	
	// TODO: Add extra initialization here
	m_slider.SetRange(0, 500);
	m_slider.SetTicFreq(50);

    SetTimer(1, 1000, NULL);

	m_bOpen = m_CDAudio.Open();
	m_bCDOpen = m_CDAudio.IsDriveReady();
	if(m_bOpen && m_bCDOpen)
	{	
		if(m_PlayList.GetSize() != 0)
			m_PlayList.RemoveAll();

		int TotalTracks = m_CDAudio.GetTracks();
		m_TotalNum = TotalTracks;
		for(int i = 1; i <= TotalTracks; i++)
		{
			CString trackinfo;
			trackinfo.Format("曲目%d", i);
			m_combo.AddString(trackinfo);
			m_PlayList.Add(i);
		}
		m_combo.SetCurSel(0);
		m_nCurTrack = 0;
		bAdded = TRUE;
		m_CDAudio.Play();
	}

	return TRUE;  // return TRUE  unless you set the focus to a control
}

void CCDDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialog::OnSysCommand(nID, lParam);
	}
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CCDDlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);

	}
	else
	{
		// Paint the image.
		CPaintDC dc2(this);
		CDC dcImage;
		if (!dcImage.CreateCompatibleDC(&dc2))
			return;
		CBitmap* pOldBitmap = dcImage.SelectObject(&m_bitmap);
		CRect rect2;
		GetClientRect(&rect2);
		dc2.BitBlt(0, 0, rect2.right, rect2.bottom , &dcImage, 0, 0, SRCCOPY);
		dcImage.SelectObject(pOldBitmap);
		//Fill the Rectangle.
		CWnd* display = GetDlgItem(IDC_DISPLAY);
		CPaintDC dc1(display);
		CRect rect1;
		CBrush brush,*OldBrush;
		brush.CreateSolidBrush(RGB(0,0,0));
		OldBrush = (CBrush *)dc1.SelectObject(&brush);
		display->GetClientRect(rect1);
		dc1.FillRect(rect1,&brush);
		dc1.SelectObject(OldBrush);
		//
		CDialog::OnPaint();
	}
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CCDDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}


void CCDDlg::OnPlay() 
{
	if(m_CDAudio.IsDriveReady())
	{
		m_CDAudio.Stop();
		m_CDAudio.SeekTo(m_PlayList.GetAt(m_nCurTrack), 0, 0, 0);
		if(!m_CDAudio.Play())
			MessageBox("不能播放CD!", "错误", MB_OK|MB_ICONSTOP);
	}
	else
	{
		MessageBox("光驱没有准备好!", "错误", MB_OK|MB_ICONSTOP);
	}
}

void CCDDlg::OnStop() 
{
	m_CDAudio.Stop();
	m_slider.SetPos(0);
}

void CCDDlg::OnPause() 
{
	m_CDAudio.Pause();
}

void CCDDlg::OnForward() 
{
	m_CDAudio.Forward(10);
}

void CCDDlg::OnBackward() 
{
	m_CDAudio.Backward(10);
}

void CCDDlg::OnNext() 
{
	//得到当前播放的音轨数
	int nTrack = m_PlayList.GetSize();

	//将当前的音轨数加1
	m_nCurTrack++;

	//如果是最后一条音轨就跳到第一条音轨
	m_nCurTrack = m_nCurTrack % nTrack;

	m_CDAudio.Stop();
	//改变播放位置到音轨开头
	m_CDAudio.SeekTo(m_PlayList.GetAt(m_nCurTrack), 0, 0, 0);
	m_CDAudio.Play();
	m_combo.SetCurSel(m_nCurTrack);
}

void CCDDlg::OnPrev() 
{
	//得到当前播放的音轨数
	int nTrack = m_PlayList.GetSize();

	//将当前的音轨数加1
	m_nCurTrack--;

	//如果是最后一条音轨就跳到第一条音轨
	if(m_nCurTrack < 0)
		m_nCurTrack = (nTrack + m_nCurTrack)%nTrack;

	m_CDAudio.Stop();
	//改变播放位置到音轨开头
	m_CDAudio.SeekTo(m_PlayList.GetAt(m_nCurTrack), 0, 0, 0);
	m_CDAudio.Play();
	nTrack = m_CDAudio.GetTrack();
	m_combo.SetCurSel(m_nCurTrack);
}

void CCDDlg::OnSelchangeCombo() 
{
	m_nCurTrack = m_combo.GetCurSel();

	m_CDAudio.Stop();
	m_CDAudio.SeekTo(m_PlayList.GetAt(m_nCurTrack), 0, 0, 0);
	m_CDAudio.Play();
}

void CCDDlg::OnTimer(UINT nIDEvent) 
{
	int minutes, seconds, i, nTrack;
	CString tracks, length, lengths;

	CWnd *pWnd = GetWindow(GW_CHILD);
	m_CDAudio.GetAudioLength(&minutes, &seconds);
	if(m_CDAudio.GetTracks() != -1)
		tracks.Format("%02d", m_CDAudio.GetTracks());
	else
		tracks.Format("%02d", 0);
	if(minutes != -1 && seconds != -1)
		length.Format("%02d:%02d", minutes, seconds);
	else
		length.Format("%02d:%02d", 0, 0);
	nTrack = m_CDAudio.GetTrack();
	m_CDAudio.GetTrackLength(nTrack, &minutes, &seconds);
	if(minutes != -1 && seconds != -1)
		lengths.Format("%02d:%02d", minutes, seconds);
	else
		lengths.Format("%02d:%02d", 0, 0);

	SetDlgItemText(IDC_CD_LENGTH, length);
	SetDlgItemText(IDC_CD_TRACKS, tracks);
	SetDlgItemText(IDC_TRACK_LENGTH, lengths); 

	if(m_CDAudio.IsDriveReady())
	{
		m_bCDAudio = m_CDAudio.IsAudioTrack(1);
		if(m_bCDAudio && !bAdded)
		{	
			if(m_PlayList.GetSize() != 0)
				m_PlayList.RemoveAll();
			int TotalTracks = m_CDAudio.GetTracks();
			m_TotalNum = TotalTracks;
			for(i = 1; i <= TotalTracks; i++)
			{
				CString trackinfo;
				trackinfo.Format("曲目%d", i);
				m_combo.AddString(trackinfo);
				m_PlayList.Add(i);
			}
			m_nCurTrack = 0;
			m_combo.SetCurSel(m_nCurTrack);
			bAdded = TRUE;
			m_CDAudio.Play();
		}
	}

	if(!m_bOpen || !m_bCDAudio)
	{
		m_bOpen = m_CDAudio.Open();
		if(!m_CDAudio.IsDriveReady())
		while(pWnd != NULL)
		{
			pWnd->EnableWindow(FALSE);
			pWnd = pWnd->GetWindow(GW_HWNDNEXT);
		}
		pWnd = GetDlgItem(IDC_EJECT);
		pWnd->EnableWindow(TRUE);
	}
	else if(m_bCDAudio)
	{
		CString Info;
		if(m_PlayList.GetAt(m_nCurTrack) != m_CDAudio.GetTrack())
		{
			m_nCurTrack++;
			m_CDAudio.SeekTo(m_PlayList.GetAt(m_nCurTrack), 0, 0, 0);
			m_combo.SetCurSel(m_nCurTrack);
		}
		while(pWnd != NULL)
		{
			pWnd->EnableWindow(TRUE);
			pWnd = pWnd->GetWindow(GW_HWNDNEXT);
		}
		Info.Format("[%02d]%02d:%02d", m_CDAudio.GetTrack(), m_CDAudio.GetMinutes(), m_CDAudio.GetSeconds());
		CWnd*display = GetDlgItem(IDC_DISPLAY);
		CClientDC dc(display);
		CRect rect;
		CBrush brush, *OldBrush;
		brush.CreateSolidBrush(RGB(0, 0, 0));
		OldBrush = (CBrush *)dc.SelectObject(&brush);
		display->GetClientRect(rect);
		dc.SetTextColor(RGB(0, 0, 255));
		dc.SetBkColor(RGB(0, 0, 0));
		dc.FillRect(rect, &brush);
		dc.TextOut(25, 25, Info);
		dc.SelectObject(&OldBrush);
	}

	if(!m_CDAudio.IsDriveReady())
	{
		CWnd* display1 = GetDlgItem(IDC_DISPLAY);
		CClientDC dc1(display1);
		CRect rect;
		CBrush brush;
		brush.CreateSolidBrush(RGB(0, 0, 0));
		display1->GetClientRect(rect);
		dc1.FillRect(rect,&brush);
	} 

	BOOL bPaused;
	if(m_CDAudio.IsPlaying(&bPaused))
	{  

		int nCurTrack;
		int nSliderPos;
		int nMinutes, nSeconds, nTotalSecs;
		nCurTrack = m_CDAudio.GetTrack();
		m_CDAudio.GetTrackLength(nCurTrack, &nMinutes, &nSeconds);
		nTotalSecs = ((nMinutes * 60) + nSeconds) * 75;
		int nCurMinutes, nCurSeconds, nCurSec;
		nCurMinutes = m_CDAudio.GetMinutes();
		nCurSeconds = m_CDAudio.GetSeconds();
		nCurSec = m_CDAudio.GetFrames();
		nSliderPos = ((nCurMinutes * 60 + nCurSeconds) * 75 + nCurSec) * 500/nTotalSecs;
		m_slider.SetPos(nSliderPos);
		CString Length;
		Length.Format("%02d:%02d", nCurMinutes, nCurSeconds);
		SetDlgItemText(IDC_DISPLAY, Length);
	}

	CDialog::OnTimer(nIDEvent);
}

void CCDDlg::OnEject() 
{
	if(!m_bCDOpen)
	{
		m_CDAudio.CloseCD_Rom();
		SetDlgItemText(IDC_EJECT, "弹出");
		m_bCDOpen = TRUE;

	}
	else
	{
		m_CDAudio.OpenCD_Rom();
		SetDlgItemText(IDC_EJECT, "关闭");
		m_bCDAudio = FALSE;
		m_bCDOpen = FALSE;
		m_bOpen = FALSE;
	}
	m_slider.SetPos(0);
}

HBRUSH CCDDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{
	HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
	
	pDC->SetTextColor(RGB(0,0,255));

	return hbr;
}


void CCDDlg::OnSui() 
{
	m_PlayFormat = PLAY_SUIJI;
}

void CCDDlg::OnUpdateSui(CCmdUI* pCmdUI) 
{
	pCmdUI->SetCheck(m_PlayFormat == PLAY_SUIJI);
	pCmdUI->SetText("ddkkkd");
}

void CCDDlg::OnLian() 
{
	m_PlayFormat = PLAY_LIANXU;
}

void CCDDlg::OnUpdateLian(CCmdUI* pCmdUI) 
{
	pCmdUI->Enable(m_PlayFormat == PLAY_LIANXU);
}

void CCDDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{
	// TODO: Add your message handler code here and/or call default
	int nSliderPos = m_slider.GetPos();
	switch(nSBCode)
	{
	case TB_LINEUP:
		if(nSliderPos < 450)
			nSliderPos += 50;
	case TB_LINEDOWN:
		if(nSliderPos > 50)
			nSliderPos -= 50;
	case TB_PAGEUP:
		if(nSliderPos < 400)
			nSliderPos += 100;
	case TB_PAGEDOWN:
		if(nSliderPos > 100)
			nSliderPos -= 100;
	case TB_THUMBPOSITION:
		nSliderPos = nPos;
	
	}

    int nCurTrack;
	int nSliderSecs;
	int nMinutes, nSeconds, nTotalSecs;
	nCurTrack = m_CDAudio.GetTrack();
	m_CDAudio.GetTrackLength(nCurTrack, &nMinutes, &nSeconds);
	nTotalSecs = (nMinutes * 60) + nSeconds;
	nSliderSecs = nTotalSecs * nSliderPos/500;
	nMinutes = nSliderSecs/60;
	nSeconds = nSliderSecs%60;
	m_CDAudio.SeekTo(nCurTrack, nMinutes, nSeconds, 0);
	m_CDAudio.Play(); 

	CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
}

void CCDDlg::OnEdit() 
{
	CEditer dlg;
	dlg.m_TotalNum = m_TotalNum;
	if(dlg.DoModal() == IDOK)
	{
		m_combo.ResetContent();
		m_PlayList.RemoveAll();
		for(int i = 0; i < dlg.m_PlayList.GetSize(); i++)
		{
			int value = dlg.m_PlayList.GetAt(i);
			m_PlayList.Add(value);
			CString str;
			str.Format("曲目%d", value);
			m_combo.AddString(str);
		}
		m_nCurTrack = 0;
		m_combo.SetCurSel(m_nCurTrack);
		m_CDAudio.SeekTo(m_PlayList.GetAt(m_nCurTrack), 0, 0, 0);
	}
}


void CCDDlg::OnVolume() 
{
	ShellExecute(NULL, NULL, _T("Sndvol32.exe"), NULL, _T("C:\\Windows"), SW_SHOWNORMAL);
}

void CCDDlg::OnAboutMenu() 
{
	CAboutDlg dlg;
	dlg.DoModal();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -