我用picture控件显示视频。现在想做一个视频快照,保存其中一帧的图片。下面代码这样写不知行不? 
CStatic* Rect=(CStatic*)GetDlgItem(IDC_VIDEO);
RECT rc;
    Rect->GetClientRect(&rc);
    HDC hdc=::GetDC(Rect->m_hWnd);
    HBITMAP bm=CreateCompatibleBitmap(hdc,rc.right,rc.bottom);
    HDC memDC=CreateCompatibleDC(hdc);
    HBITMAP hob=(HBITMAP)SelectObject(memDC,bm);
BitBlt(hdc,0,0,rc.right,rc.bottom,memDC,0,0,SRCCOPY); BITMAP  btm;
 bm.GetBitmap(&btm);//编译这里出错: 
error C2228: left of '.GetBitmap' must have class/struct/union type 
怎么回事?
 DWORD  size = btm.bmWidthBytes * btm.bmHeight;
 LPSTR lpData =(LPSTR)GlobalAllocPtr(GPTR, size);
 BITMAPFILEHEADER   bfh;
/////////////////////////////////////////////
 BITMAPINFOHEADER  bih;
 bih.biBitCount = btm.bmBitsPixel;
 bih.biClrImportant = 0;
 bih.biClrUsed = 0;
 bih.biCompression = 0;
 bih.biHeight = btm.bmHeight;
 bih.biPlanes = 1;
 bih.biSize = sizeof(BITMAPINFOHEADER);
 bih.biSizeImage = size;
 bih.biWidth = btm.bmWidth;
 bih.biXPelsPerMeter = 0;
 bih.biYPelsPerMeter = 0;
 GetDIBits(hdc,bm,0,bih.biHeight,lpData,(BITMAPINFO*)&bih,DIB_RGB_COLORS);
 bfh.bfReserved1 = bfh.bfReserved2 = 0;
 bfh.bfType = ((WORD)('M'<< 8)|'B');
 bfh.bfSize = 54 + size;
 bfh.bfOffBits = 54; CFileDialog dlg(false,_T("BMP"),_T("*.bmp"),OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,_T("*.bmp|*.bmp|*.*|*.*|"));
 if (dlg.DoModal()==IDOK)
 {
  CFile  bf;
  CString ss=dlg.GetPathName();
  if(bf.Open(ss, CFile::modeCreate | CFile::modeWrite))
  {
   bf.WriteHuge(&bfh, sizeof(BITMAPFILEHEADER));
   bf.WriteHuge(&bih, sizeof(BITMAPINFOHEADER));
   bf.WriteHuge(lpData, size);
   bf.Close();
  }
  GlobalFreePtr(lpData);
 }请高手指点,谢谢!!

解决方案 »

  1.   

    CBitmap* pBitmap = CBitmap::FromHandle(bm);
    pBitmap->GetBitmap(&btm);应该是这样吧。
      

  2.   

    这里过去了,但是又有一个问题
    GlobalAllocPtr' : undeclared identifier
      

  3.   

    原来没有加#include "WINDOWSX.H"
      

  4.   

    现在编译是通过了,但是保存的图片是黑屏,什么也没有?
    我的自绘视频框代码如下
    void CMainFrame::OnVideoData(CStatic* Rect,char* Video)
    {
        RECT rc;
        Rect->GetClientRect(&rc);
        HDC hdc=::GetDC(Rect->m_hWnd);
        HBITMAP m_hBmp=CreateCompatibleBitmap(hdc,rc.right,rc.bottom);
        HDC hMemDC=CreateCompatibleDC(hdc);
        HBITMAP hob=(HBITMAP)SelectObject(hMemDC,m_hBmp);
        if(hob)
        {
            char* p;
            p=Video;
            BITMAPINFOHEADER* pbih=&m_CodecMgr[0].m_BmpU.bmiHeader;
            
            HDRAWDIB h=DrawDibOpen();
            DrawDibDraw(h,hMemDC,0,0,rc.right,rc.bottom,pbih,p,0,0,pbih->biWidth,pbih->biHeight,DDF_NOTKEYFRAME);
            DrawDibClose(h);
            BitBlt(hdc,0,0,rc.right,rc.bottom,hMemDC,0,0,SRCCOPY);
            SelectObject(hMemDC,hob);
            pbih=NULL;
            delete pbih;
        }
        DeleteDC(hMemDC);
        ::ReleaseDC(Rect->m_hWnd,hdc);
        DeleteObject(m_hBmp);
    }
      

  5.   

    你的播放器用的是什么renderer?如果使用了directdraw加速,这样是截不了图的,
    只能写filter实现,如果是VMR就没事
      

  6.   

    我用的是vfw包,我发现,不管有没有视频源,只要我点击快照按钮,出现保存对话框,IDC_VIDEO控件区自动出现黑屏。