用Visual C++开发的面向对象的多媒体应用软件可编译成
真正的EXE可执行文件,无需附加动态库和控件,如VBX和OCX
等。有两种方法可以实现这个功能,一种方法是使用底层AVI
文件函数,从AVI视频文件中读取视频流;另一种是使用现有的
Video forin dows SDK的窗口类MCIWnd(媒体控制界面窗)。
本文将介绍基于VC++5.0环境下,开发播放AVI文件的两种方
法,这两种方法略作改动, 还可为应用程序播放其它的媒体文
件(如声音文件等)。

一. VC++5.0可通过调用VFW.H和VFW32.LIB和MCIWnd API
函数来创建MCIWnd窗口实现AVI多媒体文件的调用和播放。

1. MCIWnd是一个控制多媒体设备(如MIDI、数字视频、VCR
以及CD音频设备等)的窗口类,要制作多媒体封面只需创建该
类的一个窗口,然后向它发送打开和控制MCI设置的消息。
MCIWnd窗口底部的播放条(Playbar )包括一个播放/暂停
(Play/Pause)按键、一个显示菜单(menu)按键和一个用于报告
播放进程的标尺。在播放窗口的任何地方单击鼠标右键都会显
示一个弹出菜单, 用于调整MCIWnd窗口的大小、MCI多媒体文
件的声音、速度的大小、MCI命令等。而且在父窗口外单击鼠
标右键可关闭和清除MCIWnd窗口,单击鼠标左键则可恢复
MCIWnd窗口。

2.编程步骤
   首先在VC++5.0中建立一个名为playavi项目( project)。
然后,通过调用VC++5.0的类库,从而建立OnLButtonDown()和
OnRButtonDown()函数。在相应的视文件(playaviView.cpp)
开始处加入一行#include "vfw.h",在显示类的构造函数中加
入一行" m_mmWnd=NULL",在相应的视文件的头文件中加入:

private:

HWND m_mmWnd;

BOLL m_pause;

在源文件playavi.cpp相应的函数中输入如下代码:

// CPlayaviView message handlers

void CPlayaviView::OnLButtonDown(UINT nFlags, CPoint point)

{

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

//加入我的代码

CString filename("/filename.avi");//键入文件路径及文件名

if(m_mmWnd==NULL)

m_mmWnd=MCIWndCreate(this->GetSafeHwnd(),AfxGetInstanceHandle(),

WS_CHILD|WS_CAPTION|WS_VISIBLE|MCIWNDF_SHOWPOS|MCIWNDF_SHOWNAME,

//以上为开关选项

filename);// filename为要播放的avi文件名

else

{

//设置播放句柄

if(m_pause)

{

MCIWndPlay(m_mmWnd);

m_pause=FALSE;

}

//设置中断句柄

else

{

MCIWndPause(m_mmWnd);

m_pause=TRUE;

}

}

//结束我的代码

CView::OnLButtonDown(nFlags, point);

}

void CPlayaviView::OnRButtonDown(UINT nFlags, CPoint point)

{

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

//加入我的代码

if (m_mmWnd!=NULL)

{

MCIWndDestroy(m_mmWnd);

m_mmWnd=NULL;

}

//结束我的代码

CView::OnRButtonDown(nFlags, point);

}

最后,在Project Setting对话框的Link表中将VFW32·LIB加
入Object/Library Modules对话框,最后编译该项目,即可播放了。

二. 在VC++5.0创建MCIWnd一个窗口,然后向它发送打开和控制MCI
设置的消息,也可实现播放AVI文件。

1.编辑Stdafx.h

// stdafx.h : include file for standard system include files,

//  or project specific include files that are used frequently, but

//      are changed infrequently

#if !defined(AFX_STDAFX_H__A851EC08_00FE_11D2_B7EF_00C0DF81AC80__INCLUDED_)

#define AFX_STDAFX_H__A851EC08_00FE_11D2_B7EF_00C0DF81AC80__INCLUDED_

#if _MSC_VER >= 1000

#pragma once

#endif // _MSC_VER >= 1000

#define VC_EXTRALEAN            // Exclude rarely-used stuff from Windows
headers

#include <afxwin.h>         // MFC core and standard components

#include <afxext.h>         // MFC extensions

#include <vfw.h>

#pragma comment(lib,"vfw32.lib")

#include <afxdisp.h>        // MFC OLE automation classes

#ifndef _AFX_NO_AFXCMN_SUPPORT

#include <afxcmn.h>

// MFC support for Windows Common Controls

#endif // _AFX_NO_AFXCMN_SUPPORT

//{{AFX_INSERT_LOCATION}}

// Microsoft Developer Studio will insert additional declarations
immediately
//before the previous line.

#endif
// !defined(AFX_STDAFX_H__A851EC08_00FE_11D2_B7EF_00C0DF81AC80__INCLUDED_)

2.编辑CExampleApp::InitInstance()

注册MCIWnd窗口类,打开MCIWnd窗口,并播放AVI文件,最后关闭
MCIWnd窗口,然后开始应用程序的常规初始化。

BOOL CAApp::InitInstance()

{

// CG: The following block was added by the Splash Screen
component.

{

CCommandLineInfo cmdInfo;

ParseCommandLine(cmdInfo);

}

// CG: The following block was added by the Splash Screen
component.

{

CCommandLineInfo cmdInfo;

ParseCommandLine(cmdInfo);

}

AfxEnableControlContainer();

// Standard initialization

// If you are not using these features and wish to reduce the size

//  of your final executable, you should remove from the following

//  the specific initialization routines you do not need.

//加入我的代码

if(!MCIWndRegisterClass())//注册MCIWnd窗口类

return FALSE;

HWND m_hAVI;//定义一个播放AVI文件的窗口句柄

m_hAVI=MCIWndCreate(NULL,AfxGetInstanceHandle(),

WS_VISIBLE|WS_POPUP,NULL);//创建MCIWnd窗口

if(m_hAVI==NULL)

return FALSE;

CString filename="/filename.avi");//键入文件路径及文件名

if(filename.GetLength()>0)

{

MCIWndOpen(m_hAVI,(LPCSTR)filename,0);//打开设备文件

if(MCIWndUseTime(m_hAVI)!=0)

//设置MCI时间格式

return FALSE;

long PlayTime=MCIWndGetLength(m_hAVI);

//获得AVI文件的播放时间长度

MCIWndPlay(m_hAVI);//播放AVI影视文件

::Sleep(PlayTime);//进程休眠

MCIWndDestroy(m_hAVI);//关闭MCI窗口

}

//结束我的代码

//开始常规初始化

#ifdef _AFXDLL

Enable3dControls();

// Call this when using MFC in a shared DLL

#else

Enable3dControlsStatic();

// Call this when linking to MFC statically

#endif

// Change the registry key under which our settings are stored.

// You should modify this string to be something appropriate

// such as the name of your company or organization.

SetRegistryKey(_T("Local AppWizard-Generated Applications"));

LoadStdProfileSettings();

// Load standard INI file options (including MRU)

// Register the application`s document templates.  Document
templates

//  serve as the connection between documents, frame windows and
//views.

CSingleDocTemplate* pDocTemplate;

pDocTemplate = new CSingleDocTemplate(

IDR_MAINFRAME,

RUNTIME_CLASS(CADoc),

RUNTIME_CLASS(CMainFrame),       // main SDI frame window

RUNTIME_CLASS(CAView));

AddDocTemplate(pDocTemplate);

// Parse command line for standard shell commands, DDE, file open

//CCommandLineInfo cmdInfo;

ParseCommandLine(cmdInfo);

// Dispatch commands specified on the command line

if (!ProcessShellCommand(cmdInfo))

return FALSE;

// The one and only window has been initialized, so show and update
//it.

m_pMainWnd->ShowWindow(SW_SHOW);

m_pMainWnd->UpdateWindow();

return TRUE;

}

三. 结束语
     以上两种方法,笔者在VC++5.0中已调试通过。只要略作改动, 它
们还可为应用程序播放其它的多媒体文件(如声音文件等)。亲爱的读
者,您不妨一试!

