PersonalCorpus 版 (精华区)

/*********************************************************************
* copyright (c) 2003,   hjt
* All rights reserved

* 类名: CMidia
* 版本: 1.0

* 描述: 这是一个根据微软公司MCIWnd宏封装的多媒体播放类,可以播放
*   WAVE,MIDI,CD,MP3音频文件以及AVI视频文件。实现乐普通播放器
*   的大部分功能,可以用来制作普通的媒体播放器,也可以用作学
*   习MCIWnd宏的例子。该类在winxp home 和VC6.0下通过测试,网
*   友可以写信给作者获取测试Demo。
*
* 文件: 由Midia.h和Midia.cpp两个文件组成
*
* 缺点: 对AVI文件,不能得到每帧图像的数据,只能得到播放窗口的大小。
*
* 作者: hjt  hjt.bbs@bbs.hit.edu.cn
*
* 完成时间: 2003/5/17
*
************************************************************************/

// Midia.h: interface for the CMidia class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_MP3_H__88805FCE_2614_4419_84F4_9E116EF55F79__INCLUDED_)
#define AFX_MP3_H__88805FCE_2614_4419_84F4_9E116EF55F79__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

class CMidia  
{
public:
 void ZoomIn(unsigned int iZoom); //放大
 void ZoomOut(unsigned int iZoom); //缩小
 LONG GetLength();   //音频文件返回以毫秒为单位的时间,视频文件返回帧数
 void SetWindowPos(int x, int y,int cx, int cy, UINT uFlags);
 void SeekTo(LONG lPos);
 void ToBeginning();
 void ToEnd();
 RECT GetRect(); 
 void Eject();    //弹出设备,可以用来弹出光驱
 void ChangVolume(int nV);  //调节音量,参数为正,音量增大;参数为负,音量减小
 void Backward (int nSeconds);
 void Forward (int nSeconds);
 BOOL IsPlaying (void);
 void Pause (void);
 void Stop (void);
 BOOL Play (void);
 void Close (void);
 BOOL Open(CString fileName);
 CMidia();
 virtual ~CMidia();

public: 
 HWND m_hParent;

private:
 HWND m_hMidia;
 BOOL m_bOpened;  //是否打开Midia文件
 BOOL m_bPaused;  //是否暂停
 BOOL m_bPlaying; //是否正在播放
 WORD m_wDeviceID; //播放设备ID
};

#endif // !defined(AFX_MP3_H__88805FCE_2614_4419_84F4_9E116EF55F79__INCLUDED_)



// Midia.cpp: implementation of the CMidia class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "Midia.h"
#include "vfw.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CMidia::CMidia()
{
  m_hMidia = NULL;

  m_bOpened = FALSE;
  m_bPaused = FALSE;
  m_bPlaying = FALSE;
  m_wDeviceID = 0;
}

CMidia::~CMidia()
{

}

BOOL CMidia::Open(CString fileName)
{
 if(m_bOpened)
 {
  Stop();
  Close();
  m_bOpened = FALSE; 
 }
 m_bPaused = m_bPlaying = FALSE;
 m_wDeviceID = 0;
 CFileStatus status;
 if(!CFile::GetStatus(fileName,status))
  return FALSE;
 m_hMidia = MCIWndCreate(m_hParent,
  AfxGetInstanceHandle(),
  WS_CHILD | WS_VISIBLE| //MCIWNDF_NOMENU,fileName);
  MCIWNDF_NOPLAYBAR      ,fileName);
 if(NULL == m_hMidia) 
  return FALSE;
 m_bOpened = TRUE;
 return TRUE;
}

void CMidia::Close()
{
 if(NULL != m_hMidia)
 { 
  MCIWndDestroy(m_hMidia);

  m_bOpened = FALSE;
 }
}

BOOL CMidia::Play()
{
 if(!m_bOpened)
  return FALSE;

 if(!m_bPaused)
 {
  MCIWndHome(m_hMidia);
 }
 else
 {
  MCIWndResume(m_hMidia);
  m_bPaused = FALSE;
 }
 
 MCIWndPlay(m_hMidia);
 m_bPlaying = TRUE;
 
 return TRUE; 
}

void CMidia::Stop()
{
 if (m_bOpened && m_bPlaying)
 {
  MCIWndStop(m_hMidia);
  MCIWndHome(m_hMidia);
  m_bPlaying = FALSE;
  m_bPaused = FALSE;
 }
}

