VC:自己编写AVT播放程序

鬼谷子
VC:自己编写AVT播放程序
王毅 (12/10/1999)
    AVI文件也称为视频文件,视频是多道记录,包括波形声音和活动图像;
活动图像由一系列图像组成。AVI文件格式符合音频/视频交替存储格式(the
Audio/Video Interleaved format,简称AVI),它是Microsoft公司为其Windows
系统保存活动视频信号而设计的一种多媒体数据文件格式。
  时下,不少教育软件、游戏软件具有多媒体AVI文件的播放功能,程序员在开
发多媒体应用软件时,能否在自己的程序里也能操作播放AVI文件呢?笔者根据平
时开发中积累的成功经验,发现不利用Open(打开)对话框来选择需要播放的AVI
文件进行编程,还有一种更加简洁方便的编程方法。在此,给出这种新的AVI文件
播放方法。供大家参考。
  MCIWnd是用来控制多媒体设备的窗口类。与MCIWnd相关的函数、消息和宏提供
的方法可较容易地把多媒体播放或记录添加到应用程序中去。要在应用程序中播放
视频文件,只需调用MCIWndCreate函数即可。该函数可在应用程序中创建具有多媒
体控制界面(MCI)用来播放任何设备的控件。这些设备包括CD声音、波形音频、
MIDI以及视频设备。首先MCIWndCreate函数注册MCIWnd窗口类,然后为使用MCI服
务创建MCIWnd窗口。使用MCIWndCreate函数可执行自动播放、添加用户控制播放、
用窗口类型来改变MCIWnd窗口、允许用户指定设备或文件四类任务。MCIWnd通过几
个宏来控制播放,使用这些宏可完成以下功能:1、确定并改变当前位置;2、开始
和暂停及恢复播放;3、定义播放范围;4、倒放;5、循环播放。
  本文程序运行后,只要选中多媒体菜单项的创建MCI子窗口命令项,即自动生
成一个具有工具栏的MCI子窗口,工具栏上具有打开、播放、暂停播放以及轨道条
等控件,可方便地实现对任一AVI文件的控制。本文程序在中文Windows中采用
Visual C++6.0编辑、编译连接通过。运行良好。值得声明的是,要实现多媒体
功能,必须在程序中包含多媒体头文件digitalv.h、mciavi.h、mmsystem.h、
mmreg.h、msacm.h、vfw.h。当然还必须在工程文件中加入多媒体库文件
MSACM.LIB、WINMM.LIB和VFW32.LIB。附源文件pavi.cpp、资源描述文件pavi.rc和
头文件pavi.h。
  // Windows AVI playerpavi.cpp
  #include
  #include
  #include
  #include
  #include
  #include
  #include
  #include"pavi.h"
  HINSTANCE g_hinst;
  HWND g_hwndMCIWnd;
  LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
  char*szWinName=Win95Main"; //winclass nameint WINAPI
WinMain(HINSTANCE hThisInst,HINSTANCE hPrevInst,PSTR pszCmdLine,int
nCmdShow)
  HWND hwnd;
  MSG uMsg;
  WNDCLASS wndclass;
  HACCEL hAccel;
  // define windows class
  wndclass.style=0;
  wndclass.lpfnWndProc=WndProc;
  wndclass.cbClsExtra=0;
  wndclass.cbWndExtra=0;
  wndclass.hInstance=hThisInst;
  wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
  wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
  wndclass.hbrBackground=GetStockObject(WHITE_BRUSH);
  wndclass.lpszMenuName=SampleMenu";
  wndclass.lpszClassName=szWinName;
  g_hinst=hThisInst;
  //register windows class
  RegisterClass(&wndclass);
  //create window hwnd=CreateWindow(szWinName,Windows Multimedia
Player",WS_OVERLAPPEDWINDOW|WS_VSCROLL|WS_HSCROLL,
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
CW_USEDEFAULT,HWND_DESKTOP,NULL,hThisInst,NULL);
  //加载加速键表
  hAccel=LoadAccelerators(hThisInst,SampleMenu");
  // display window
  ShowWindow(hwnd,nCmdShow);
  UpdateWindow(hwnd);
  // process message looply
  while(GetMessage(&
g,NULL,0,0)){
  if(!TranslateAccelerator(hwnd,hAccel,&uMsg))
  {
  TranslateMessage(&uMsg);
  DispatchMessage(&uMsg);
  }
  }
  return uMsg.wParam;
  }
  //主窗口函数,处理各种消息,由WINDOW调用LRESULT CALLBACK
WndProc(HWND hwnd,UINT message, WPARAM wParam,LPARAM lParam)
  {
  switch(message){
  case WM_COMMAND:
  switch(wParam){
  case IDM_CREATEMCIWND: //创建一具有工具栏的可见MCI子窗口
  g_hwndMCIWnd=MCIWndCreate(hwnd,g_hinst,
WS_CHILD|WS_VISIBLE|WS_CAPTION|MCIWNDF_SHOWALL,NULL);
  break;
  case IDM_EXIT:
  MCIWndDestroy(g_hwndMCIWnd);
  MessageBox(hwnd,退出程序",退出",MB_OK);
  PostQuitMessage(0);
  break;
  case IDM_HELP:
  MessageBox(hwnd,AVI Player\n\n1999.9.2\n\nBy Mr.Wangyi\n",帮助
",MB_OK); break;
  }
  break;
  case WM_DESTROY:
  PostQuitMessage(0);
  break;
  default:
  return DefWindowProc(hwnd,message,wParam,lParam);
  }
  return 0;
  }
  //资源描述文件pavi.rc
  #include
  #includepavi.h"
  SampleMenu MENU
  {
  POPUP多媒体(&M)"
  {
  MENUITEM创建MCI窗口(&R)\t CTRL+R",DM_CREATEMCIWND MENUITEM退出(&
X)",IDM_EXIT
  }
  MENUITEM帮助(&H)",IDM_HELP
  }
  SampleMenu ACCELERATORS
  }
  X",IDM_EXIT,ALT
  R",IDM_CREATEMCIWND,ALT
  VK_F1,IDM_HELP,VIRTKEY
  }
  //头文件pavi.h
  #define IDM_CREATEMCIWND 101
  #define IDM_HELP 102
  #define IDM_EXIT 103

龙丘居士亦可怜
谈空说有夜不眠
忽闻河东师子吼
拄杖落手心茫然