GUI 剖析之播放器 实例2) 全功能播放器

来源:互联网 发布:明底线知敬畏懂感恩 编辑:程序博客网 时间:2024/05/22 17:44

// 全功能播放器.cpp : 定义应用程序的入口点。
//本播放器采用MciSendString接口实现,还有一些功能没有实现,读者可参考 GUI 剖析之播放器实例1)代码,望见谅

点击打开链接参考播放器实例3

 

 

#include "stdafx.h"
#include "全功能播放器.h"
#include "resource.h"
#include <ShellAPI.h>
#include <string.h>
#include "CommDlg.h "
#include "mmsystem.h"
#include "DIGITALV.H"
#define MAX_LOADSTRING 100
#define MCI_ERROR  0xFFFFFFFF
// 全局变量:
HWND hVideoWnd;
BOOL bAVI;
UINT uDeviceID;

 MCIDEVICEID m_mci_DID=MCI_ERROR;
 DWORD       m_dwCallBack=0;//MM_MCINOTIFY

#define BUFFER_SIZE 256
 void aviVideoFileOpen(HWND hWnd,HWND hDlg);

  DWORD    GetVolume();
 MCIERROR AddVolume(int dwVol);
 MCIERROR SetVolume(DWORD dwVol);
 
 
 
INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK Set(HWND, UINT, WPARAM, LPARAM);

int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
 UNREFERENCED_PARAMETER(hPrevInstance);
 UNREFERENCED_PARAMETER(lpCmdLine);

  // TODO: 在此放置代码。
 
 
 DialogBox(hInstance, MAKEINTRESOURCE(IDD_ABOUTBOX), NULL, About);
 return 0;
}

 

 

// “关于”框的消息处理程序。
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
 UNREFERENCED_PARAMETER(lParam);
 HDC hdc;
 PAINTSTRUCT ps;
 static BOOL bpaused;
 
 static int dwVol=30;
 switch (message)
 {
 case WM_ERASEBKGND:
  {
   return 0;
  }
 case WM_PAINT:
  {
   HWND hPlay=GetDlgItem(hDlg,IDC_STATIC);
   
   RECT rect;
   GetClientRect(hPlay,&rect);
   hdc=BeginPaint(hPlay,&ps);
   HDC hMemDC=CreateCompatibleDC(hdc);
   HBITMAP hMemBm=CreateCompatibleBitmap(hdc,rect.right,rect.bottom);
   SelectObject(hMemDC,hMemBm);

   HBRUSH mybrush=(HBRUSH)CreateSolidBrush(RGB(0,0,0,255));
   FillRect(hMemDC,&rect,mybrush);


   HFONT hFont;;
   
   hFont=CreateFont(23,23,0,0,
    FW_THIN,
    false,
    false,
    false,
    GB2312_CHARSET,
    OUT_CHARACTER_PRECIS,
    CLIP_CHARACTER_PRECIS,
    DEFAULT_QUALITY,
    FF_MODERN,
    L"隶书");
   SelectObject(hMemDC,hFont);
   
   SetTextColor(hMemDC,RGB(255,0,0));
   SetBkMode(hMemDC,TRANSPARENT);
   
   DrawText(hMemDC,L"天策版视频播放器(1.1版)[可以播放MPEG,AVI等格式文件] 郑金玮",-1,&rect,DT_WORDBREAK);

   BitBlt(hdc,0,0,rect.right,rect.bottom,hMemDC,0,0,SRCCOPY);
   DeleteDC(hMemDC);
   DeleteObject(hMemBm);
   EndPaint(hPlay,&ps);
   break;
  }
 case WM_INITDIALOG:
  {
   SetWindowText(hDlg,TEXT("天策版媒体播放器"));
   SetVolume(50);
   return (INT_PTR)TRUE;
  }
 case WM_COMMAND:
  {
   if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
   {
    EndDialog(hDlg, LOWORD(wParam));
    return (INT_PTR)TRUE;
   }
   switch(LOWORD(wParam))
   {
   case IDC_PLAY://播放
    {
     HWND hPlay=GetDlgItem(hDlg,IDC_STATIC);
     mciSendString(L"seek thevideo to start",0,0,0);
     if(bAVI)mciSendString(L"play thevideo window",0,0,0);
     else mciSendString(L"play thevideo",0,0,0);
     break;
    }
   case IDC_PAUSE://暂停
    {
     if(!bpaused)
     {
      mciSendString(L"pause thevideo",0,0,0);
      HWND hText=GetDlgItem(hDlg,IDC_PAUSE);
      SetWindowText(hText,TEXT("继续播放"));
      bpaused=TRUE;
     }
     else
     {
      mciSendString(L"resume thevideo",0,0,0);
      HWND hText=GetDlgItem(hDlg,IDC_PAUSE);
      SetWindowText(hText,TEXT("暂停播放"));
      bpaused=FALSE;
     }
     break;
    }
   case IDC_BREAK://停止
    {
     mciSendString(L"stop thevideo",0,0,0);
     mciSendString(L"seek thevideo to start",0,0,0);

     break;
    }
   case IDC_NEXT://下一曲目
    {
     break;
    }
   case IDC_LAST://上一曲目
    {
     break;
    }
   case IDC_ABOUT:
    {
     MessageBox(hDlg,TEXT("此播放器乃本人学习测试制作,\n功能齐全,可能存在一些bug,希望指正\nQQ:2538698032\n'&#169';copyright:All Right Reserved"),TEXT("关于"),MB_ICONINFORMATION|MB_OK);
     break;
    }
   case IDC_DELETEITEM://删除选定项
    {
     break;
    }
   case IDC_EMPTYLIST://清空列表
    {
     mciSendCommand(MCI_ALL_DEVICE_ID, MCI_CLOSE, 0, NULL);
      SendDlgItemMessage(hDlg,IDC_LIST1,LB_RESETCONTENT,0,0);
     break;
    }
   case IDC_GETINFO://获取媒体信息
    {
     
     MCI_DGV_STATUS_PARMS StatusParam;
     
     StatusParam.dwItem = MCI_WAVE_STATUS_SAMPLESPERSEC;
     mciSendCommand(uDeviceID, MCI_STATUS, MCI_WAIT | MCI_STATUS_ITEM,(DWORD_PTR)&StatusParam);
     DWORD samplerate = StatusParam.dwReturn;    //该参数返回采样

     
     StatusParam.dwItem = MCI_WAVE_STATUS_CHANNELS;
     mciSendCommand(uDeviceID, MCI_STATUS, MCI_WAIT | MCI_STATUS_ITEM,(DWORD_PTR) &StatusParam);
     DWORD channelnumber = StatusParam.dwReturn;    //该参数返回通道数

 

     WCHAR szBuff[256]={0};
     wsprintf(szBuff,TEXT("采样:%d\n通道:%d"),samplerate,channelnumber);
     MessageBox(hDlg,szBuff,TEXT(""),MB_OK|MB_ICONINFORMATION);
     break;
    }
   case IDC_KNOW://了解制作人
    {
     ShellExecute(NULL,L"open",L"
http://my.csdn.net/dai_jing",NULL,NULL,SW_SHOW);
     break;
    }
   case IDC_JINGYIN://静音
    {
     SetVolume(0);
     break;
    }
   case IDC_ZDYL://增大音量
    {

      if (dwVol<=0)
      {
       dwVol=-dwVol;
      }
     AddVolume(dwVol);
     break;
    }
   case IDC_JXYL://减小音量
    {
     if (dwVol>=0)
     {
       dwVol=-dwVol;
     }
     
     
     AddVolume(dwVol);
     break;
    }
   case IDC_GXH://个性化
    {

     break;
    }
   case IDC_ADDTOLIST:
    {
     HWND hPlay=GetDlgItem(hDlg,IDC_STATIC);
     aviVideoFileOpen(hPlay,hDlg);

     
     
     break;
    }
   case IDC_EXIT:
    {
     PostQuitMessage(0);
     break;
    }
   case IDC_KJ://快进
    {
     
      mciSendString(L"stop thevideo",0,0,0);
     mciSendString(L"STEP thevideo by 100",0,0,0);
     
     if(bAVI)mciSendString(L"play thevideo window",0,0,0);
     else mciSendString(L"play thevideo",0,0,0);
     break;
    }
   case IDC_KT://快退
    {
     mciSendString(L"stop thevideo",0,0,0);
     mciSendString(TEXT("step thevideo reverse by 100"),0,0,0);
     if(bAVI)mciSendString(L"play thevideo window",0,0,0);
     else mciSendString(L"play thevideo",0,0,0);
     break;
    }
   case IDC_KNOW2://设置
    {
     HINSTANCE hInst=(HINSTANCE)GetWindowLong(hDlg,GWL_HINSTANCE);
     DialogBox(NULL, MAKEINTRESOURCE(IDD_DIALOG1), hDlg,Set);
     break;
    }
   default:break;
   }
  }
  
  break;
 }
 return (INT_PTR)FALSE;
}


void aviVideoFileOpen(HWND hWnd,HWND hDlg)
{
 OPENFILENAME ofn;
 static WCHAR szFile[BUFFER_SIZE]=L"";
 static WCHAR szFileTitle[BUFFER_SIZE];
 memset(&ofn,0,sizeof(ofn));
 ofn.lStructSize=sizeof(ofn);
 ofn.hwndOwner=hWnd;
 ofn.lpstrFilter=L"allfiles(*.avi,*.dat,*.mpg,*.mp4,*.3gp,*.mp3,*.wma,*.flv,*.*;)\0*.*;0*.flv;0*.wma;0*.mp3;0*.3gp;0*.mp4;0*.avi;*.dat;*.mpg\0\0";
 ofn.nFilterIndex=0;
 ofn.lpstrFile=szFile;
 ofn.nMaxFile=sizeof(szFile);
 ofn.lpstrFileTitle=szFileTitle;
 ofn.nMaxFileTitle=sizeof(szFileTitle);
 ofn.Flags=OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST|OFN_EXPLORER;
 if(GetOpenFileName(&ofn))
 {
  SendDlgItemMessage(hDlg,IDC_LIST1,LB_ADDSTRING,0,(LPARAM)szFile);
  mciSendCommand(MCI_ALL_DEVICE_ID, MCI_CLOSE, 0, NULL);
  RECT rect;
  MCI_DGV_OPEN_PARMS  mciOpen;
  MCI_DGV_STATUS_PARMS mciStatus;
  memset(&mciOpen,0,sizeof(mciOpen));
  mciStatus.dwItem=MCI_DGV_STATUS_HWND;
  mciOpen.lpstrAlias=L"thevideo";
  lstrcpy(szFile,ofn.lpstrFile);
  mciOpen.lpstrElementName=szFile;
  mciOpen.lpstrDeviceType=L"cdaudio";
  mciOpen.hWndParent=hWnd;
  mciOpen.dwCallback=(DWORD)hWnd;
  mciOpen.dwStyle=WS_CHILD;
  if(mciSendCommand(0,MCI_OPEN,MCI_OPEN_ALIAS|MCI_OPEN_ELEMENT|
  MCI_DGV_OPEN_PARENT|MCI_DGV_OPEN_WS,(DWORD)&mciOpen)==0)
  {
   uDeviceID=mciOpen.wDeviceID;
   if(wcsstr(szFile,L".AVI"))bAVI=TRUE;else bAVI=FALSE;
   mciSendCommand(uDeviceID,MCI_STATUS,MCI_STATUS_ITEM,(DWORD)&mciStatus);
   hVideoWnd=(HWND)mciStatus.dwReturn;
   GetClientRect(hWnd,&rect);
   if(bAVI)mciSendString(L"play thevideo window",0,0,0);
   else mciSendString(L"play thevideo ",0,0,0);
    MoveWindow(hVideoWnd,rect.left,rect.top,rect.right,rect.bottom,TRUE);
  }
  
  MessageBox(hWnd,L"添加成功",L"关于添加",
   MB_ICONINFORMATION|MB_OK);

  
  WCHAR szBuff[256]={0};
  wsprintf(szBuff,TEXT("正在播放:%s"),szFile);
  SetDlgItemText(hDlg,IDC_ZJW,szBuff);
 }
}


 DWORD    GetVolume()
 {
  if(MCI_ERROR==uDeviceID)
   return 0;//Invalid device ID.
  MCI_STATUS_PARMS mci_p = {0};

  mci_p.dwCallback    = m_dwCallBack;
  mci_p.dwItem        = MCI_DGV_STATUS_VOLUME;

  mciSendCommand(
   uDeviceID,
   MCI_STATUS,
   MCI_NOTIFY|MCI_STATUS_ITEM,
   (DWORD)&mci_p);

  return mci_p.dwReturn;
 }

MCIERROR AddVolume(int dwVol)
{
 int newVol=(int)GetVolume()+dwVol;
 if(newVol<0)
  newVol=0;
 return SetVolume(newVol);
}
MCIERROR SetVolume(DWORD dwVol)
{
 if(MCI_ERROR==uDeviceID)
  return MCIERR_INVALID_DEVICE_ID;//Invalid device ID.
 MCIERROR        mciERR  = ERROR_SUCCESS;
 MCI_DGV_SETAUDIO_PARMS  mci_p = {0};
 if(dwVol<0)
  dwVol=0;
 if(dwVol>1000)
  dwVol=1000;

 mci_p.dwCallback    = m_dwCallBack;
 mci_p.dwItem        = MCI_DGV_SETAUDIO_VOLUME;
 mci_p.dwValue       = dwVol;

 mciERR = mciSendCommand(
  uDeviceID,
  MCI_SETAUDIO,
  MCI_NOTIFY|MCI_DGV_SETAUDIO_ITEM|MCI_DGV_SETAUDIO_VALUE,
  (DWORD)&mci_p);

 return mciERR;
}


INT_PTR CALLBACK Set(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
 UNREFERENCED_PARAMETER(lParam);
 switch (message)
 {
 case WM_INITDIALOG:
  {
   SetWindowText(hDlg,TEXT("播放设置"));
   
   return (INT_PTR)TRUE;
  }
 case WM_COMMAND:
  {
   if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
   {
    EndDialog(hDlg, LOWORD(wParam));
    return (INT_PTR)TRUE;
   }
   break;
  }
 }
 return (INT_PTR)FALSE;
}