void CMidia::Pause()
{
 if (m_bOpened && m_bPlaying)
 {
  if(!m_bPaused)
  {
   MCIWndPause(m_hMidia);
   m_bPaused = TRUE;
  }
  else
  {
   MCIWndResume(m_hMidia);
   m_bPaused = FALSE;
  }
 }
}

BOOL CMidia::IsPlaying()
{
 if (m_bOpened)
 {
  LONG p;
  LONG len;
  LONG rst = MCIWndGetMode(m_hMidia,&p,len);
  
  if(rst == MCI_MODE_PLAY && rst == MCI_MODE_PAUSE)
   return TRUE;
  else
   return FALSE;
 }

 return FALSE;
}

void CMidia::Forward(int nSeconds)
{
 if (m_bOpened)
 {  
  LONG pos = MCIWndGetPosition(m_hMidia);
  LONG end = MCIWndGetEnd(m_hMidia);
  pos += nSeconds;
  if(pos < end)
  {  
   MCIWndSeek(m_hMidia,pos);
   if (m_bPlaying && !m_bPaused)
    MCIWndPlay(m_hMidia);
  }
 }
}

void CMidia::Backward(int nSeconds)
{
 if (m_bOpened)
 {  
  LONG pos = MCIWndGetPosition(m_hMidia);
  LONG begin = MCIWndGetStart(m_hMidia);
  pos -= nSeconds;
  if(pos > begin)
  {  
   MCIWndSeek(m_hMidia,pos);
   if (m_bPlaying && !m_bPaused)
    MCIWndPlay(m_hMidia);
  }
 }
}


void CMidia::Eject()
{
 if(MCIWndCanEject(m_hMidia))
 {
  MCIWndEject(m_hMidia);
 }
}


void CMidia::ChangVolume(int nV)
{
 if(m_bOpened)
 {
  LONG nVolume = MCIWndGetVolume(m_hMidia);
  nVolume += nV;
  if(nVolume < 0)
   nVolume = 0;
  else if(nVolume > 1000 )
   nVolume = 1000;
  MCIWndSetVolume(m_hMidia,nVolume);
 }
}

RECT CMidia::GetRect()
{
 CRect r(0,0,0,0);
 if(m_bOpened)
 {
  MCIWndGetSource(m_hMidia,&r);
 }
 
 return (RECT)r;
}

void CMidia::ToEnd()
{
 LONG lPos = 0L;
 if(m_bOpened)
 {
  lPos = MCIWndGetEnd(m_hMidia);
  MCIWndSeek(m_hMidia,lPos);
  if(m_bPlaying)
   MCIWndStop(m_hMidia);
 }
}

void CMidia::ToBeginning()
{
 LONG lPos = 0L;
 if(m_bOpened)
 {
  lPos = MCIWndGetStart(m_hMidia);
  MCIWndSeek(m_hMidia,lPos);
  if(m_bPlaying)
   MCIWndPlay(m_hMidia);
 }
}

void CMidia::SeekTo(LONG lPos)
{
 if(m_bOpened)
 {
  if(lPos >= 0 && lPos <= GetLength())
  {
   MCIWndSeek(m_hMidia,lPos);
  }
 }
}

void CMidia::ZoomIn(unsigned int iZoom)
{
 int iCurrZoom;
 if(m_bOpened)
 {
  iCurrZoom = MCIWndGetZoom(m_hMidia);
  iCurrZoom += iZoom;
  MCIWndSetZoom(m_hMidia,iCurrZoom);
 }
}

void CMidia::ZoomOut(unsigned int iZoom)
{
 int iCurrZoom;
 if(m_bOpened)
 {
  iCurrZoom = MCIWndGetZoom(m_hMidia);
  iCurrZoom -= iZoom;
  if(iCurrZoom < 0)
   iCurrZoom = 0;
  MCIWndSetZoom(m_hMidia,iCurrZoom);
 }
}

void CMidia::SetWindowPos(int x, int y,int cx, int cy, UINT uFlags)
{
 if(m_bOpened)
 {
  ::SetWindowPos(m_hMidia,m_hParent,x,y,cx,cy,uFlags);
 }
}

LONG CMidia::GetLength()
{
 return MCIWndGetLength(m_hMidia);
}
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:4.361毫秒