📄 mcisampledlg.cpp
字号:
// MCISampleDlg.cpp : implementation file
//
#include "stdafx.h"
#include "MCISample.h"
#include "MCISampleDlg.h"
#include <dbt.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
// CMCISampleDlg dialog
CMCISampleDlg::CMCISampleDlg(CWnd* pParent /*=NULL*/)
: CDialog(CMCISampleDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CMCISampleDlg)
m_strTrack = _T("");
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CMCISampleDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CMCISampleDlg)
DDX_Control(pDX, IDC_EJECT, m_btnEject);
DDX_Control(pDX, IDC_PLAY, m_btnPlay);
DDX_Control(pDX, IDC_STOP, m_btnStop);
DDX_Control(pDX, IDC_PAUSE, m_btnPause);
DDX_Control(pDX, IDC_STATUS, m_wndStatus);
DDX_Control(pDX, IDC_TRACKSELECT, m_comboTrack);
DDX_CBString(pDX, IDC_TRACKSELECT, m_strTrack);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CMCISampleDlg, CDialog)
//{{AFX_MSG_MAP(CMCISampleDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_PLAY, OnPlay)
ON_BN_CLICKED(IDC_STOP, OnStop)
ON_CBN_SELCHANGE(IDC_TRACKSELECT, OnSelchangeTrackselect)
ON_WM_CLOSE()
ON_BN_CLICKED(IDC_PAUSE, OnPause)
ON_BN_CLICKED(IDC_EJECT, OnEject)
//}}AFX_MSG_MAP
ON_WM_DEVICECHANGE()
ON_MESSAGE(MM_MCINOTIFY, OnMciNotify)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMCISampleDlg message handlers
BOOL CMCISampleDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// 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);
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
//使停止/暂停按钮不可用
m_btnStop.EnableWindow(FALSE);
m_btnPause.EnableWindow(FALSE);
//打开CD音频设备
if (m_CdAudio.Open()) {
m_wndStatus.SetWindowText(_T("Device not ready!"));
m_btnPlay.EnableWindow(FALSE);
m_btnEject.EnableWindow(FALSE);
}
else {
// 为异步操作设置回调窗口
m_CdAudio.SetCallbackWnd(this);
m_wndStatus.SetWindowText(_T("CD播放器准备"));
}
if (!m_CdAudio.IsReady()) {
m_btnPlay.EnableWindow(FALSE);
}
//为CD音频设置时间格式
m_CdAudio.SetTimeFormat(CCdAudio::FormatTMSF);
//更新对话框控件
UpdateControls();
return TRUE;
}
void CMCISampleDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
CDialog::OnSysCommand(nID, lParam);
}
void CMCISampleDlg::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
{
CDialog::OnPaint();
}
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CMCISampleDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
//播放CD音频
void CMCISampleDlg::OnPlay()
{
UpdateData();
//把曲目转化为数字
m_nTrackToPlay =
(m_strTrack.GetAt(0)-'0')*10 +
(m_strTrack.GetAt(1)-'0');
//取得曲目长度
CMsf msf = m_CdAudio.GetTrackLength(m_nTrackToPlay);
m_tmsfFrom = CTmsf(m_nTrackToPlay, 0, 0, 0);
m_tmsfTo = CTmsf(m_nTrackToPlay,
msf.GetMinute(), msf.GetSecond(), msf.GetFrame());
// 播放选中的曲目
if (!m_CdAudio.Play(m_tmsfFrom, m_tmsfTo)) {
m_wndStatus.SetWindowText(_T("正在播放...."));
m_btnStop.EnableWindow();
m_btnPause.EnableWindow();
}
}
//停止播放
void CMCISampleDlg::OnStop()
{
if (!m_CdAudio.Stop()) {
m_wndStatus.SetWindowText(_T("Stopped"));
m_btnStop.EnableWindow(FALSE);
m_btnPause.EnableWindow(FALSE);
m_btnPause.SetWindowText(_T("&Pause"));
}
}
void CMCISampleDlg::OnSelchangeTrackselect()
{
UpdateData();
m_nTrackToPlay =
(m_strTrack.GetAt(0)-'0')*10 +
(m_strTrack.GetAt(1)-'0');
// Seek to the selected track
if (m_nTrackToPlay > 0)
m_CdAudio.Seek(CTmsf(m_nTrackToPlay, 0, 0, 0));
}
//关闭
void CMCISampleDlg::OnClose()
{
//停止并关闭CD音频
if (m_CdAudio.IsReady()) {
m_CdAudio.Stop();
m_CdAudio.Close();
}
CDialog::OnClose();
}
void CMCISampleDlg::OnPause()
{
if (m_CdAudio.GetMode() == CCdAudio::ModePlay) {
//暂停播放
if (!m_CdAudio.Pause()) {
m_wndStatus.SetWindowText(_T("Paused"));
m_btnPause.SetWindowText(_T("&Resume"));
}
}
else {
//从当前位置重新恢复播放
if (!m_CdAudio.Play(m_CdAudio.GetCurrentPos(), m_tmsfTo))
m_btnPause.SetWindowText(_T("&Pause"));
m_wndStatus.SetWindowText(_T("Playing..."));
}
}
void CMCISampleDlg::OnEject()
{
// 打开/关闭CD光驱
m_CdAudio.OpenDoor(m_CdAudio.IsReady());
m_btnPause.SetWindowText(_T("&Pause"));
BOOL bReady = m_CdAudio.IsReady();
EnableControls(bReady, bReady);
}
// 当新CD插入时执行的函数
BOOL CMCISampleDlg::OnDeviceChange( UINT nEventType, DWORD dwData ) {
DEV_BROADCAST_HDR *pdbch = (DEV_BROADCAST_HDR *) dwData;
switch(nEventType) {
case DBT_DEVICEARRIVAL: // CD drawer was closed
if (pdbch->dbch_devicetype == DBT_DEVTYP_VOLUME) {
PDEV_BROADCAST_VOLUME pdbcv =
(PDEV_BROADCAST_VOLUME) dwData;
if (pdbcv->dbcv_flags == DBTF_MEDIA)
{
TCHAR szDrive[4];
// pdbcv->unitmask contains the drive bits
for (UINT i=0; !(pdbcv->dbcv_unitmask & (1<<i)); i++);
wsprintf(szDrive, _T("%c:\\"), 'A'+i);
if (GetDriveType(szDrive) == DRIVE_CDROM) {
UpdateControls();
}
}
else {
//处理网络驱动器
}
break;
}
case DBT_DEVICEREMOVECOMPLETE:
EnableControls(FALSE, FALSE);
break;
}
return TRUE;
}
void CMCISampleDlg::EnableControls(BOOL bEnablePlay,
BOOL bEnableStop /* =TRUE*/)
{
m_comboTrack.EnableWindow(bEnablePlay);
m_btnPlay.EnableWindow(bEnablePlay);
m_btnStop.EnableWindow(bEnableStop);
m_btnPause.EnableWindow(bEnableStop);
}
// 对话框控件更新
void CMCISampleDlg::UpdateControls() {
//取得CD上可播放曲目的序号
DWORD n = m_CdAudio.GetNumberOfTracks();
m_comboTrack.ResetContent();
CString s;
CMsf msf;
for (UINT i=1; i<=n; i++) {
msf = m_CdAudio.GetTrackLength(i);
if (m_CdAudio.GetTrackType(i) == CCdAudio::TrackTypeAudio) {
s.Format(_T("%02d (%02d\':%02d\")"), i,
msf.GetMinute(), msf.GetSecond());
m_comboTrack.AddString(s);
}
}
//选择第一个曲目
m_comboTrack.SetCurSel(0);
BOOL bCanPlay = m_comboTrack.GetCount() != 0;
EnableControls(bCanPlay, FALSE);
UpdateData();
}
LONG CMCISampleDlg::OnMciNotify(UINT wFlags, LONG lDevId) {
switch(wFlags) {
case MCI_NOTIFY_SUCCESSFUL:
m_wndStatus.SetWindowText(_T("Playback completed"));
break;
case MCI_NOTIFY_FAILURE:
m_wndStatus.SetWindowText(_T("Playback interrupted!"));
break;
case MCI_NOTIFY_SUPERSEDED:
m_wndStatus.SetWindowText(_T("Playback stopped!"));
break;
}
return 0L;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -