An AVI Media Player (Dev-C++)

vegaseat 0 Tallied Votes 4K Views Share

This AVI file player has some nice features like adjusting size and speed. The program uses the standard MSvfw32.lib (called libmsvfw32.a in the DevCPP lib directory). Another example of using BCX to translate to C code and modify to something Dev-C++ can handle. Enjoy!!!

// Play an AVI using the MSvfw32.lib 
// in the case of Dev-C++ link with libmsvfw32.a via
// Project>>Project Options>>Parameters>>Add Lib>>libmsvfw32.a
// created via BCX generated C code then modified for Dev-C++
// (actually-Dev C++ is the IDE for the GNU GCC/G++ compiler)
// a Dev-C++ tested Windows Application by  vegaseat  21nov2004 

#include <cstdio>
#include <windows.h>
#include <vfw.h>

#define ID_MCIFrame 0
#define ID_MENU1 9001
#define ID_MENU2 9002
#define ID_MENU3 9003

static HINSTANCE BCX_hInstance;
static int     BCX_ScaleX;
static int     BCX_ScaleY;
static char    BCX_ClassName[2048];
static HANDLE  ghInst;
static HWND    Form1;
static HWND    MCIFrame;
static HMENU   MainMenu;
static HMENU   FileMenu;
static OPENFILENAME OpenFileName;
static char    szFile[2048];
static char    szFileTitle[2048];

#define Show(Window)  RedrawWindow(Window,0,0,0);ShowWindow(Window,SW_SHOW);

HWND    BCX_Form(char*,int=0,int=0,int=250,int=150,int=0,int=0);
void    BCX_Set_Form_Color (HWND,COLORREF);
void    Center (HWND,HWND=0,HWND=0);
char*   BCX_TmpStr(size_t);
char*   str (double);
char*   curdir (void);

void    FormLoad (void);
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
int     InitOpenFileName (void);
int     PopFileOpenDlg (HWND, char *, char *);
BOOL    AddMenu (HWND);


// standard Windows Graphical User Interface main
int WINAPI WinMain(HINSTANCE hInst,HINSTANCE hPrev,LPSTR CmdLine,int CmdShow)
{
 WNDCLASS Wc;
 MSG      Msg;
 // *****************************
 strcpy(BCX_ClassName,"MCI_demo1");
 // ************************************
 // Scale Dialog Units To Screen Units
 // ************************************
 RECT rc          =  {0,0,4,8};
 MapDialogRect       (NULL,&rc);
 BCX_ScaleX       =  rc.right/2;
 BCX_ScaleY       =  rc.bottom/4;
 BCX_hInstance    =  hInst;
 // ******************************************************
 Wc.style         =  CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
 Wc.lpfnWndProc   =  WndProc;
 Wc.cbClsExtra    =  0;
 Wc.cbWndExtra    =  0;
 Wc.hInstance     =  hInst;
 Wc.hIcon         =  LoadIcon(NULL,IDI_WINLOGO);
 Wc.hCursor       =  LoadCursor(NULL,IDC_ARROW);
 Wc.hbrBackground =  (HBRUSH)(COLOR_BTNFACE+1);
 Wc.lpszMenuName  =  NULL;
 Wc.lpszClassName =  BCX_ClassName;
 RegisterClass(&Wc);

 FormLoad();
 // event message loop 
 while(GetMessage(&Msg,NULL,0,0))
 {
    HWND hActiveWindow = GetActiveWindow();
    if (!IsWindow(hActiveWindow) || !IsDialogMessage(hActiveWindow,&Msg))
      {
        TranslateMessage(&Msg);
        DispatchMessage(&Msg);
      }
 }
 return Msg.wParam;
}


// circular storage, hold the memory leaks to a minimum
char *BCX_TmpStr (size_t Bites)
{
  static int   StrCnt;
  static char *StrFunc[2048];
  StrCnt=(StrCnt + 1) & 2047;
  if(StrFunc[StrCnt]) free (StrFunc[StrCnt]);
  return StrFunc[StrCnt]=(char*)calloc(Bites+128,sizeof(char));
}


