VC:制作视频播放器(ActiveX控件、工具栏、菜单栏、滑块、打开对话框))

时间:2022-08-03 10:13:48

1、先把文件AMOVIE.OCX复制到某一目录下,例如D:\下,然后选择“开始”|“运行”命令,输入“regsvr32D:\AMOVIE.OCX”,单击“确定”按钮后,弹出对话框,显示注册成功。

2、利用类向导,创建一个基于对话框的应用程序,删除向导自动生成的确定、取消按钮。选择Project?ADD。。。添加ActiveMovie Control Object选项。

3、单击Insert按钮,关闭该对话框,ActiveMovie控件便出现在控件面板中,调整好控件在对话框中的位置。

4、添加菜单资源。。

5、添加工具栏。。。

6、添加滑块控件,及变量。。。

系统实现:

1、设置对话框的最小化,对话框属性对话框中选择Style标签。

2、添加工具栏。在OnInitDialog()函数中:

      

       if (!m_toolbar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_ALIGN_BOTTOM

              |CBRS_TOOLTIPS ) ||

              !m_toolbar.LoadToolBar(IDR_TOOLBAR1))

       {

              TRACE0("Failed to create toolbar\n");

              return -1;      // fail to create

       }

       RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0);

       m_toolbar.SetBarStyle(m_toolbar.GetBarStyle()|CBRS_BOTTOM|CBRS_SIZE_DYNAMIC|CBRS_SIZE_DYNAMIC);

3、利用类向导,添加“WM_SIZE”的消息映射:

void CVideoDlg::OnSize(UINT nType, int cx, int cy)

{

       CDialog::OnSize(nType, cx, cy);

       // TODO: Add your message handler code here

       //工具栏处在对话框的下端

       RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);

 

//为了使滑块控件也可以一直显示在对话框的最下端位置

       CRect rect;

       GetClientRect(rect);//得到客户端

       int top=rect.top;

       rect.top=rect.bottom-60;

       rect.bottom=rect.top+30;

       if (IsWindow(m_sliderctrl.GetSafeHwnd()))

       {

              m_sliderctrl.MoveWindow(rect);//设置窗口大小

       }

}

4、下面对菜单进行控制,在对话框中的菜单资源是利用对话框属性在对话框中进行绑定的,这时的菜单资源仅仅是与对话框进行绑定。它不能响应ON_UPDATE_COMMAND_UI消息。为了响应这一事件,

需要首先重载ON_WM_INITMENUPOPUP()消息。

void CVideoDlg::OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu)

{

       CDialog::OnInitMenuPopup(pPopupMenu, nIndex, bSysMenu);

      

       // TODO: Add your message handler code here

              ASSERT(pPopupMenu != NULL);

       // Check the enabled state of various menu items.

       CCmdUI state;

       state.m_pMenu = pPopupMenu;

       ASSERT(state.m_pOther == NULL);

       ASSERT(state.m_pParentMenu == NULL);

       // Determine if menu is popup in top-level menu and set m_pOther to

       // it if so (m_pParentMenu == NULL indicates that it is secondary popup).

       HMENU hParentMenu;

       if (AfxGetThreadState()->m_hTrackingMenu == pPopupMenu->m_hMenu)

              state.m_pParentMenu = pPopupMenu; // Parent == child for tracking popup.

       else if ((hParentMenu = ::GetMenu(m_hWnd)) != NULL)

       {

              CWnd* pParent = this;

              // Child windows don't have menus--need to go to the top!

              if (pParent != NULL &&(hParentMenu = ::GetMenu(pParent->m_hWnd)) != NULL)

              {

                     int nIndexMax = ::GetMenuItemCount(hParentMenu);

                     for (int nIndex = 0; nIndex < nIndexMax; nIndex++)

                     {

                            if (::GetSubMenu(hParentMenu, nIndex) == pPopupMenu->m_hMenu)

                            {

                                   // When popup is found, m_pParentMenu is containing menu.

                                   state.m_pParentMenu = CMenu::FromHandle(hParentMenu);

                                   break;

                            }

                     }

              }

       }

       state.m_nIndexMax = pPopupMenu->GetMenuItemCount();

       for (state.m_nIndex = 0; state.m_nIndex < state.m_nIndexMax;state.m_nIndex++)

       {

              state.m_nID = pPopupMenu->GetMenuItemID(state.m_nIndex);

              if (state.m_nID == 0)

                     continue; // Menu separator or invalid cmd - ignore it.

              ASSERT(state.m_pOther == NULL);

              ASSERT(state.m_pMenu != NULL);

              if (state.m_nID == (UINT)-1)

              {

                     // Possibly a popup menu, route to first item of that popup.

                     state.m_pSubMenu = pPopupMenu->GetSubMenu(state.m_nIndex);

                     if (state.m_pSubMenu == NULL ||

                            (state.m_nID = state.m_pSubMenu->GetMenuItemID(0)) == 0 ||

                            state.m_nID == (UINT)-1)

                     {

                            continue; // First item of popup can't be routed to.

                     }

                     state.DoUpdate(this, TRUE); // Popups are never auto disabled.

              }

              else

              {

                     // Normal menu item.

                     // Auto enable/disable if frame window has m_bAutoMenuEnable

                     // set and command is _not_ a system command.

                     state.m_pSubMenu = NULL;

                     state.DoUpdate(this, FALSE);

              }

              // Adjust for menu deletions and additions.

              UINT nCount = pPopupMenu->GetMenuItemCount();

              if (nCount < state.m_nIndexMax)

              {

                     state.m_nIndex -= (state.m_nIndexMax - nCount);

                     while (state.m_nIndex < nCount &&

                            pPopupMenu->GetMenuItemID(state.m_nIndex) == state.m_nID)

                     {

                            state.m_nIndex++;

                     }

              }

              state.m_nIndexMax = nCount;

       }

}

 

 

