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毫秒