// MovePlayerDlg.cpp : implementation file // #include "stdafx.h" #include "MovePlayer.h" #include "MovePlayerDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CAboutDlg dialog used for App About 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() ///////////////////////////////////////////////////////////////////////////// // CMovePlayerDlg dialog CMovePlayerDlg::CMovePlayerDlg(CWnd* pParent /*=NULL*/) : CDialog(CMovePlayerDlg::IDD, pParent) { //{{AFX_DATA_INIT(CMovePlayerDlg) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_pGraph = NULL; m_bTop = false; m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); m_hAccelTable = LoadAccelerators(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_ACCELERATOR)); } void CMovePlayerDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CMovePlayerDlg) DDX_Control(pDX, IDC_STATIC1, m_moveShow); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CMovePlayerDlg, CDialog) //{{AFX_MSG_MAP(CMovePlayerDlg) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_WM_SIZE() ON_WM_ERASEBKGND() ON_WM_TIMER() ON_COMMAND(IDM_FILE_CLOSE, OnFileClose) ON_COMMAND(IDM_FILE_EXIT, OnFileExit) ON_COMMAND(IDM_FILE_FULLSCREEN, OnFileFullscreen) ON_COMMAND(IDM_FILE_OPEN, OnFileOpen) ON_COMMAND(IDM_FILE_SHOT, OnFileShot) ON_COMMAND(IDM_HELP_ABOUT, OnHelpAbout) ON_COMMAND(IDM_PLAY_PAUSE, OnPlayPause) ON_COMMAND(IDM_PLAY_PLAY, OnPlayPlay) ON_COMMAND(IDM_PLAY_SETTOP, OnPlaySettop) ON_COMMAND(IDM_PLAY_STOP, OnPlayStop) ON_COMMAND(IDM_SIZE100, OnSize100) ON_COMMAND(IDM_SIZE200, OnSize200) ON_COMMAND(IDM_SIZE50, OnSize50) ON_UPDATE_COMMAND_UI(IDM_PLAY_SETTOP, OnUpdatePlaySettop) ON_UPDATE_COMMAND_UI(IDM_FILE_CLOSE, OnUpdateFileClose) ON_UPDATE_COMMAND_UI(IDM_FILE_FULLSCREEN, OnUpdateFileFullscreen) ON_UPDATE_COMMAND_UI(IDM_FILE_SHOT, OnUpdateFileShot) ON_UPDATE_COMMAND_UI(IDM_PLAY_PAUSE, OnUpdatePlayPause) ON_UPDATE_COMMAND_UI(IDM_PLAY_PLAY, OnUpdatePlayPlay) ON_UPDATE_COMMAND_UI(IDM_PLAY_STOP, OnUpdatePlayStop) ON_UPDATE_COMMAND_UI(IDM_SIZE100, OnUpdateSize100) ON_UPDATE_COMMAND_UI(IDM_SIZE200, OnUpdateSize200) ON_UPDATE_COMMAND_UI(IDM_SIZE50, OnUpdateSize50) ON_WM_MENUSELECT() //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CMovePlayerDlg message handlers BOOL CMovePlayerDlg::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); 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 m_playBar.Create(IDD_TOOLBAR, this); m_playBar.ShowWindow(SW_SHOW); m_moveShow.ModifyStyle(0, WS_CLIPCHILDREN); //将属性改为子窗体 CRect rc; GetClientRect(&rc); rc.bottom -= m_playBar.GetHeight(); m_moveShow.MoveWindow(&rc); //设置播放区域 m_playBar.MoveWindow(0, rc.bottom, rc.right, m_playBar.GetHeight()); SetTimer(T_DRAWLOGO, 100, NULL); //启动定时器 SetWindowText("-------Move Player"); // TODO: Add extra initialization here return TRUE; // return TRUE unless you set the focus to a control } void CMovePlayerDlg::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 CMovePlayerDlg::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(); } SetTimer(T_DRAWLOGO, 100, NULL); } // The system calls this to obtain the cursor to display while the user drags // the minimized window. HCURSOR CMovePlayerDlg::OnQueryDragIcon() { return (HCURSOR) m_hIcon; } void CMovePlayerDlg::OnSize(UINT nType, int cx, int cy) { CDialog::OnSize(nType, cx, cy); if(m_playBar.m_hWnd) { CRect rc; GetClientRect(&rc); //获取窗体区域 rc.top = rc.bottom - m_playBar.GetHeight(); //bar顶边 m_playBar.MoveWindow(&rc); //设置bar GetClientRect(&rc); //获取窗体区域 rc.bottom -= m_playBar.GetHeight(); //播放区域底边 m_moveShow.MoveWindow(&rc); //设置播放区域 } if(m_pGraph) { CRect rc; GetClientRect(&rc); //获取窗体区域 rc.bottom -= m_playBar.GetHeight(); //播放区域底边 m_moveShow.MoveWindow(&rc); //设置播放区域 m_pGraph->SetWindowPos(&rc); //设置播放区域 Flash(); } SetTimer(T_DRAWLOGO, 100, NULL); } int CMovePlayerDlg::Flash() { CRect rc; m_moveShow.GetClientRect(&rc); //获取播放区域 CDC memDC; CClientDC ClientDlgDC(m_moveShow.FromHandle(m_moveShow.m_hWnd));//播放控件的dc CBrush brush; brush.CreateSolidBrush(RGB(0,0,0)); ClientDlgDC.FillRect(&rc,&brush); //填充黑色背景 CBitmap Bitmap, *oldBitmap; BITMAP bmpInfo; int nWidth, nHeight; memDC.CreateCompatibleDC(&ClientDlgDC); Bitmap.LoadBitmap(IDB_FLASH); //载入logo Bitmap.GetBitmap(&bmpInfo); nWidth = bmpInfo.bmWidth; nHeight = bmpInfo.bmHeight; oldBitmap = memDC.SelectObject(&Bitmap); //将logo载入内存设备 //将内存设备中的logo绘制到播放区域 ClientDlgDC.StretchBlt((rc.right-nWidth)/2, (rc.bottom-nHeight)/2, nWidth, nHeight,&memDC, 0, 0, nWidth, nHeight,SRCCOPY); //释放内存 memDC.SelectObject(oldBitmap); return 1; } BOOL CMovePlayerDlg::OnEraseBkgnd(CDC* pDC) { // TODO: Add your message handler code here and/or call default if(m_pGraph) { CRect rc; m_moveShow.GetWindowRect(&rc); ScreenToClient(&rc); pDC->ExcludeClipRect(&rc); } return CDialog::OnEraseBkgnd(pDC); } void CMovePlayerDlg::OnTimer(UINT nIDEvent) { // TODO: Add your message handler code here and/or call default switch(nIDEvent) { case T_POSITION: { if(m_pGraph) { __int64 pos = m_pGraph->GetPosition(); __int64 len = m_pGraph->GetLength(); m_playBar.SetSliderPos(int(pos * 10000 / len)); m_playBar.DrawStatus(); } break; } case T_DRAWLOGO: if(!m_pGraph) { Flash(); KillTimer(T_DRAWLOGO); } break; } CDialog::OnTimer(nIDEvent); } BOOL CMovePlayerDlg::PreTranslateMessage(MSG* pMsg) { if (m_hAccelTable) { if (::TranslateAccelerator(m_hWnd, m_hAccelTable, pMsg)) //加速键 return true; } if(pMsg->hwnd == m_moveShow && pMsg->message == WM_LBUTTONDBLCLK)//双击全屏和退出全屏 { if (m_pGraph) { m_pGraph->SetFullScreen(!m_pGraph->GetFullScreen()); m_moveShow.m_bDrawCursor = !m_pGraph->GetFullScreen(); OnPlayPlay(); } } if(pMsg->message == WM_GRAPHNOTIFY) //处理播放器窗口消息 { IMediaEventEx * pEvent = NULL; if (m_pGraph && (pEvent = m_pGraph->GetMediaEventPointer())) { LONG eventCode = 0, eventParam1 = 0, eventParam2 = 0; while (SUCCEEDED(pEvent->GetEvent(&eventCode, &eventParam1, &eventParam2, 0))) { pEvent->FreeEventParams(eventCode, eventParam1, eventParam2); switch (eventCode) { case EC_COMPLETE: OnPlayStop(); break; case EC_USERABORT: case EC_ERRORABORT: break; default: break; } } } } if(WM_SYSKEYDOWN == pMsg->message && VK_RETURN == pMsg->wParam) //回车组合键 { if (m_pGraph) { m_pGraph->SetFullScreen(!m_pGraph->GetFullScreen()); m_moveShow.m_bDrawCursor = !m_pGraph->GetFullScreen(); return true; } } if(WM_SYSCOMMAND== pMsg->message && SC_RESTORE== pMsg->wParam) //从最小化恢复 { SetTimer(T_DRAWLOGO, 100, NULL); } if(WM_NCLBUTTONDBLCLK == pMsg->message) //非客户双击 { SetTimer(T_DRAWLOGO, 100, NULL); } if (pMsg->message == WM_KEYDOWN) //键盘事件 { if((pMsg->wParam == VK_RETURN)||(pMsg->wParam == VK_ESCAPE))//回车或ESC键 { if (m_pGraph) { m_pGraph->SetFullScreen(false); //退出全屏播放模式 m_moveShow.m_bDrawCursor = true; return true; } } if(pMsg->wParam == VK_SPACE) //空格键 { OnVideoWindowClick(); //播放或暂停 } } return CDialog::PreTranslateMessage(pMsg); } void CMovePlayerDlg::OnFileClose() { DestroyGraph(); } void CMovePlayerDlg::OnFileExit() { PostQuitMessage(0); } void CMovePlayerDlg::OnFileFullscreen() { if(m_pGraph) { m_moveShow.m_bDrawCursor = m_pGraph->GetFullScreen(); m_pGraph->SetFullScreen(!m_pGraph->GetFullScreen()); } } void CMovePlayerDlg::OnFileOpen() { CString strFilter; //文件过滤器字符串 strFilter = "媒体文件(所有类型)|*.mpg;*.mpeg;*.avi;*.rmvb;*.rm;*.mp3;*.mid;*.wav;*.mov;*.qt;*.wmv;*.wma;*.asf|"; strFilter += "All Files(*.*)|*.*|"; CFileDialog dlgOpen(TRUE, NULL, NULL, OFN_PATHMUSTEXIST | OFN_HIDEREADONLY, strFilter, this); //打开文件对话框 if (IDOK == dlgOpen.DoModal()) { PlayFile(dlgOpen.m_ofn.lpstrFile); //播放打开的文件 } } void CMovePlayerDlg::OnFileShot() { CTime t = CTime::GetCurrentTime(); CString s = t.Format("%y_%m_%d_%H_%M_%S.BMP"); if(m_pGraph->SnapshotBitmap(s)) MessageBox(CString("截图成功,保存为")+s); } void CMovePlayerDlg::OnHelpAbout() { CAboutDlg dlg; dlg.DoModal(); } void CMovePlayerDlg::OnPlayPause() { if(m_pGraph) { m_pGraph->Pause(); m_playBar.m_ToolBar.GetToolBarCtrl().SetState(0, TBSTATE_ENABLED); m_playBar.m_ToolBar.GetToolBarCtrl().SetState(1, TBSTATE_CHECKED | TBSTATE_ENABLED); m_playBar.m_ToolBar.GetToolBarCtrl().SetState(2, TBSTATE_ENABLED); m_playBar.DrawStatus(); } } void CMovePlayerDlg::OnPlayStop() { if(m_pGraph) { KillTimer(T_POSITION); m_pGraph->SetPosition(0); m_pGraph->Stop(); m_playBar.SetSliderPos(0); m_playBar.m_ToolBar.GetToolBarCtrl().SetState(0, TBSTATE_ENABLED); m_playBar.m_ToolBar.GetToolBarCtrl().SetState(1, TBSTATE_ENABLED); m_playBar.m_ToolBar.GetToolBarCtrl().SetState(2, TBSTATE_CHECKED | TBSTATE_ENABLED); m_playBar.EnableSlider(false); m_playBar.DrawStatus(); } } void CMovePlayerDlg::OnPlayPlay() { if(m_pGraph) { m_pGraph->Play(); SetTimer(T_POSITION, 100, NULL); m_playBar.m_ToolBar.GetToolBarCtrl().SetState(IDM_PLAY_PLAY, TBSTATE_CHECKED | TBSTATE_ENABLED); m_playBar.m_ToolBar.GetToolBarCtrl().SetState(IDM_PLAY_PAUSE, TBSTATE_ENABLED); m_playBar.m_ToolBar.GetToolBarCtrl().SetState(IDM_PLAY_STOP, TBSTATE_ENABLED); m_playBar.EnableSlider(true); SetVolumeAndBalance(); m_playBar.DrawStatus(); } } void CMovePlayerDlg::OnPlaySettop() { if(!m_bTop) SetWindowPos(&wndTopMost,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE); else SetWindowPos(&wndNoTopMost,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE); m_bTop = !m_bTop; } void CMovePlayerDlg::OnUpdatePlaySettop(CCmdUI* pCmdUI) { pCmdUI->SetCheck(m_bTop); } void CMovePlayerDlg::OnSize200() { ChangeVideoSize(200); } void CMovePlayerDlg::OnSize100() { ChangeVideoSize(100); } void CMovePlayerDlg::OnSize50() { ChangeVideoSize(50); } int CMovePlayerDlg::ChangeVideoSize(int rate) { int CaptionHeight = GetSystemMetrics(SM_CYCAPTION); int MenuHeight = GetSystemMetrics(SM_CYMENU); int width; int height; width = m_pGraph->GetSourceWidth() * rate / 100; height = m_pGraph->GetSourceHeight() * rate / 100 + CaptionHeight + MenuHeight + m_playBar.GetHeight(); CRect rc; GetWindowRect(&rc); MoveWindow(rc.left, rc.top, width, height); CenterWindow(); return 1; } int CMovePlayerDlg::DestroyGraph() { if(m_pGraph) { KillTimer(T_POSITION); m_pGraph->Release(); delete m_pGraph; m_pGraph = NULL; m_playBar.BindGraph(NULL); return true; } return false; } int CMovePlayerDlg::PlayFile(char *pszFile) { if(CreateGraph()) { if(m_pGraph->SetFileName(pszFile)) { m_pGraph->SetDisplayWindow(m_moveShow.m_hWnd); //设置播放区域 if(m_pGraph->Play()) { int CaptionHeight = GetSystemMetrics(SM_CYCAPTION); int MenuHeight = GetSystemMetrics(SM_CYMENU); m_moveShow.MoveWindow(0, 0, m_pGraph->GetSourceWidth(), m_pGraph->GetSourceHeight()); int width; int height; if(m_pGraph->IsHaveVideo()) { width = m_pGraph->GetSourceWidth(); height = m_pGraph->GetSourceHeight() + CaptionHeight + MenuHeight + m_playBar.GetHeight(); } else { width = 400; height = CaptionHeight + MenuHeight + m_playBar.GetHeight() + 8; SetTimer(T_DRAWLOGO, 100, NULL); } CRect rc; GetWindowRect(&rc); MoveWindow(rc.left, rc.top, width, height); SetTimer(T_POSITION, 100, NULL); m_playBar.SetButton(0, TBSTATE_ENABLED | TBBS_CHECKBOX); m_playBar.SetButton(1, TBSTATE_ENABLED | TBBS_CHECKBOX); m_playBar.SetButton(2, TBSTATE_ENABLED | TBBS_CHECKBOX); //m_playBar.SetButton(TB_PLAY, TBSTATE_CHECKED); m_playBar.m_ToolBar.GetToolBarCtrl().SetState(IDM_PLAY_PLAY, TBSTATE_CHECKED | TBSTATE_ENABLED); m_playBar.EnableSlider(true); SetVolumeAndBalance(); m_pGraph->SetNotifyWindow(m_hWnd, WM_GRAPHNOTIFY); CenterWindow(); SetWindowText(m_pGraph->m_szFileName); } } else { MessageBox("不支持该格式"); OnFileClose(); } } else { MessageBox("DirectShow初始化失败"); OnFileClose(); } return 1; } int CMovePlayerDlg::CreateGraph() { DestroyGraph(); m_pGraph = new CMyDWGraph(); m_playBar.BindGraph(m_pGraph); return m_pGraph->Create(); } void CMovePlayerDlg::OnVideoWindowClick() { if(m_pGraph) { if(m_pGraph->IsPaused()) OnPlayPlay(); else OnPlayPause(); } else Flash(); } void CMovePlayerDlg::OnUpdateFileClose(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here if(m_pGraph) pCmdUI->Enable(m_pGraph->IsPaused() || m_pGraph->IsRunning() || m_pGraph->IsStopped()); else pCmdUI->Enable(false); } void CMovePlayerDlg::OnUpdateFileFullscreen(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here if(m_pGraph) pCmdUI->Enable(m_pGraph->IsHaveVideo()); else pCmdUI->Enable(false); } void CMovePlayerDlg::OnUpdateFileShot(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here if(m_pGraph) pCmdUI->Enable(m_pGraph->IsHaveVideo()); else pCmdUI->Enable(false); } void CMovePlayerDlg::OnUpdatePlayPause(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here if(m_pGraph == NULL) { pCmdUI->Enable(false); return; } pCmdUI->Enable(); pCmdUI->SetCheck(m_pGraph->IsPaused()); } void CMovePlayerDlg::OnUpdatePlayPlay(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here if(m_pGraph == NULL) { pCmdUI->Enable(false); return; } pCmdUI->Enable(); pCmdUI->SetCheck(m_pGraph->IsRunning()); } void CMovePlayerDlg::OnUpdatePlayStop(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here if(m_pGraph == NULL) { pCmdUI->Enable(false); return; } pCmdUI->Enable(); pCmdUI->SetCheck(m_pGraph->IsStopped()); } void CMovePlayerDlg::OnUpdateSize100(CCmdUI* pCmdUI) { // ODO: Add your command update UI handler code here if(m_pGraph) pCmdUI->Enable(m_pGraph->IsHaveVideo()); else pCmdUI->Enable(false); } void CMovePlayerDlg::OnUpdateSize200(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here if(m_pGraph) pCmdUI->Enable(m_pGraph->IsHaveVideo()); else pCmdUI->Enable(false); } void CMovePlayerDlg::OnUpdateSize50(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here if(m_pGraph) pCmdUI->Enable(m_pGraph->IsHaveVideo()); else pCmdUI->Enable(false); } void CMovePlayerDlg::OnMenuSelect(UINT nItemID, UINT nFlags, HMENU hSysMenu) { CDialog::OnMenuSelect(nItemID, nFlags, hSysMenu); // TODO: Add your message handler code here CCmdUI cmdUI; CMenu* pMainMenu = GetMenu(); CMenu* pSubMenu = pMainMenu-> GetSubMenu(nItemID); if(IsMenu(pSubMenu->GetSafeHmenu())) { cmdUI.m_nIndexMax = pSubMenu->GetMenuItemCount(); for (UINT i = 0; i < cmdUI.m_nIndexMax; ++i) { cmdUI.m_nIndex = i; cmdUI.m_nID = pSubMenu->GetMenuItemID(i); cmdUI.m_pMenu = pSubMenu; cmdUI.DoUpdate(this, FALSE); } } } LRESULT CMovePlayerDlg::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) { // TODO: Add your specialized code here and/or call the base class if(message == WM_DRAGFILE) { PlayFile(m_moveShow.m_FileName); } return CDialog::DefWindowProc(message, wParam, lParam); } int CMovePlayerDlg::SetVolumeAndBalance() { if(m_pGraph) { m_pGraph->SetAudioBalance(m_playBar.GetBalanceValue()); //设置平衡 m_pGraph->SetAudioVolume(m_playBar.GetVolumeValue()); //设置声音 } return 1; }