void CVideoDlg::OnUpdateStop(CCmdUI* pCmdUI)

{

       // TODO: Add your command update UI handler code here

       pCmdUI->Enable(flag);

}

 

6、为了使ActiveMovie控件进行播放,对ActiveMovie控件进行属性设置。

SelectionStart 0

ShowDisplay 真

ShowPositionContrls 真

ShowSelectionControls 假

ShowTracker 真

Volume真

等等。。。

7、利用类向导为ActiveMovie控件添加变量CActiveMovie m_play;添加文件打开消息映射:

void CVideoDlg::OnOpenFile()

{

       // TODO: Add your command handler code here

       CFileDialog FileDlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_ALLOWMULTISELECT|OFN_NOCHANGEDIR,

       "Video File(*.avi;*.asf;*.wmv;*.rm;*.rmvb)|*.avi;*.asf;*.wmv;*.rm;*.rmvb|Music Files(*.mp3;*.wav;*.cda)|*.mp3;*.wav;*.cda|Mpegvideo File(*.dat;*.mpg;*.mpeg)|*.dat;*.mpg;*.mpeg;*.mpe|");

       if(FileDlg.DoModal()==IDOK)

       {

              filename=FileDlg.GetPathName();

              m_player.SetFileName(filename);

              flag=true;

              toolbarctrl->EnableButton(IDM_PLAY,true);   

              toolbarctrl->EnableButton(IDM_PLAYPAUSE,true);  

              toolbarctrl->EnableButton(IDM_STOP,true);

              toolbarctrl->EnableButton(IDM_ADD_VOLUME,true);  

              toolbarctrl->EnableButton(IDM_SUB_VOLUME,true);  

             

              MoveMovieWindow();

      

       int iInstallresult;

       iInstallresult=SetTimer(1,1000,NULL);

       if(iInstallresult==0)

       {

              MessageBox("fail to install the timer!");

       }

       }

      

}

8、改变对话框的大小以适应ActiveMovie控件的大小:

void CVideoDlg::MoveMovieWindow()//改变窗口大小以适应控件大小

{

   CRect rc1,rc2,rc3;

   //得到ActiveMovie控件大小

   m_player.GetWindowRect(rc1);//保证对话框客户区的宽不小于300象素,高不小于225象素

   if(rc1.Width()<300||rc1.Height()<255)

   {

       rc1.right=rc1.left+300;

       rc1.bottom=rc1.top+225;

   }

   //获得对话框的大小

   GetWindowRect(rc2);

   //获得对话框客户区大小

    GetClientRect(rc3);

   //改变对话框大小以适应ActiveMovie控件大小

       MoveWindow(rc2.left,rc2.top,rc1.Width()+25,rc1.Height()+130);

 

       Invalidate(true);

}

 

9、暂停|播放:

void CVideoDlg::OnPlaypause()

{

       // TODO: Add your command handler code here

       if(playpause==false)

       {

              m_player.Pause();

              playpause=true;

       }

       else

       {

              m_player.Run();

              playpause=false;

       }

}

10、停止播放:

void CVideoDlg::OnStop()

{

       // TODO: Add your command handler code here

       m_player.Stop();

       flag=false;

       toolbarctrl->EnableButton(IDM_PLAYPAUSE,false);  

       toolbarctrl->EnableButton(IDM_STOP,false);

       toolbarctrl->EnableButton(IDM_ADD_VOLUME,false);  

       toolbarctrl->EnableButton(IDM_SUB_VOLUME,false);  

}

11、音量大小调整:

void CVideoDlg::OnAddVolume()

{

       // TODO: Add your command handler code here

       long m_Reduce = m_player.GetVolume();

       if(m_Reduce<0)

       {

              m_player.Pause();

              m_player.SetVolume(m_Reduce+100);

              m_player.Run();   

       }

}

void CVideoDlg::OnSubVolume()

{

       // TODO: Add your command handler code here

       long m_Reduce = m_player.GetVolume();

       if(m_Reduce>=-1500)

       {

              m_player.Pause();

              m_player.SetVolume(m_Reduce-100);

              m_player.Run();  

       }

}

12、选择视频大小:

void CVideoDlg::OnSizeFour()

