转载自:www.csdn.net


/////////////////////////////////////////////////////////////////////////////
// CAvitobmpDlg message handlers

BOOL CAvitobmpDlg::OnInitDialog()
{
    CDialog::OnInitDialog();

    // Add "About..." menu item to system menu.

    // IDM_ABOUTBOX must be in the system command range.
    ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
    ASSERT(IDM_ABOUTBOX < 0xF000);

    CMenu* pSysMenu = GetSystemMenu(FALSE);
    if (pSysMenu != NULL)
    {
        CString strAboutMenu;
        strAboutMenu.LoadString(IDS_ABOUTBOX);
        if (!strAboutMenu.IsEmpty())
        {
            pSysMenu->AppendMenu(MF_SEPARATOR);
            pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
        }
    }

    // Set the icon for this dialog.  The framework does this automatically
    //  when the application's main window is not a dialog
    SetIcon(m_hIcon, TRUE);            // Set big icon
    SetIcon(m_hIcon, FALSE);        // Set small icon
   
    // TODO: Add extra initialization here
   
    return TRUE;  // return TRUE  unless you set the focus to a control
}

void CAvitobmpDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
    if ((nID & 0xFFF0) == IDM_ABOUTBOX)
    {
        CAboutDlg dlgAbout;
        dlgAbout.DoModal();
    }
    else
    {
        CDialog::OnSysCommand(nID, lParam);
    }
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CAvitobmpDlg::OnPaint()
{
    if (IsIconic())
    {
        CPaintDC dc(this); // device context for painting

        SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

        // Center icon in client rectangle
        int cxIcon = GetSystemMetrics(SM_CXICON);
        int cyIcon = GetSystemMetrics(SM_CYICON);
        CRect rect;
        GetClientRect(&rect);
        int x = (rect.Width() - cxIcon + 1) / 2;
        int y = (rect.Height() - cyIcon + 1) / 2;

        // Draw the icon
        dc.DrawIcon(x, y, m_hIcon);
    }
    else
    {
        CDialog::OnPaint();
    }
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CAvitobmpDlg::OnQueryDragIcon()
{
    return (HCURSOR) m_hIcon;
}

void CAvitobmpDlg::OnButtonok()
{
if(m_avifile==""||m_target=="")  //note fill in data first.
{
       MessageBox("PLS SELECT FILE OR FILL IN DATA FIRST!","NOTE",MB_ICONSTOP);
return;
}
      AfxGetApp()->DoWaitCursor(1);
      GetDlgItem(IDC_BUTTONOK)->EnableWindow(false);
       PAVIFILE  pfile;//Pointer  to  a  buffer  that  receives  the  new  IAVIFile  interface  pointer.                                     
           AVIFILEINFO    pfi;                         
           PAVISTREAM    pavi;                                                 
           PGETFRAME  pgf;                                                                                     
           long  length,  start; 

           //initializes  the  AVIFile  library,as AVIFileExit()。 
           //Call  AVIFileInit()  before  using  any  other  AVIFile  functions             
           AVIFileInit(); 
           AVIFileOpen(&pfile,m_avifile,OF_READ  |OF_SHARE_DENY_NONE,NULL); 
            
           //obtains  information  about  an  AVI  file 
           AVIFileInfo(pfile,&pfi,sizeof(AVIFILEINFO)); 
           AVIFileGetStream(pfile,&pavi,streamtypeVIDEO,0); 
           length=AVIStreamLength(pavi); 
           start=AVIStreamStart(pavi); 

           AVISTREAMINFO  si; 
           AVIStreamInfo(pavi,  &si,  sizeof(si)); 

           pgf  =  AVIStreamGetFrameOpen(pavi,  NULL); 
           //GET FIRST BMP
           LPBITMAPINFOHEADER  bmp1; 
           bmp1=  (LPBITMAPINFOHEADER)AVIStreamGetFrame(pgf,  1); 
           CClientDC  dc(this); 
         
           //DEFAUT HEAD
           BITMAPINFOHEADER  bmih; 
           memset(&bmih,0,sizeof(BITMAPINFOHEADER)); 
           bmih.biBitCount=bmp1->biBitCount; 
           bmih.biSize  =  sizeof(BITMAPINFOHEADER); 
         
          bmih.biWidth  =  pfi.dwWidth; 
          bmih.biHeight  =  pfi.dwHeight; 
          bmih.biPlanes  =bmp1->biPlanes;  //Modif By Deng Chun Ling
         
           bmih.biCompression  =BI_RGB; 
           bmih.biXPelsPerMeter  =  0; 
           bmih.biYPelsPerMeter  =  0; 
          
           BITMAPFILEHEADER  bmfh; 
       bmfh.bfSize  =  sizeof(bmfh); 
         //bmfh.bfSize=sizeof(bmp1);  //modi by deng chun ling  
       bmfh.bfOffBits  =  sizeof(bmfh)  +  sizeof(bmih); //BITMAPINFOHEADER+BITMAPINFOHEADER
       bmfh.bfType  =  (int)'M'  *  256  +  'B'; 
      // bmfh.bfType=0x424D;
       bmfh.bfReserved1  =  0; 
       bmfh.bfReserved2  =  0; 

           BYTE  *lpbuffa; 
          
           lpbuffa=new BYTE[(((pfi.dwWidth*bmih.biBitCount)+31)/8)*pfi.dwHeight];
   

           BYTE*  lpbuff;

 

   m_editqty=pfi.dwLength;
   UpdateData(false);
//Limite to 100 
//            if  (pfi.dwLength>100) pfi.dwLength=100;
            
                   
           for(LONG  i=1;i<(LONG)pfi.dwLength;i++) 
           { 
                       lpbuff=lpbuffa; 
                       lpbuff=(BYTE  *)AVIStreamGetFrame(pgf,i);// 
                       lpbuff+=40; 
                       //TranslationDIB1(lpbuff,bmih.biWidth,bmih.biHeight,10,50);//平移function 
                       char  name1[100]; 
                       strcpy(name1,m_target);//目的路徑 

                                         
                       TCHAR  name3[50]; 
                       wsprintf(name3, TEXT("Bitmap%5.5ld.bmp\0"),  long(i) ); 
                       strcat(name1,name3); 
            }