char *str (double d)
{
  register char *strtmp = BCX_TmpStr(16);
  sprintf(strtmp,"% .15G",d);
  return strtmp;
}


char *curdir (void)
{
  register char *strtmp = BCX_TmpStr(2048);
  GetCurrentDirectory (1024,strtmp);
  return strtmp;
}


// center the window form on the screen, optional, for looks
void Center (HWND hwnd, HWND Xhwnd, HWND Yhwnd)
{
  RECT rect, rectP;
  int  x, y, width, height;
  int  screenwidth, screenheight;
  if(Xhwnd==0)
    {
      RECT  DesktopArea;
      RECT  rc;
      SystemParametersInfo(SPI_GETWORKAREA,0,&DesktopArea,0);
      GetWindowRect(hwnd,&rc);
      SetWindowPos(hwnd,HWND_TOP,
        ((DesktopArea.right-DesktopArea.left)-(rc.right-rc.left))/2+
          DesktopArea.left,((DesktopArea.bottom-DesktopArea.top)-
         (rc.bottom-rc.top))/2 + DesktopArea.top,0,0,SWP_NOSIZE);
      return;
    }
  GetWindowRect (hwnd,&rect);
  GetWindowRect (Xhwnd,&rectP);
  width = rect.right-rect.left;
  x = ((rectP.right-rectP.left)-width)/2 + rectP.left;
  if (Yhwnd==NULL)
  {
      height = rect.bottom-rect.top;
      y = ((rectP.bottom-rectP.top)-height)/2 + rectP.top;
  }
  else
  {
      GetWindowRect(Yhwnd,&rectP);
      height = rect.bottom-rect.top;
      y = ((rectP.bottom-rectP.top)-height)/2+rectP.top;
  }
  screenwidth = GetSystemMetrics(SM_CXSCREEN);
  screenheight = GetSystemMetrics(SM_CYSCREEN);
  if ((x<0)) 
    x=0;
  if ((y<0)) 
    y=0;
  if ((x+width>screenwidth))   
    x = screenwidth-width;
  if ((y+height>screenheight)) 
    y = screenheight-height;
  MoveWindow (hwnd, x, y, width, height, FALSE);
}


// create the windows form
HWND BCX_Form(char *Caption, int X, int Y, int W, int H, int Style, int Exstyle)
{
   HWND  A;
   // assigne default style if none given
   if (!Style)
   {
        Style= WS_MINIMIZEBOX  |
        WS_SIZEBOX      |
        WS_CAPTION      |
        WS_MAXIMIZEBOX  |
        WS_POPUP        |
        WS_SYSMENU;
   }
   A = CreateWindowEx(Exstyle,BCX_ClassName,Caption,
   Style,
   X*BCX_ScaleX,
   Y*BCX_ScaleY,
   (4+W)*BCX_ScaleX,
   (12+H)*BCX_ScaleY,
   NULL,(HMENU)NULL,BCX_hInstance,NULL);
   SendMessage(A,(UINT)WM_SETFONT,(WPARAM)GetStockObject(DEFAULT_GUI_FONT),
     (LPARAM)MAKELPARAM(FALSE,0));
   return A;
}


// color, why not
void BCX_Set_Form_Color (HWND hWnd, COLORREF Kolor)
{
  HBRUSH hbr=CreateSolidBrush(Kolor);
  DeleteObject((HBRUSH)SetClassLong(hWnd,GCL_HBRBACKGROUND,(DWORD)hbr));
  InvalidateRect (hWnd,NULL,TRUE);
}


// the details - corner coordinates,width,height,title
void FormLoad (void)
{
    Form1=BCX_Form("MCI Demo",0,0,197,170);
    SetClassLong(Form1,GCL_STYLE,GetClassLong(Form1,GCL_STYLE)|CS_DBLCLKS);
    BCX_Set_Form_Color(Form1,RGB(0,0,0));
    //  Now create the MCIWnd 
    MCIFrame=MCIWndCreate(Form1,(HINSTANCE)ghInst,WS_CHILD|WS_VISIBLE|MCIWNDF_NOOPEN|MCIWNDF_NOTIFYALL,"");
    AddMenu(Form1);
    Center(Form1);
    Show(Form1);
}


