MyCDPlayerDlg.cpp
上传用户:sdpcwz
上传日期:2009-12-14
资源大小:1237k
文件大小:9k
源码类别:

书籍源码

开发平台:

Visual C++

  1. // MyCDPlayerDlg.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "MyCDPlayer.h"
  5. #include "MyCDPlayerDlg.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. /////////////////////////////////////////////////////////////////////////////
  12. // CAboutDlg dialog used for App About
  13. class CAboutDlg : public CDialog
  14. {
  15. public:
  16. CAboutDlg();
  17. // Dialog Data
  18. //{{AFX_DATA(CAboutDlg)
  19. enum { IDD = IDD_ABOUTBOX };
  20. //}}AFX_DATA
  21. // ClassWizard generated virtual function overrides
  22. //{{AFX_VIRTUAL(CAboutDlg)
  23. protected:
  24. virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
  25. //}}AFX_VIRTUAL
  26. // Implementation
  27. protected:
  28. //{{AFX_MSG(CAboutDlg)
  29. //}}AFX_MSG
  30. DECLARE_MESSAGE_MAP()
  31. };
  32. CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
  33. {
  34. //{{AFX_DATA_INIT(CAboutDlg)
  35. //}}AFX_DATA_INIT
  36. }
  37. void CAboutDlg::DoDataExchange(CDataExchange* pDX)
  38. {
  39. CDialog::DoDataExchange(pDX);
  40. //{{AFX_DATA_MAP(CAboutDlg)
  41. //}}AFX_DATA_MAP
  42. }
  43. BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
  44. //{{AFX_MSG_MAP(CAboutDlg)
  45. // No message handlers
  46. //}}AFX_MSG_MAP
  47. END_MESSAGE_MAP()
  48. /////////////////////////////////////////////////////////////////////////////
  49. // CMyCDPlayerDlg dialog
  50. CMyCDPlayerDlg::CMyCDPlayerDlg(CWnd* pParent /*=NULL*/)
  51. : CDialog(CMyCDPlayerDlg::IDD, pParent)
  52. {
  53. //{{AFX_DATA_INIT(CMyCDPlayerDlg)
  54. // NOTE: the ClassWizard will add member initialization here
  55. //}}AFX_DATA_INIT
  56. // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
  57. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  58. }
  59. void CMyCDPlayerDlg::DoDataExchange(CDataExchange* pDX)
  60. {
  61. CDialog::DoDataExchange(pDX);
  62. //{{AFX_DATA_MAP(CMyCDPlayerDlg)
  63. DDX_Control(pDX, IDC_MUSIC_LIST, m_lstMusics);
  64. //}}AFX_DATA_MAP
  65. }
  66. BEGIN_MESSAGE_MAP(CMyCDPlayerDlg, CDialog)
  67. //{{AFX_MSG_MAP(CMyCDPlayerDlg)
  68. ON_WM_SYSCOMMAND()
  69. ON_WM_PAINT()
  70. ON_WM_QUERYDRAGICON()
  71. ON_WM_TIMER()
  72. ON_BN_CLICKED(IDC_PLAY, OnPlay)
  73. ON_BN_CLICKED(IDC_STOP, OnStop)
  74. ON_BN_CLICKED(IDC_PAUSE, OnPause)
  75. ON_BN_CLICKED(IDC_FORWARD, OnForward)
  76. ON_BN_CLICKED(IDC_BACK, OnBack)
  77. ON_BN_CLICKED(IDC_SKIPBACK, OnSkipback)
  78. ON_BN_CLICKED(IDC_SKIPFORWARD, OnSkipforward)
  79. ON_CBN_SELCHANGE(IDC_MUSIC_LIST, OnSelchangeMusicList)
  80. ON_WM_DESTROY()
  81. //}}AFX_MSG_MAP
  82. END_MESSAGE_MAP()
  83. /////////////////////////////////////////////////////////////////////////////
  84. // CMyCDPlayerDlg message handlers
  85. BOOL CMyCDPlayerDlg::OnInitDialog()
  86. {
  87. CDialog::OnInitDialog();
  88. // Add "About..." menu item to system menu.
  89. // IDM_ABOUTBOX must be in the system command range.
  90. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  91. ASSERT(IDM_ABOUTBOX < 0xF000);
  92. CMenu* pSysMenu = GetSystemMenu(FALSE);
  93. if (pSysMenu != NULL)
  94. {
  95. CString strAboutMenu;
  96. strAboutMenu.LoadString(IDS_ABOUTBOX);
  97. if (!strAboutMenu.IsEmpty())
  98. {
  99. pSysMenu->AppendMenu(MF_SEPARATOR);
  100. pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  101. }
  102. }
  103. // Set the icon for this dialog.  The framework does this automatically
  104. //  when the application's main window is not a dialog
  105. SetIcon(m_hIcon, TRUE); // Set big icon
  106. SetIcon(m_hIcon, FALSE); // Set small icon
  107. // TODO: Add extra initialization here
  108. //打开设备
  109. m_CDAudio.Open();
  110. //创建一个定时器
  111. SetTimer( 1, 1000, NULL );
  112. //将曲目加到CComboBox控件中
  113. for(int i=0;i<m_CDAudio.GetTotalTracks();i++)
  114. {
  115. CString str;
  116. str.Format("曲目%d",i+1);
  117. m_lstMusics.AddString(str);
  118. }
  119. m_lstMusics.SetCurSel(0);
  120. return TRUE;  // return TRUE  unless you set the focus to a control
  121. }
  122. void CMyCDPlayerDlg::OnSysCommand(UINT nID, LPARAM lParam)
  123. {
  124. if ((nID & 0xFFF0) == IDM_ABOUTBOX)
  125. {
  126. CAboutDlg dlgAbout;
  127. dlgAbout.DoModal();
  128. }
  129. else
  130. {
  131. CDialog::OnSysCommand(nID, lParam);
  132. }
  133. }
  134. // If you add a minimize button to your dialog, you will need the code below
  135. //  to draw the icon.  For MFC applications using the document/view model,
  136. //  this is automatically done for you by the framework.
  137. void CMyCDPlayerDlg::OnPaint() 
  138. {
  139. if (IsIconic())
  140. {
  141. CPaintDC dc(this); // device context for painting
  142. SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
  143. // Center icon in client rectangle
  144. int cxIcon = GetSystemMetrics(SM_CXICON);
  145. int cyIcon = GetSystemMetrics(SM_CYICON);
  146. CRect rect;
  147. GetClientRect(&rect);
  148. int x = (rect.Width() - cxIcon + 1) / 2;
  149. int y = (rect.Height() - cyIcon + 1) / 2;
  150. // Draw the icon
  151. dc.DrawIcon(x, y, m_hIcon);
  152. }
  153. else
  154. {
  155. CDialog::OnPaint();
  156. }
  157. }
  158. // The system calls this to obtain the cursor to display while the user drags
  159. //  the minimized window.
  160. HCURSOR CMyCDPlayerDlg::OnQueryDragIcon()
  161. {
  162. return (HCURSOR) m_hIcon;
  163. }
  164. void CMyCDPlayerDlg::OnDestroy() 
  165. {
  166. //杀掉定时器
  167. KillTimer(1);
  168. CDialog::OnDestroy();
  169. }
  170. void CMyCDPlayerDlg::OnTimer(UINT nIDEvent) 
  171. {
  172. BOOL bDriveReady = TRUE;
  173. //获得当前曲目已经播放的时间,并显示
  174. CString strStatus;
  175. strStatus.Format( "[%d] %02d:%02d",
  176. m_CDAudio.GetCurrentTrack(),
  177. m_CDAudio.GetMinutes(),
  178. m_CDAudio.GetSeconds() );
  179. //没有CD
  180. if( m_CDAudio.GetCurrentTrack() == -1 ){
  181. strStatus = "没有CD";
  182. bDriveReady = FALSE;
  183. }
  184. SetDlgItemText( IDC_TRACKINFO, strStatus );
  185. //获得CD的总共长度,并显示
  186. CString strLength;
  187. int nMinutes, nSeconds;
  188. m_CDAudio.GetTotalLength( &nMinutes,
  189. &nSeconds );
  190. strLength.Format( "总共长度(m:s): %02d:%02d",
  191. nMinutes, nSeconds );
  192. if( nMinutes == -1 )
  193. strLength = "总共长度(m:s): 00:00";
  194. SetDlgItemText( IDC_TOTALTIME, strLength );
  195. //获得当前们曲目长度,并显示
  196. m_CDAudio.GetTrackLength(
  197. m_CDAudio.GetCurrentTrack(),
  198. &nMinutes, &nSeconds );
  199. strLength.Format( "曲目长度(m:s): %02d:%02d",
  200. nMinutes, nSeconds );
  201. if( nMinutes == -1 )
  202. strLength = "曲目长度(m:s): 00:00";
  203. SetDlgItemText( IDC_TRACKTIME, strLength );
  204. //根据播放状态改变按钮的可用与不可用状态
  205. CWnd *pWnd;
  206. pWnd = GetDlgItem( IDC_BACK );
  207. pWnd->EnableWindow( bDriveReady );
  208. pWnd = GetDlgItem( IDC_FORWARD );
  209. pWnd->EnableWindow( bDriveReady );
  210. pWnd = GetDlgItem( IDC_SKIPBACK );
  211. pWnd->EnableWindow( bDriveReady );
  212. pWnd = GetDlgItem( IDC_SKIPFORWARD );
  213. pWnd->EnableWindow( bDriveReady );
  214. BOOL bPaused;
  215. if( m_CDAudio.IsPlaying( &bPaused ) ){
  216. pWnd = GetDlgItem( IDC_PLAY );
  217. pWnd->EnableWindow( bPaused );
  218. pWnd = GetDlgItem( IDC_STOP );
  219. pWnd->EnableWindow( bDriveReady );
  220. pWnd = GetDlgItem( IDC_PAUSE );
  221. pWnd->EnableWindow( bDriveReady && !bPaused );
  222. }
  223. else{
  224. pWnd = GetDlgItem( IDC_PLAY );
  225. pWnd->EnableWindow( bDriveReady );
  226. pWnd = GetDlgItem( IDC_STOP );
  227. pWnd->EnableWindow( FALSE );
  228. pWnd = GetDlgItem( IDC_PAUSE );
  229. pWnd->EnableWindow( FALSE );
  230. }
  231. CDialog::OnTimer(nIDEvent);
  232. }
  233. void CMyCDPlayerDlg::OnPlay() 
  234. {
  235. // 如果光驱中的CD已经准备好就播放
  236. if( m_CDAudio.IsDriveReady() )
  237. m_CDAudio.Play();
  238. }
  239. void CMyCDPlayerDlg::OnStop() 
  240. {
  241. // 停止播放
  242. m_CDAudio.Stop();
  243. }
  244. void CMyCDPlayerDlg::OnPause() 
  245. {
  246. // 暂停播放
  247. m_CDAudio.Pause();
  248. }
  249. void CMyCDPlayerDlg::OnForward() 
  250. {
  251. // 获得当前曲目的播放长度
  252. int nMinutes = m_CDAudio.GetMinutes();
  253. int nSeconds = m_CDAudio.GetSeconds();
  254. int nTrack = m_CDAudio.GetCurrentTrack();
  255. if( nMinutes == -1 )
  256. return;
  257. //向前跳跃5秒,保证没有出界
  258. nSeconds += 5;
  259. if( nSeconds > 59 ){
  260. nMinutes++;
  261. nSeconds -= 60;
  262. }
  263. int nTrackMinutes, nTrackSeconds;
  264. m_CDAudio.GetTrackLength( nTrack,
  265. &nTrackMinutes, &nTrackSeconds );
  266. if( nMinutes * 60 + nSeconds >
  267. nTrackMinutes * 60 + nTrackSeconds ){
  268. nMinutes = nTrackMinutes;
  269. nSeconds = nTrackSeconds;
  270. }
  271. //定位到新的位置
  272. m_CDAudio.SeekTo( nTrack,
  273. nMinutes, nSeconds, 0 );
  274. }
  275. void CMyCDPlayerDlg::OnBack() 
  276. {
  277. // 获得当前曲目的播放长度
  278. int nMinutes = m_CDAudio.GetMinutes();
  279. int nSeconds = m_CDAudio.GetSeconds();
  280. int nTrack = m_CDAudio.GetCurrentTrack();
  281. if( nMinutes == -1 )
  282. return;
  283. //向前跳跃5秒,保证没有出界
  284. nSeconds -= 5;
  285. if( nSeconds < 0 ){
  286. nMinutes--;
  287. nSeconds += 60;
  288. if( nMinutes < 0 )
  289. nMinutes = 0;
  290. }
  291. //定位到新的位置
  292. m_CDAudio.SeekTo( nTrack,
  293. nMinutes, nSeconds, 0 );
  294. }
  295. void CMyCDPlayerDlg::OnSkipback() 
  296. {
  297. //向后跳跃一个曲目
  298. int nTrack = m_CDAudio.GetCurrentTrack() - 1;
  299. if( nTrack < 1 )
  300. nTrack = m_CDAudio.GetTotalTracks();
  301. m_CDAudio.SeekTo( nTrack, 0, 0, 0 );
  302. }
  303. void CMyCDPlayerDlg::OnSkipforward() 
  304. {
  305. //向前跳跃一个曲目
  306. int nTrack = m_CDAudio.GetCurrentTrack() + 1;
  307. if( nTrack > m_CDAudio.GetTotalTracks() )
  308. nTrack = 1;
  309. m_CDAudio.SeekTo( nTrack, 0, 0, 0 );
  310. }
  311. void CMyCDPlayerDlg::OnSelchangeMusicList() 
  312. {
  313. //当CComboBox的曲目选择改变时,播放被选择曲目
  314. int nSelTrack = m_lstMusics.GetCurSel();
  315. m_CDAudio.SeekTo(nSelTrack+1,0,0,0);
  316. }