MULTIM~2.CPP
上传用户:lianyisd
上传日期:2019-11-03
资源大小:5188k
文件大小:12k
源码类别:

midi

开发平台:

Visual C++

  1. // MultimediaDlg.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "Multimedia.h"
  5. #include "MultimediaDlg.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. // CMultimediaDlg dialog
  50. CMultimediaDlg::CMultimediaDlg(CWnd* pParent /*=NULL*/)
  51. : CDialog(CMultimediaDlg::IDD, pParent)
  52. {
  53. //{{AFX_DATA_INIT(CMultimediaDlg)
  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. fileOpen = false;
  59. count = 0;
  60. }
  61. void CMultimediaDlg::DoDataExchange(CDataExchange* pDX)
  62. {
  63. CDialog::DoDataExchange(pDX);
  64. //{{AFX_DATA_MAP(CMultimediaDlg)
  65. DDX_Control(pDX, IDC_SLIDER2, m_ctrlVolume);
  66. DDX_Control(pDX, IDC_EXIT, m_exitButton);
  67. DDX_Control(pDX, IDC_PAUSE, m_pauseButton);
  68. DDX_Control(pDX, IDC_OPEN, m_openButton);
  69. DDX_Control(pDX, IDC_STOP, m_stopButton);
  70. DDX_Control(pDX, IDC_PLAY, m_playButton);
  71. DDX_Control(pDX, IDC_ACTIVEMOVIECONTROL1, m_activeMovie);
  72. //}}AFX_DATA_MAP
  73. }
  74. BEGIN_MESSAGE_MAP(CMultimediaDlg, CDialog)
  75. //{{AFX_MSG_MAP(CMultimediaDlg)
  76. ON_WM_SYSCOMMAND()
  77. ON_WM_PAINT()
  78. ON_WM_QUERYDRAGICON()
  79. ON_BN_CLICKED(IDC_PLAY, OnPlay)
  80. ON_BN_CLICKED(IDC_EXIT, OnExit)
  81. ON_BN_CLICKED(IDC_OPEN, OnOpen)
  82. ON_BN_CLICKED(IDC_PAUSE, OnPause)
  83. ON_BN_CLICKED(IDC_STOP, OnStop)
  84. ON_WM_TIMER()
  85. ON_COMMAND(ID_MENUITEM_RECORD, OnMenuitemRecord)
  86. ON_COMMAND(ID_MENUITEM_SAVE, OnMenuitemSave)
  87. ON_WM_VSCROLL()
  88. ON_COMMAND(ID_MENUITEM_REPLAY, OnMenuitemReplay)
  89. ON_COMMAND(ID_MENUITEM_OPENCD, OnMenuitemOpencd)
  90. ON_COMMAND(ID_MENUITEM_CLOSECD, OnMenuitemClosecd)
  91. //}}AFX_MSG_MAP
  92. END_MESSAGE_MAP()
  93. /////////////////////////////////////////////////////////////////////////////
  94. // CMultimediaDlg message handlers
  95. int static strPartDim[4]= {200, 350, 450, -1};//StatusBar
  96. BOOL CMultimediaDlg::OnInitDialog()
  97. {
  98. CDialog::OnInitDialog();
  99. // Add "About..." menu item to system menu.
  100. // IDM_ABOUTBOX must be in the system command range.
  101. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  102. ASSERT(IDM_ABOUTBOX < 0xF000);
  103. CMenu* pSysMenu = GetSystemMenu(FALSE);
  104. if (pSysMenu != NULL)
  105. {
  106. CString strAboutMenu;
  107. strAboutMenu.LoadString(IDS_ABOUTBOX);
  108. if (!strAboutMenu.IsEmpty())
  109. {
  110. pSysMenu->AppendMenu(MF_SEPARATOR);
  111. pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  112. }
  113. }
  114. // Set the icon for this dialog.  The framework does this automatically
  115. //  when the application's main window is not a dialog
  116. SetIcon(m_hIcon, TRUE); // Set big icon
  117. SetIcon(m_hIcon, FALSE); // Set small icon
  118. // TODO: Add extra initialization here
  119. //为按钮加载位图
  120. m_hBmp = ::LoadBitmap(HINSTANCE(GetModuleHandle(0)),MAKEINTRESOURCE(IDB_PLAY));
  121. m_playButton.SetBitmap(m_hBmp);
  122. m_hBmp = ::LoadBitmap(HINSTANCE(GetModuleHandle(0)),MAKEINTRESOURCE(IDB_STOP));
  123. m_stopButton.SetBitmap(m_hBmp);
  124. m_hBmp = ::LoadBitmap(HINSTANCE(GetModuleHandle(0)),MAKEINTRESOURCE(IDB_OPEN));
  125. m_openButton.SetBitmap(m_hBmp);
  126. m_hBmp = ::LoadBitmap(HINSTANCE(GetModuleHandle(0)),MAKEINTRESOURCE(IDB_PAUSE));
  127. m_pauseButton.SetBitmap(m_hBmp);
  128. m_hBmp = ::LoadBitmap(HINSTANCE(GetModuleHandle(0)),MAKEINTRESOURCE(IDB_EXIT));
  129. m_exitButton.SetBitmap(m_hBmp);
  130. //状态条控件初始化
  131. m_wndStatusBar.Create(WS_CHILD|WS_VISIBLE|CCS_BOTTOM|CCS_NODIVIDER,CRect(0,0,0,0),this,102);
  132. m_wndStatusBar.SetParts(4,strPartDim);
  133. m_wndStatusBar.SetText("当前无文件播放",0,0);
  134. m_wndStatusBar.SetText("时间",1,0);
  135. m_wndStatusBar.SetText("Computer74",2,0);
  136. //为菜单项加载位图
  137. pMainMenu = GetMenu();
  138. pSubMenu = pMainMenu->GetSubMenu(0);
  139. m_bmp[0].LoadBitmap(IDB_MOPEN);
  140. pSubMenu->SetMenuItemBitmaps(IDC_OPEN,MF_BYCOMMAND,&m_bmp[0],&m_bmp[0]);
  141. m_bmp[1].LoadBitmap(IDB_MSAVE);
  142. pSubMenu->SetMenuItemBitmaps(ID_MENUITEM_SAVE,MF_BYCOMMAND,&m_bmp[1],&m_bmp[1]);
  143. m_bmp[2].LoadBitmap(IDB_MEXIT);
  144. pSubMenu->SetMenuItemBitmaps(IDC_EXIT,MF_BYCOMMAND,&m_bmp[2],&m_bmp[2]);
  145. //柱状音效显示控件初始化
  146. CRect rect;
  147. GetDlgItem(IDC_STATIC_HISTOGRAM)->GetWindowRect(rect);
  148. ScreenToClient(rect);
  149. m_HistogramCtrl.Create(WS_VISIBLE | WS_CHILD, rect, this, 100);
  150. m_HistogramCtrl.SetRange(0,100);
  151. //滑块控件初始化
  152. pMasterVolume = (IVolume*)(new CVolumeOutMaster());
  153. m_ctrlVolume.SetRange(pMasterVolume->GetMinimalVolume(),30000);
  154. m_ctrlVolume.SetLineSize(1000);
  155. m_ctrlVolume.SetPageSize(5000);
  156. m_ctrlVolume.SetTicFreq(1000);
  157. m_ctrlVolume.SetPos(3000);
  158. SetVolume(3000);
  159. return TRUE;  // return TRUE  unless you set the focus to a control
  160. }
  161. void CMultimediaDlg::OnSysCommand(UINT nID, LPARAM lParam)
  162. {
  163. if ((nID & 0xFFF0) == IDM_ABOUTBOX)
  164. {
  165. CAboutDlg dlgAbout;
  166. dlgAbout.DoModal();
  167. }
  168. else
  169. {
  170. CDialog::OnSysCommand(nID, lParam);
  171. }
  172. }
  173. // If you add a minimize button to your dialog, you will need the code below
  174. //  to draw the icon.  For MFC applications using the document/view model,
  175. //  this is automatically done for you by the framework.
  176. void CMultimediaDlg::OnPaint() 
  177. {
  178. if (IsIconic())
  179. {
  180. CPaintDC dc(this); // device context for painting
  181. SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
  182. // Center icon in client rectangle
  183. int cxIcon = GetSystemMetrics(SM_CXICON);
  184. int cyIcon = GetSystemMetrics(SM_CYICON);
  185. CRect rect;
  186. GetClientRect(&rect);
  187. int x = (rect.Width() - cxIcon + 1) / 2;
  188. int y = (rect.Height() - cyIcon + 1) / 2;
  189. // Draw the icon
  190. dc.DrawIcon(x, y, m_hIcon);
  191. }
  192. else
  193. {
  194. CDialog::OnPaint();
  195. }
  196. }
  197. // The system calls this to obtain the cursor to display while the user drags
  198. //  the minimized window.
  199. HCURSOR CMultimediaDlg::OnQueryDragIcon()
  200. {
  201. return (HCURSOR) m_hIcon;
  202. }
  203. void CMultimediaDlg::OnPlay() 
  204. {
  205. //按钮事件,播放媒体文件
  206. // TODO: Add your control notification handler code here
  207. if(fileOpen)
  208. {
  209. m_media.Play(this,pFileName);
  210. SetTimer(1,250,NULL);
  211. }
  212. }
  213. BOOL CMultimediaDlg::DestroyWindow() 
  214. {
  215. // TODO: Add your specialized code here and/or call the base class
  216. DeleteObject(m_hBmp);
  217. return CDialog::DestroyWindow();
  218. }
  219. void CMultimediaDlg::OnExit() 
  220. {
  221. //按钮事件,关闭设备并退出程序
  222. // TODO: Add your control notification handler code here
  223. m_media.CloseDevice();
  224. KillTimer(1);
  225. OnOK();
  226. }
  227. void CMultimediaDlg::OnOpen() 
  228. {
  229. //按钮事件,打开设备
  230. // TODO: Add your control notification handler code here
  231. CFileDialog dlg(TRUE, "midi", "*.mid",OFN_HIDEREADONLY 
  232. | OFN_OVERWRITEPROMPT,"Midi Files(*.mid)|*.mid|Wave Files(*.wav)|*.wav|AVI Files(*.AVI)|*.AVI|All Files(*.*)|*.*||");
  233. if(dlg.DoModal() == IDOK)
  234. {
  235. pFileName = dlg.GetPathName();
  236. pFileExt = dlg.GetFileExt();
  237. m_media.OpenDevice((LPCTSTR)pFileName,(LPCSTR)pFileExt);
  238. fileOpen = true;
  239. m_wndStatusBar.SetText(pFileName,0,0);
  240. }
  241. }
  242. void CMultimediaDlg::OnPause() 
  243. {
  244. //按钮事件,暂停文件的播放
  245. // TODO: Add your control notification handler code here
  246. if(fileOpen)
  247. {
  248. m_media.Pause();
  249. KillTimer(1);
  250. }
  251. }
  252. void CMultimediaDlg::OnStop() 
  253. {
  254. //按钮事件,停止文件的播放
  255. // TODO: Add your control notification handler code here
  256. if(fileOpen)
  257. {
  258. m_media.Stop();
  259. KillTimer(1);
  260. m_HistogramCtrl.InvalidateCtrl();
  261. count = 0;
  262. }
  263. }
  264. void CMultimediaDlg::OnTimer(UINT nIDEvent) 
  265. {
  266. //定时器响应,显示柱状音效和已播放过的时间
  267. // TODO: Add your message handler code here and/or call default
  268. CTime t = CTime::GetCurrentTime();
  269. int nRandom;
  270. srand(t.GetSecond());
  271. do
  272. {
  273. nRandom = rand();
  274. } while (nRandom < 0 || nRandom > 100);
  275. m_HistogramCtrl.SetPos(nRandom);
  276. nIDEvent=10;
  277. CString TimeCon,Min,Sec;
  278. char temp[10];
  279. count ++;
  280. _itoa(count/4/60,temp,10);
  281. Min = (CString)temp;
  282. TimeCon = "时间  " + Min + " 分";
  283. _itoa(count/4%60,temp,10);
  284. Sec = (CString)temp;
  285. TimeCon = TimeCon + Sec + " 秒";
  286. m_wndStatusBar.SetText(TimeCon,1,0);
  287. CDialog::OnTimer(nIDEvent);
  288. }
  289. void CMultimediaDlg::OnMenuitemRecord() 
  290. {
  291. //菜单事件,开始录音
  292. // TODO: Add your command handler code here
  293. if(m_media.type == WAVE)
  294. {
  295. m_media.BeginRecord();
  296. }
  297. }
  298. void CMultimediaDlg::OnMenuitemSave() 
  299. {
  300. //菜单事件,保存录音段
  301. // TODO: Add your command handler code here
  302. if(m_media.type == WAVE)
  303. {
  304. CFileDialog dlg(TRUE, "wave", "*.wav",OFN_HIDEREADONLY 
  305. | OFN_OVERWRITEPROMPT,"Wave Files(*.wav)|*.wav|");
  306. if(dlg.DoModal() == IDOK)
  307. {
  308. m_media.SaveRecord(dlg.GetFileName());
  309. OnStop();
  310. }
  311. }
  312. }
  313. void CMultimediaDlg::SetVolume(DWORD dwValue)
  314. {
  315. //设定音量
  316. if ( !pMasterVolume || !pMasterVolume->IsAvailable() )
  317. {
  318. // handle error
  319. }
  320. pMasterVolume->Enable();
  321. pMasterVolume->RegisterNotificationSink( MasterVolumeChanged, dwValue );
  322. pMasterVolume->SetCurrentVolume( dwValue );
  323. //DWORD dwCurrentVolume = pMasterVolume->SetCurrentVolume(dwValue);
  324. }
  325. void CALLBACK MasterVolumeChanged( DWORD dwCurrentVolume, DWORD dwUserValue )
  326. {
  327. //音量设定的回调函数
  328. }
  329. void CMultimediaDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
  330. {
  331. //滑块事件
  332. // TODO: Add your message handler code here and/or call default
  333. int nNewPos = 0;
  334. switch(nSBCode)
  335. {
  336. case SB_TOP: //Scroll to far left.
  337. nNewPos = m_ctrlVolume.GetRangeMin();
  338. break;
  339. case SB_ENDSCROLL: //end scroll.
  340. return;
  341. case SB_LINELEFT: //Scroll left.
  342. nNewPos = m_ctrlVolume.GetPos() - m_ctrlVolume.GetLineSize();
  343. break;
  344. case SB_LINERIGHT: //Scroll right.
  345. nNewPos = m_ctrlVolume.GetPos() + m_ctrlVolume.GetLineSize();
  346. break;
  347. case SB_PAGELEFT: //Scroll one page left.
  348. nNewPos = m_ctrlVolume.GetPos() - m_ctrlVolume.GetPageSize();
  349. break;
  350. case SB_PAGERIGHT: //Scroll one page right.
  351. nNewPos = m_ctrlVolume.GetPos() + m_ctrlVolume.GetPageSize();
  352. break;
  353. case SB_BOTTOM: //Scroll to far right.
  354. nNewPos = m_ctrlVolume.GetRangeMax();
  355. break;
  356. case SB_THUMBPOSITION: //Scroll to absolute position. The current position is specified by the nPos parameter.
  357. nNewPos = nPos;
  358. break;
  359. case SB_THUMBTRACK: //rag scroll box to specified position. The current position is specified by the 
  360. nNewPos = nPos;
  361. break;
  362. }
  363. nNewPos = max(nNewPos, m_ctrlVolume.GetRangeMin());
  364. nNewPos = min(nNewPos, m_ctrlVolume.GetRangeMax());
  365. SetVolume(nNewPos);
  366. CDialog::OnVScroll(nSBCode, nPos, pScrollBar);
  367. }
  368. void CMultimediaDlg::OnMenuitemReplay() 
  369. {
  370. //菜单函数,重新播放文件
  371. // TODO: Add your command handler code here
  372. if(fileOpen)
  373. {
  374. m_media.paused = false;
  375. m_media.Play(this,pFileName);
  376. SetTimer(1,250,NULL);
  377. }
  378. }
  379. void CMultimediaDlg::OnMenuitemOpencd() 
  380. {
  381. //菜单函数,开光驱门
  382. // TODO: Add your command handler code here
  383. m_media.OpenCDRom();
  384. }
  385. void CMultimediaDlg::OnMenuitemClosecd() 
  386. {
  387. //菜单函数,关光驱门
  388. // TODO: Add your command handler code here
  389. m_media.CloseCDRom();
  390. }