// event message handler
LRESULT CALLBACK WndProc (HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
  static char s[2048];
  memset(&s,0,sizeof(s));
  static char mstr[2048];
  memset(&mstr,0,sizeof(mstr));
  static char mstr1[2048];
  memset(&mstr1,0,sizeof(mstr1));
  while(1)
  {
    if (Msg==WM_CREATE)
    {
      return 0;
      break;
    }
    if (Msg==WM_COMMAND)
    {
      if (LOWORD(wParam)==ID_MENU2)
      {
          MCIWndClose(MCIFrame);
          InitOpenFileName();
          PopFileOpenDlg(Form1,szFile,szFileTitle);
          if(strlen(szFile)>0)
          {
              MCIWndOpen(MCIFrame,szFile,0);
          }
          return 0;
      }
      if(LOWORD(wParam)==ID_MENU3)
      {
          MCIWndClose(MCIFrame);
          ExitProcess(0);
      }
      break;
    }
    if (Msg==MCIWNDM_NOTIFYMODE)
    {
      while(1)
      {
        if ((long)lParam==MCI_MODE_NOT_READY)
        {
          SetWindowText(Form1,"Not Ready");
          break;
        }
        if ((long)lParam==MCI_MODE_PAUSE)
        {
          SetWindowText(Form1,"Paused");
          break;
        }
        if ((long)lParam==MCI_MODE_PLAY)
        {
          SetWindowText(Form1,"Playing");
          break;
        }
        if ((long)lParam==MCI_MODE_STOP)
        {
          SetWindowText(Form1,"Stopped");
          break;
        }
        if ((long)lParam==MCI_MODE_OPEN)
        {
          SetWindowText(Form1,"Opening");
          break;
        }
        if ((long)lParam==MCI_MODE_RECORD)
        {
          SetWindowText(Form1,"Recording");
          break;
        }
        if ((long)lParam==MCI_MODE_SEEK)
        {
          SetWindowText(Form1,"Seeking");
        }
        break;
      }
      break;
    }
    if (Msg==MCIWNDM_NOTIFYMEDIA)
    {
      SetWindowText(Form1,(LPSTR)lParam);
      break;
    }
    if (Msg==MCIWNDM_NOTIFYPOS)
    {
      SetWindowText(Form1,str(MCIWndGetPosition(MCIFrame)));
      break;
    }
    if (Msg==MCIWNDM_NOTIFYERROR)
    {
      SetWindowText(Form1,"MCI ERROR");
      break;
    }
    if (Msg==WM_PAINT)
    {
      //  The VideoWindow is restricted to a ratio of 4:3 here 
      break;
    }
    if (Msg==WM_SIZE)
    {
      static  WORD  Basedsp;
      memset(&Basedsp,0,sizeof(Basedsp));
      static  WORD  Cntr;
      memset(&Cntr,0,sizeof(Cntr));
      Basedsp=(HIWORD(lParam)-20)/3;
      Cntr=(LOWORD(lParam)-(Basedsp*4))/2;
      MoveWindow(MCIFrame,Cntr,0,(Basedsp*4),HIWORD(lParam),TRUE);
      //  Don't forget to close opened Files 
      break;
    }
    if (Msg==WM_CLOSE)
    {
      MCIWndClose(MCIFrame);
      DestroyWindow(Form1);
      return 0;
      break;
    }
    if (Msg==WM_DESTROY)
    {
      MCIWndClose(MCIFrame);
      PostQuitMessage(0);
      return 0;
    }
    break;
  }
  // tidy up and exit program
  if (Msg==WM_DESTROY)
  {
       UnregisterClass(BCX_ClassName,BCX_hInstance);
       PostQuitMessage(0);
  }
  return DefWindowProc(hWnd,Msg,wParam,lParam);
}