{

       // TODO: Add your command handler code here

       m_player.Pause();

       m_player.SetFullScreenMode(false);

    m_player.SetMovieWindowSize(3);

    m_player.Run();

       num=3;

}

 

void CVideoDlg::OnUpdateSizeFour(CCmdUI* pCmdUI)

{

       // TODO: Add your command update UI handler code here

       pCmdUI->Enable(flag);

       if(num==3)

              pCmdUI->SetCheck(true);

       else

              pCmdUI->SetCheck(false);

}

 

void CVideoDlg::OnSizeSixten()

{

       // TODO: Add your command handler code here

       m_player.Pause();

       m_player.SetFullScreenMode(false);

    m_player.SetMovieWindowSize(2);

    m_player.Run();

       num=2;

      

}

 

void CVideoDlg::OnUpdateSizeSixten(CCmdUI* pCmdUI)

{

       // TODO: Add your command update UI handler code here

       pCmdUI->Enable(flag);

       if(num==2)

              pCmdUI->SetCheck(true);

       else

              pCmdUI->SetCheck(false);

}

 

void CVideoDlg::OnSizeTwo()

{

       // TODO: Add your command handler code here

       m_player.Pause();

       m_player.SetFullScreenMode(false);

    m_player.SetMovieWindowSize(4);

    m_player.Run();

       num=4;  

}

 

void CVideoDlg::OnUpdateSizeTwo(CCmdUI* pCmdUI)

{

       // TODO: Add your command update UI handler code here

       pCmdUI->Enable(flag);

       if(num==4)

              pCmdUI->SetCheck(true);

       else

              pCmdUI->SetCheck(false);

}

void CVideoDlg::OnFull()

{

       // TODO: Add your command handler code here

       m_player.Pause();

    m_player.SetFullScreenMode(true);

    m_player.SetMovieWindowSize(SW_SHOWMAXIMIZED);

    m_player.Run();

       num=5;

}

13、添加单击工具栏从头播放的消息映射:

void CVideoDlg::OnPlay()

{

       // TODO: Add your command handler code here

       m_player.Stop();

       m_player.Run();

       flag=true;

       toolbarctrl->EnableButton(IDM_PLAYPAUSE,true);  

       toolbarctrl->EnableButton(IDM_STOP,true);

       toolbarctrl->EnableButton(IDM_ADD_VOLUME,true);  

       toolbarctrl->EnableButton(IDM_SUB_VOLUME,true);  

}

14、动态的改变对话框的大小,需要利用类向导添加:ActiveMovie的StateChange的消息映射:

void CVideoDlg::OnStateChangeActivemovie1(long oldState, long newState)

{

       // TODO: Add your control notification handler code here

              MoveMovieWindow();

}

15、捕获播放器的错误:

void CVideoDlg::OnErrorActivemovie1(short SCode, LPCTSTR Description, LPCTSTR Source, BOOL FAR* CancelDisplay)

{

       // TODO: Add your control notification handler code here

       CString str;

       str.Format("出现错误[%d]:\n\n%s",SCode,Description);

       AfxMessageBox(str);

       *CancelDisplay=TRUE;

}

16、添加响应滑块控件移动的消息映射:ON_WM_HSCROLL的消息映射:

void CVideoDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)

{

       // TODO: Add your message handler code here and/or call default

       if(flag)

       {

              if(pScrollBar->GetDlgCtrlID()==IDC_SLIDER);

              {

                     int nRunTime = m_sliderctrl.GetPos();

                     m_player.SetCurrentPosition(nRunTime);

                     int MaxRange = m_player.GetCurrentPosition();

                     double sum=m_player.GetDuration();

                     m_sliderctrl.SetRange(0,int(sum));//需要得到文件长度

                     m_sliderctrl.SetTicFreq(10);

                     m_sliderctrl.SetPageSize(10);

              }

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

       }

       else

       {

              return;

       }

}

17、播放时显示滑块的相应位置:

void CVideoDlg::OnTimer(UINT nIDEvent)

{

       // TODO: Add your message handler code here and/or call default

       int pos = m_player.GetCurrentPosition();

       double sum=m_player.GetDuration();

       m_sliderctrl.SetRange(0,int(sum));

       m_sliderctrl.SetPos(pos);

       CDialog::OnTimer(nIDEvent);

       CDialog::OnTimer(nIDEvent);

}

并在OnOpenFile()函数中添加代码:

 

       int iInstallresult;

       iInstallresult=SetTimer(1,1000,NULL);

       if(iInstallresult==0)

       {

              MessageBox("fail to install the timer!");

       }

       }

      

18、直接打开帮助文件:

void CVideoDlg::OnHelp()

{

       // TODO: Add your command handler code here

       ShellExecute(NULL,"open","help.txt",NULL,NULL,SW_SHOWNORMAL);

}

19、关于菜单下的消息映射:

void CVideoDlg::OnAbout()

{

       // TODO: Add your command handler code here

       CAboutDlg dlg;

       dlg.DoModal();

}