home *** CD-ROM | disk | FTP | other *** search
/ Best Tools for JAVA / Best Tools for JAVA.iso / GRAPHICS / CAVI32 / CAVI32.ZIP / CAVI32.C < prev    next >
Encoding:
C/C++ Source or Header  |  1995-04-26  |  15.9 KB  |  457 lines

  1. /******************************************************************************
  2. *              CAVI: Creates AVI video from static bitmap images              *
  3. *                    >>VERY<< as-is program by Mark Gamber                    *
  4. *                        Portions from Microsoft Corp.                        *
  5. ******************************************************************************/
  6.  
  7. #include "windows.h"
  8. #include "vfw.h"
  9. #include "commctrl.h"
  10.  
  11. // === Function Prototypes ====================================================
  12.  
  13. BOOL WINAPI MainDlgProc( HWND, UINT, WPARAM, LPARAM );
  14. BOOL WINAPI AboutDlgProc( HWND, UINT, WPARAM, LPARAM );
  15. BOOL WINAPI PlayDlgProc( HWND, UINT, WPARAM, LPARAM );
  16. BOOL AddFile( HWND, BOOL );
  17. BOOL RemoveFile( HWND );
  18. BOOL SaveAVI( HWND );
  19. HANDLE MakeDib( HBITMAP, UINT );
  20. BOOL ResizeControls( HWND, LPARAM );
  21.  
  22. // === Global Variables =======================================================
  23.  
  24. HINSTANCE hInst;
  25. HWND hMainWnd;
  26.  
  27. // === Application Entry Point ================================================
  28.  
  29. int APIENTRY WinMain( HINSTANCE hInstance, HINSTANCE hPrev, LPSTR lpCmd,
  30.                       int nShow )
  31. {
  32.    WNDCLASS wc;
  33.  
  34.    hInst = hInstance;
  35.    if( ! GetClassInfo( NULL, WC_DIALOG, &wc ) )
  36.       return( FALSE );
  37.    wc.lpszClassName = "CAVI32";
  38.    wc.hInstance = hInstance;
  39.    wc.hIcon = LoadIcon( NULL, IDI_APPLICATION );
  40.    wc.cbWndExtra = DLGWINDOWEXTRA;
  41.    wc.lpfnWndProc = DefDlgProc;
  42.    if( ! RegisterClass( &wc ) )
  43.       return( FALSE );
  44.  
  45.    DialogBox( hInstance, MAKEINTRESOURCE( 10000 ), NULL, MainDlgProc );
  46.    return( FALSE );
  47. }
  48.  
  49. // === Main Window (Dialog Box) ===============================================
  50.  
  51. BOOL WINAPI MainDlgProc( HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam )
  52. {
  53.    switch( msg )
  54.    {
  55.       case WM_INITDIALOG:
  56.       {
  57.          HWND hAni;
  58.          POINT pt;
  59.          RECT Rect;
  60.  
  61.          InitCommonControls();                       //  Initialize control DLL
  62.          GetWindowRect( GetDlgItem( hDlg, 1000 ), &Rect );
  63.          DestroyWindow( GetDlgItem( hDlg, 1000 ) );
  64.          pt.x = Rect.left;
  65.          pt.y = Rect.top;
  66.          ScreenToClient( hDlg, &pt );
  67.          hAni = Animate_Create( hDlg, 1000, WS_CHILD | WS_VISIBLE |
  68.                                 ACS_CENTER | ACS_TRANSPARENT, hInst );
  69.          if( hAni )
  70.          {                          //  Give it the AVI in this app's resources
  71.             Animate_Open( hAni, "CUSTAVI" );
  72.             Animate_Play( hAni, 0, -1, -1 );
  73.             SetWindowPos( hAni, NULL, pt.x, pt.y, 32, 32,
  74.                           SWP_NOZORDER );
  75.          }
  76.  
  77.          SetDlgItemText( hDlg, 105, "2" );      //  Init to 2 frames per second
  78.          return( TRUE );
  79.       }
  80.  
  81.  
  82.       case WM_SIZE:
  83.          return( ResizeControls( hDlg, lParam ) );
  84.  
  85.  
  86.       case WM_COMMAND:
  87.          if( wParam == IDCANCEL )                           //  Exit dialog box
  88.          {
  89.             EndDialog( hDlg, TRUE );
  90.             return( TRUE );
  91.          }
  92.          if( wParam == 100 )
  93.             return( AddFile( hDlg, FALSE ) );                  //  Add a bitmap
  94.          if( wParam == 101 )
  95.             return( AddFile( hDlg, TRUE ) );                //  Insert a bitmap
  96.          if( wParam == 102 )
  97.             return( RemoveFile( hDlg ) );                   //  Remove a bitmap
  98.          if( wParam == 103 )
  99.             return( SaveAVI( hDlg ) );                     //  Save to AVI file
  100.          if( wParam == 104 )                              //  Display About box
  101.             return( DialogBox( hInst, MAKEINTRESOURCE( 10001 ), hDlg,
  102.                                AboutDlgProc ) );
  103.          if( wParam == 107 )                               //  Play an AVI file
  104.             return( DialogBox( hInst, MAKEINTRESOURCE( 10002 ), hDlg,
  105.                                PlayDlgProc ) );
  106.          break;
  107.    }
  108.    return( FALSE );
  109. }                                                      //  End of MainDlgProc()
  110.  
  111. // ============================================================================
  112.  
  113. BOOL ResizeControls( HWND hDlg, LPARAM lParam )
  114. {
  115.    RECT Rect;
  116.    HDWP hDwp;
  117.    int iSize;
  118.    POINT pt;
  119.  
  120.    hDwp = BeginDeferWindowPos( 7 );
  121.    GetWindowRect( GetDlgItem( hDlg, 100 ), &Rect );
  122.    iSize = LOWORD( lParam ) / 6;
  123.  
  124.    DeferWindowPos( hDwp, GetDlgItem( hDlg, 100 ), NULL, 
  125.                    0, 0, iSize, Rect.bottom - Rect.top,
  126.                    SWP_NOZORDER );
  127.    DeferWindowPos( hDwp, GetDlgItem( hDlg, 101 ), NULL, 
  128.                    iSize, 0, iSize, Rect.bottom - Rect.top,
  129.                    SWP_NOZORDER );
  130.    DeferWindowPos( hDwp, GetDlgItem( hDlg, 102 ), NULL, 
  131.                    iSize * 2, 0, iSize, Rect.bottom - Rect.top,
  132.                    SWP_NOZORDER );
  133.    DeferWindowPos( hDwp, GetDlgItem( hDlg, 107 ), NULL, 
  134.                    iSize * 3, 0, iSize, Rect.bottom - Rect.top,
  135.                    SWP_NOZORDER );
  136.    DeferWindowPos( hDwp, GetDlgItem( hDlg, 103 ), NULL, 
  137.                    iSize * 4, 0, iSize, Rect.bottom - Rect.top,
  138.                    SWP_NOZORDER );
  139.    DeferWindowPos( hDwp, GetDlgItem( hDlg, 104 ), NULL, 
  140.                    iSize * 5, 0, iSize, Rect.bottom - Rect.top,
  141.                    SWP_NOZORDER );
  142.  
  143.    GetWindowRect( GetDlgItem( hDlg, 106 ), &Rect );
  144.    pt.x = Rect.left;
  145.    pt.y = Rect.top;
  146.    ScreenToClient( hDlg, &pt );
  147.  
  148.    DeferWindowPos( hDwp, GetDlgItem( hDlg, 106 ), NULL, 0, 0,
  149.                    LOWORD( lParam ) - ( pt.x * 2 ),
  150.                    HIWORD( lParam ) - pt.y - pt.x,
  151.                    SWP_NOZORDER | SWP_NOMOVE );
  152.    EndDeferWindowPos( hDwp );
  153.    return( TRUE );
  154. }
  155.  
  156. // === Add Bitmap File to Listing =============================================
  157.  
  158. BOOL AddFile( HWND hDlg, BOOL bInsert )
  159. {
  160.    OPENFILENAME ofn;
  161.    char szFile[ 300 ];
  162.    int iItem;
  163.  
  164.    if( bInsert )                  //  If inserting, we need a current selection
  165.    {
  166.       iItem = SendDlgItemMessage( hDlg, 106, LB_GETCURSEL, 0, 0 );
  167.       if( iItem == LB_ERR )                  //  Exit if no selection available
  168.          return( FALSE );
  169.    }
  170.    lstrcpy( szFile, "*.bmp" );                             //  Look for bitmaps
  171.    memset( &ofn, 0, sizeof(OPENFILENAME) );
  172.    ofn.lStructSize = sizeof(OPENFILENAME);
  173.    ofn.hwndOwner = hDlg;
  174.    ofn.lpstrFilter = "Bitmaps\0*.bmp\0All Files\0*.*\0\0";
  175.    ofn.lpstrFile = szFile;
  176.    ofn.nMaxFile = 300;
  177.    ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
  178.    if( ! GetOpenFileName( &ofn ) )             //  Get a filename from the user
  179.       return( FALSE );
  180.  
  181.    if( ! bInsert )                           //  Add or insert into the listbox
  182.       iItem = SendDlgItemMessage( hDlg, 106, LB_ADDSTRING, 0,
  183.                                   (LPARAM)szFile );
  184.    else
  185.       iItem = SendDlgItemMessage( hDlg, 106, LB_INSERTSTRING, iItem,
  186.                                   (LPARAM)szFile );
  187.  
  188.    if( iItem != LB_ERR )                  //  Make new bitmap current selection
  189.    {
  190.       SendDlgItemMessage( hDlg, 106, LB_SETCURSEL, iItem, 0 );
  191.       return( TRUE );
  192.    }
  193.    return( FALSE );
  194. }                                                          //  End of AddFile()
  195.  
  196. // === Remove Listed Bitmap File ==============================================
  197.  
  198. BOOL RemoveFile( HWND hDlg )
  199. {
  200.    int iItem;
  201.                                             //  Get current selection to remove
  202.    iItem = SendDlgItemMessage( hDlg, 106, LB_GETCURSEL, 0, 0 );
  203.    if( iItem == LB_ERR )
  204.       return( FALSE );                                 //  Quit if no selection
  205.                                                        //  Otherwise, remove it
  206.    SendDlgItemMessage( hDlg, 106, LB_DELETESTRING, iItem, 0 );
  207.    return( TRUE );
  208. }                                                       //  End of RemoveFile()
  209.  
  210. // === Save Bitmaps to AVI File ===============================================
  211.  
  212. BOOL SaveAVI( HWND hDlg )
  213. {
  214.    LPBITMAPINFOHEADER lpBih[ 64 ];
  215.    int iCount, i, iRate, junk;
  216.    HANDLE hBmp, hDib;
  217.    char szFile[ 300 ], szOutput[ 300 ];
  218.    HRESULT hResult;
  219.    PAVIFILE pfile;
  220.    AVISTREAMINFO asi;
  221.    PAVISTREAM ps;
  222.    OPENFILENAME ofn;
  223.  
  224.                                                 //  How many bitmaps are there?
  225.    iCount = SendDlgItemMessage( hDlg, 106, LB_GETCOUNT, 0, 0 );
  226.    if( ! iCount )
  227.       return( FALSE );                   //  None? What are we doing here then?
  228.                                                          //  Get playback rates
  229.    iRate = GetDlgItemInt( hDlg, 105, &junk, TRUE );
  230.    if( ! iRate )                        //  Zero sure looks invalid
  231.       return( FALSE );
  232.  
  233.    memset( &ofn, 0, sizeof(OPENFILENAME) );
  234.    lstrcpy( szOutput, "*.avi" );             //  Prepare to get output filename
  235.  
  236.    ofn.lStructSize = sizeof(OPENFILENAME);
  237.    ofn.lpstrFile = szOutput;
  238.    ofn.nMaxFile = 300;
  239.    ofn.lpstrFilter = "AVI Video\0*.avi\0All Files\0*.*\0\0";
  240.    ofn.hwndOwner = hDlg;
  241.    ofn.Flags = OFN_HIDEREADONLY;
  242.    if( ! GetSaveFileName( &ofn ) )
  243.       return( FALSE );                                   //  If cancelled, exit
  244.                                                           //  Max of 64 bitmaps
  245.    memset( lpBih, 0, sizeof(LPBITMAPINFOHEADER) * 64 );
  246.    for( i = 0; i < iCount; i++ )
  247.    {                                      //  Load each image listed in listbox
  248.       SendDlgItemMessage( hDlg, 106, LB_GETTEXT, i, (LPARAM)szFile );
  249.       hBmp = LoadImage( NULL, szFile, IMAGE_BITMAP, 0, 0,
  250.                         LR_LOADFROMFILE | LR_DEFAULTCOLOR | 
  251.                         LR_LOADTRANSPARENT );
  252.       if( hBmp )
  253.       {
  254.          hDib = MakeDib( hBmp, 8 );               //  Turn image into 8 bit DIB
  255.          if( hDib )                                  //  Save DIB info in array
  256.             lpBih[ i ] = (LPBITMAPINFOHEADER)GlobalLock( hDib );
  257.       }
  258.    }
  259.    AVIFileInit();                                            //  Initialize AVI
  260.    pfile = NULL;
  261.    ps = NULL;
  262.                                                        //  Open the output file
  263.    hResult = AVIFileOpen( &pfile, szOutput, OF_WRITE | OF_CREATE, NULL );
  264.    if( hResult == AVIERR_OK )
  265.    {
  266.       memset( &asi, 0, sizeof(AVISTREAMINFO) );             //  Hey, it opened!
  267.       asi.fccType = streamtypeVIDEO;                 //  Now prepare the stream
  268.       asi.fccHandler = 0;
  269.       asi.dwScale = 1;
  270.       asi.dwRate = iRate;
  271.       asi.dwSuggestedBufferSize = lpBih[ 0 ]->biSizeImage;
  272.       SetRect( &asi.rcFrame, 0, 0, 
  273.                 (int)lpBih[ 0 ]->biWidth, (int)lpBih[ 0 ]->biHeight );
  274.  
  275.       hResult = AVIFileCreateStream( pfile, &ps, &asi );
  276.       if( hResult == AVIERR_OK )
  277.       {
  278.          hResult = AVIStreamSetFormat( ps, 0, lpBih[ 0 ],
  279.                                        lpBih[ 0 ]->biSize + 
  280.                                        ( lpBih[ 0 ]->biClrUsed * 
  281.                                        sizeof(RGBQUAD) ) );
  282.          if( hResult == AVIERR_OK )
  283.          {
  284.             for( i = 0; i < iCount; i++ )
  285.             {                              //  Now write out all the bitmaps
  286.                hResult = AVIStreamWrite( ps, i, 1,
  287.                                          (LPBYTE)lpBih[ i ] +
  288.                                             lpBih[ i ]->biSize +
  289.                                          ( lpBih[ i ]->biClrUsed * 
  290.                                          sizeof(RGBQUAD) ),
  291.                                          lpBih[ i ]->biSizeImage,
  292.                                          AVIIF_KEYFRAME, NULL,
  293.                                          NULL );
  294.                if( hResult != AVIERR_OK )
  295.                   break;
  296.             }
  297.          }
  298.       }
  299.     }
  300.     if( ps )
  301.       AVIStreamClose( ps );
  302.    if( pfile )
  303.       AVIFileClose( pfile );
  304.  
  305.    AVIFileExit();                                  //  Close down AVI from here
  306.    for( i = 0; i < iCount; i++ )
  307.    {
  308.       if( lpBih[ i ] )               //  Loop through and clean out all bitmaps
  309.       {
  310.          hDib = GlobalHandle( lpBih[ i ] );
  311.          GlobalUnlock( hDib );
  312.          GlobalFree( hDib );
  313.       }
  314.       else
  315.          break;
  316.    }
  317.    return( TRUE );
  318. }
  319.  
  320. // === Turn Bitmap into DIB for AVI Output ====================================
  321.  
  322. HANDLE MakeDib( HBITMAP hbitmap, UINT bits )
  323. {
  324.    HANDLE hdib;
  325.    HDC hdc;
  326.    BITMAP bitmap;
  327.    UINT wLineLen;
  328.    DWORD dwSize;
  329.    DWORD wColSize;
  330.    LPBITMAPINFOHEADER lpbi;
  331.    LPBYTE lpBits;
  332.     
  333.     
  334.    GetObject( hbitmap, sizeof( BITMAP ), &bitmap );
  335.    wLineLen = ( bitmap.bmWidth * bits + 31 ) / 32 * 4;
  336.    wColSize = sizeof(RGBQUAD) * ( ( bits <= 8 ) ? 1 << bits : 0 );
  337.    dwSize = sizeof( BITMAPINFOHEADER ) + wColSize +
  338.             (DWORD)(UINT)wLineLen * (DWORD)(UINT)bitmap.bmHeight;
  339.  
  340.    hdib = GlobalAlloc( GHND, dwSize );
  341.    if( ! hdib )
  342.       return( hdib );
  343.  
  344.    lpbi = (LPBITMAPINFOHEADER)GlobalLock( hdib );
  345.  
  346.    lpbi->biSize = sizeof(BITMAPINFOHEADER);
  347.    lpbi->biWidth = bitmap.bmWidth;
  348.    lpbi->biHeight = bitmap.bmHeight;
  349.    lpbi->biPlanes = 1;
  350.    lpbi->biBitCount = (WORD)bits;
  351.    lpbi->biCompression = BI_RGB;
  352.    lpbi->biSizeImage = dwSize - sizeof(BITMAPINFOHEADER) - wColSize;
  353.    lpbi->biXPelsPerMeter = 0;
  354.    lpbi->biYPelsPerMeter = 0;
  355.    lpbi->biClrUsed = ( bits <= 8 ) ? 1 << bits : 0;
  356.    lpbi->biClrImportant = 0;
  357.  
  358.    lpBits = (LPBYTE)( lpbi + 1 )+ wColSize;
  359.  
  360.    hdc = CreateCompatibleDC( NULL );
  361.    GetDIBits( hdc, hbitmap, 0, bitmap.bmHeight, lpBits,
  362.               (LPBITMAPINFO)lpbi, DIB_RGB_COLORS );
  363.  
  364.    lpbi->biClrUsed = ( bits <= 8 ) ? 1 << bits : 0;
  365.    DeleteDC( hdc );
  366.  
  367.    return( hdib );
  368. }
  369.  
  370. // ============================================================================
  371.  
  372. BOOL WINAPI AboutDlgProc( HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam )
  373. {
  374.    switch( msg )
  375.    {
  376.       case WM_INITDIALOG:
  377.          return( TRUE );
  378.  
  379.       case WM_COMMAND:
  380.          if( wParam == IDCANCEL )
  381.             EndDialog( hDlg, TRUE );
  382.          break;
  383.    }
  384.    return( FALSE );
  385. }
  386.  
  387. // ============================================================================
  388.  
  389. BOOL WINAPI PlayDlgProc( HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam )
  390. {
  391.    switch( msg )
  392.    {
  393.       case WM_INITDIALOG:
  394.       {
  395.          char szFile[ 300 ];
  396.          OPENFILENAME ofn;
  397.          HWND hCtrl;
  398.          RECT Rect;
  399.  
  400.          lstrcpy( szFile, "*.avi" );
  401.          memset( &ofn, 0, sizeof(OPENFILENAME) );
  402.          ofn.lStructSize = sizeof(OPENFILENAME);
  403.          ofn.hwndOwner = hDlg;
  404.          ofn.lpstrFilter = "AVI Files\0*.avi\0All Files\0*.*\0\0";
  405.          ofn.lpstrFile = szFile;
  406.          ofn.nMaxFile = 300;
  407.          ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
  408.          if( ! GetOpenFileName( &ofn ) )
  409.          {
  410.             EndDialog( hDlg, TRUE );
  411.             return( TRUE );
  412.          }
  413.          hCtrl = MCIWndCreate( hDlg, hInst, MCIWNDF_NOPLAYBAR,
  414.                                szFile );
  415.          if( ! hCtrl )
  416.          {
  417.             EndDialog( hDlg, TRUE );
  418.             return( TRUE );
  419.          }
  420.          GetClientRect( hDlg, &Rect );
  421.          SetWindowPos( hCtrl, NULL, 0, 0, Rect.right, Rect.bottom - 30,
  422.                        SWP_NOMOVE | SWP_NOZORDER );
  423.          SetProp( hDlg, "AVIWND", hCtrl );
  424.          MCIWndHome( hCtrl );
  425.          return( TRUE );
  426.       }
  427.  
  428.       case WM_SIZE:
  429.          SetWindowPos( GetProp( hDlg, "AVIWND" ), NULL, 0, 0, 
  430.                        LOWORD( lParam ) - 2, HIWORD( lParam ) - 30,
  431.                        SWP_NOMOVE | SWP_NOZORDER );
  432.          break;
  433.  
  434.  
  435.       case WM_COMMAND:
  436.          if( wParam == IDCANCEL )
  437.          {
  438.             MCIWndDestroy( GetProp( hDlg, "AVIWND" ) );
  439.             RemoveProp( hDlg, "AVIWND" );
  440.             EndDialog( hDlg, TRUE );
  441.          }
  442.          if( wParam == IDOK )
  443.          {
  444.             MCIWndHome( GetProp( hDlg, "AVIWND" ) );
  445.             MCIWndPlay( GetProp( hDlg, "AVIWND" ) );
  446.             MCIWndSetRepeat( GetProp( hDlg, "AVIWND" ), -1 );
  447.             break;
  448.          }
  449.          break;
  450.    }
  451.    return( FALSE );
  452. }
  453.  
  454. // ============================================================================
  455.  
  456.  
  457.