// tons of options for the neat file dialog box
int InitOpenFileName (void)
{
  *szFile=0;
  *szFileTitle=0;
  OpenFileName.lStructSize=sizeof(OPENFILENAME);
  OpenFileName.hwndOwner=MCIFrame;
  OpenFileName.hInstance=(HINSTANCE)ghInst;
  OpenFileName.lpstrFilter =
    "Avi Files (*.AVI)\0*.avi\0All Files(*.*)\0*.*\0\0";
  OpenFileName.lpstrCustomFilter=NULL;
  OpenFileName.nMaxCustFilter=0;
  OpenFileName.nFilterIndex=0;
  OpenFileName.lpstrFile=szFile;
  OpenFileName.nMaxFile=MAX_PATH;
  OpenFileName.lpstrFileTitle=szFileTitle;
  OpenFileName.nMaxFileTitle=MAX_PATH;
  OpenFileName.lpstrInitialDir=curdir();
  OpenFileName.lpstrTitle=NULL;
  OpenFileName.nFileOffset=0;
  OpenFileName.nFileExtension=0;
  OpenFileName.lpstrDefExt="*.avi";
  OpenFileName.lCustData=0L;
  OpenFileName.Flags=OFN_SHOWHELP|OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST|OFN_HIDEREADONLY;
  OpenFileName.lpfnHook=NULL;
  OpenFileName.lpTemplateName=NULL;
  return 0;
}


int PopFileOpenDlg (HWND Form1, char *szFile, char *szFileTitle)
{
  OpenFileName.lpstrTitle="Open File";
  OpenFileName.hwndOwner=MCIFrame;
  OpenFileName.lpstrFile=szFile;
  OpenFileName.lpstrFileTitle=szFileTitle;
  OpenFileName.Flags=OFN_EXPLORER|OFN_CREATEPROMPT;
  return GetOpenFileNamePreview(&OpenFileName);
}


BOOL AddMenu (HWND hwndOwner)
{
  MainMenu=CreateMenu();
  FileMenu=CreateMenu();
  InsertMenu(MainMenu,0,MF_POPUP,(UINT)FileMenu,"&File");
  AppendMenu(FileMenu,MF_STRING,ID_MENU2,"&Open");
  AppendMenu(FileMenu,MF_STRING,ID_MENU3,"&Exit");
  // activate the menu 
  if (!SetMenu(hwndOwner,MainMenu))
  {
      return FALSE;
  }
  return TRUE;
}

// ************* credit to a true genius Kevin *****************
//   Created with BCX -- The BASIC To C Translator (ver 5.02)
//  BCX (c) 1999, 2000, 2001, 2002, 2003, 2004 by Kevin Diggins
// *************************************************************
vegaseat 1,735 DaniWeb's Hypocrite Team Colleague

Replaced header iostream, also called Mr. Bloat, with the correct header cstdio. This brought the exe file size down from 219k to 11k! I am learning!

aravind.sn 0 Newbie Poster

Hello this code seems cool, but i cant see the main() here.,,, is it that WINAPI WinMain() which actually starts... as im very interested and begginer in creating windows multimedia application, i just copied the code to an empty project (win32 console application) in vc++ 6.0,, also i just added the libraray MSvfw32.lib and Vfw32.lib.
: but im getting an error:
LINK : fatal error LNK1104: cannot open file "MSvfw32.lib"
please help me in executing this code....

kinng.a380 0 Newbie Poster

i am compiling the above code but it is giving an error

Circular Avi < - Avi.o dependency dropped.
[Build Error] [Avi.exe] Error 1

[where "[B][I][U]Avi[/U][/I][/B]" is my file name]

kinng.a380 0 Newbie Poster

Compilation log is

Compiler: Default compiler
Building Makefile: "E:\Projects\Thai to Eng (Brigstone)\From translator\Revised Name\Revised Name\Revised Name\Dev-CppPortable\App\devcpp\Makefile.win"
Executing make...
make.exe -f "E:\Projects\Thai to Eng (Brigstone)\From translator\Revised Name\Revised Name\Revised Name\Dev-CppPortable\App\devcpp\Makefile.win" all
make.exe: Circular Avi <- Avi.o dependency dropped.

