📄 cdplayerdlg.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 + -