用VC++5.0播放AVI文件的两种方法相关推荐

  1. C#读写txt文件的两种方法介绍[转]

    C#读写txt文件的两种方法介绍 1.添加命名空间 System.IO; System.Text; 2.文件的读取 (1).使用FileStream类进行文件的读取,并将它转换成char数组,然后输出 ...

  2. 文字转语音文件的两种方法

    文件转语音文件的两种方法.小伙伴们在日常的工作.学习或是生活当中,是否遇到过以下这种情况.在工作中每天要阅读大量文件资料,在学习中每天要阅读各种课文,在生活中也会观看各种小说.但是长时间的用眼阅读,就 ...

  3. linux实现复制文件的两种方法

    分享在linux系统下拷贝文件的两种方法: 1 使用系统调用的read和write实现文件拷贝: #include <stdio.h> #include <sys/types.h&g ...

  4. java遍历文件和归类_java读取文件的两种方法:java.io和java.lang.ClassLoader

    java读取文件的两种方法:java.io和java.lang.ClassLoader 什么时候使用java.io,什么时候使用java.lang.ClassLoader呢? (注:要是之前读xml文 ...

  5. HTML5动态加载资源方式,动态加载JavaScript文件的两种方法

    这篇文章主要为大家详细介绍了动态加载JavaScript文件的两种方法,感兴趣的小伙伴们可以参考一下 第一种便是利用ajax方式,把script文件代码从背景加载到前台,而后对加载到的内容经过eval ...

  6. 导入mdf文件的两种方法

    导入mdf文件的两种方法: 1: 在企业管理器里面的菜单 操作->所有任务->附加数据库里面,根据需求填写就搞定了. 2:在查询分析器里执行如下语句 exec sp_attach_db ' ...

  7. 合并BIN文件的两种方法

    合并BIN文件的两种方法 在单片机的开发过程中,经常需要将两个单独的BIN文件合并成一个文件,方便烧写和生产.下面结合STM32的IAP Bootloader Code和Application Cod ...

  8. 编辑PDF文件的两种方法

    PDF文件具备较好的稳定性.兼容性,在日常工作中的应用非常广泛,但想要编辑文件内容就不那么容易了,下面来说说编辑PDF文件的两种方法. 方法一: 我们知道,查看PDF文件只需要阅读器就可以了,如果想对 ...

  9. linux启动sh文件命令,Linux 运行 .sh 文件的两种方法

    Linux 运行 .sh 文件的两种方法 文章作者:网友投稿 发布时间:2010-06-15 13:31:16 来源:网络 一个中等水平的Linux用户一定少不了经常执行.sh文件,当然了,你可以在图 ...

  10. elf格式转换为hex格式文件的两种方法

    这周工作终于不太忙了,可以写点笔记总结一下了. 之前的文章如何在Keil-MDK开发环境生成Bin格式文件,介绍了如何在Keil开发环境使用fromelf软件,将生成的axf文件转换为bin文件,这次 ...

最新文章

  1. STC单片机的命名规则
  2. 销售易移动CRM助力制造业转型智能制造
  3. 上传ML模型,一键可视化,终于能看懂神经网络到底在干啥了
  4. 开辟与退出一个新的栈帧常用的汇编语言指令
  5. MySQL buffer pool中的三种链
  6. Linux中基础指令
  7. 2020年阴阳师服务器维护,2020阴阳师2月19日更新官方公告及内容汇总
  8. python下绘制叠加区域图和叠加柱状图
  9. 聊聊汽车智能化时代的ASIL
  10. 只需10行代码就能对Excel文件进行批量去重~
  11. 如何让一个PNG图片背景透明
  12. 如何用软件测试交易系统的胜率,通达信官网程序交易测试
  13. 《软件工程之美》打卡第六周,春招我借这份PDF的复习思路
  14. 2018春招京东实习编程题解
  15. wxpython 界面 加密系统
  16. JAVASE面向对象基础
  17. Hexo-Theme-Buer主题修改介绍
  18. 教你用Canvas将图片截成圆图
  19. Apple Pay 在线远程支付
  20. SpringCloud微服务组件:Sentinel限流熔断

热门文章

  1. 原谅我,无法刻骨铭心地记住你
  2. 微博小尾巴自定义去掉android,新浪微博小尾巴怎么改 自定义微博小尾巴修改教程...
  3. mysql dump 拒绝访问_mysqldump访问被拒绝
  4. Codeforces 1027C. Minimum Value Rectangle
  5. 计算机毕业设计Python+Django的医院排队叫号系统(源码+系统+mysql数据库+Lw文档)
  6. linux挂载VMFS硬盘,挂载ESXi服务器VMFS存储卷
  7. h264和aac 封装成flv
  8. 手写一个简单的mybatis
  9. 计算机知识学习——window10台式电脑显示未插入扬声器或耳机解决方案
  10. php网站做分享到朋友圈,PHP实现微信分享朋友圈