g++.exe -D__DEBUG__ -c Avi -o Avi.o -I"E:/Projects/Thai to Eng (Brigstone)/From translator/Revised Name/Revised Name/Revised Name/Dev-CppPortable/App/devcpp/lib/gcc/mingw32/3.4.2/include" -I"E:/Projects/Thai to Eng (Brigstone)/From translator/Revised Name/Revised Name/Revised Name/Dev-CppPortable/App/devcpp/include/c++/3.4.2/backward" -I"E:/Projects/Thai to Eng (Brigstone)/From translator/Revised Name/Revised Name/Revised Name/Dev-CppPortable/App/devcpp/include/c++/3.4.2/mingw32" -I"E:/Projects/Thai to Eng (Brigstone)/From translator/Revised Name/Revised Name/Revised Name/Dev-CppPortable/App/devcpp/include/c++/3.4.2" -I"E:/Projects/Thai to Eng (Brigstone)/From translator/Revised Name/Revised Name/Revised Name/Dev-CppPortable/App/devcpp/include" -g3

g++.exe: Avi: linker input file unused because linking not done

g++.exe -D__DEBUG__ Avi.o -o "Avi.exe" -L"E:/Projects/Thai to Eng (Brigstone)/From translator/Revised Name/Revised Name/Revised Name/Dev-CppPortable/App/devcpp/lib" lib/libmsvfw32.a lib/libvfw32.a lib/libavicap32.a lib/libavifil32.a lib/libgdi32.a lib/libwinmm.a -g3

g++.exe: Avi.o: No such file or directory

make.exe: *** [Avi.exe] Error 1

Execution terminated

triumphost 120 Posting Whiz

ur missing the Avi.o in your Lib Folder...

emodeath 0 Newbie Poster
[B][B] C:\Dev-Cpp\lib\gcc\mingw32\3.4.2\include\Makefile.win [Build Error]  [Project5.exe] Error 1 [/B][/B]
Sumit_3 0 Newbie Poster

the program encounters this ::

F:\STUDY\C_PROGRAM_FILES\C++_Files\Y Tutorial Dev-Cpp\avi_play\Untitled1.cpp In function 'void FormLoad()':
181 42 F:\STUDY\C_PROGRAM_FILES\C++_Files\Y Tutorial Dev-Cpp\avi_play\Untitled1.cpp [Warning] deprecated conversion from string constant to 'char*' [-Wwrite-strings]
E:\Users\SUMIT\AppData\Local\Temp\cckhiGQt.o Untitled1.cpp:(.text+0x59f): undefined reference to GetStockObject@4' E:\Users\SUMIT\AppData\Local\Temp\cckhiGQt.o Untitled1.cpp:(.text+0x5e0): undefined reference toCreateSolidBrush@4'
E:\Users\SUMIT\AppData\Local\Temp\cckhiGQt.o Untitled1.cpp:(.text+0x60b): undefined reference to DeleteObject@4' E:\Users\SUMIT\AppData\Local\Temp\cckhiGQt.o Untitled1.cpp:(.text+0x6ea): undefined reference toMCIWndCreateA'
E:\Users\SUMIT\AppData\Local\Temp\cckhiGQt.o Untitled1.cpp:(.text+0xd30): undefined reference to GetOpenFileNamePreviewA@4' e:\program files\dev-cpp\mingw32\mingw32\bin\ld.exe E:\Users\SUMIT\AppData\Local\Temp\cckhiGQt.o: bad reloc address 0x13 in section.eh_frame'
e:\program files\dev-cpp\mingw32\mingw32\bin\ld.exe final link failed: Invalid operation
F:\STUDY\C_PROGRAM_FILES\C++_Files\Y Tutorial Dev-Cpp\avi_play\collect2.exe [Error] ld returned 1 exit status

--- what to do?...
please solve this...

Sumit_3 0 Newbie Poster

please see the above post....

triumphost 120 Posting Whiz

You need to link to GDI32

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.