我用的是VC6.0,完成了视频有加载播放,还想实现像现在常用播放器一样的视频截图,但是不知道应该怎么去着手,请各位大侠可以指点指点,最好是能够有相关的源程序,发到小弟的邮箱,[email protected].在这先谢过了

解决方案 »

  1.   

    个截图的代码给你,你好好的看一看(这里面我还把位图写进了文件):
    HBITMAP CClipPictureDlg::ScreenCapture(LPSTR filename,WORD bitCount,LPRECT lpRect)
    {
      HBITMAP hBitmap;
      HDC hScreenDC=CreateDC("DISPLAY",NULL,NULL,NULL);
      HDC hmemDC=CreateCompatibleDC(hScreenDC);
      int ScreenWidth=GetDeviceCaps(hScreenDC,HORZRES);
      int ScreenHeight=GetDeviceCaps(hScreenDC,VERTRES);
      HBITMAP hOldBM;
      PVOID lpData;
      int startX;
      int startY;
      int width;
      int height;
      DWORD BitmapSize;
      DWORD BitsOffset;
      DWORD ImageSize;
      DWORD FileSize;
      BITMAPINFOHEADER bmInfo;
      BITMAPFILEHEADER bmFileHeader;
      HANDLE bmFile,hpal,holdpal=NULL;;
      DWORD dwWritten;
      if(lpRect==NULL)
      {
      startX=startY=0;
    width=ScreenWidth;
    height=ScreenHeight;
      }
      else
      {
      startX=lpRect->left;
    startY=lpRect->top;
    width=lpRect->right-lpRect->left;
    height=lpRect->bottom-lpRect->top;
      }
      hBitmap=CreateCompatibleBitmap(hScreenDC,width,height);
      hOldBM=(HBITMAP)SelectObject(hmemDC,hBitmap);
      BitBlt(hmemDC,0,0,width,height,hScreenDC,startX,startY,SRCCOPY);
      hBitmap=(HBITMAP)SelectObject(hmemDC,hOldBM);
      if(filename==NULL)
      {
      DeleteDC(hScreenDC);
    DeleteDC(hmemDC);
    return hBitmap;
      }
      BitmapSize=((((width*32)+31)/32)*4)*height;
      lpData=HeapAlloc(GetProcessHeap(),HEAP_NO_SERIALIZE,BitmapSize);
      ZeroMemory(lpData,BitmapSize);
      ZeroMemory(&bmInfo,sizeof(BITMAPINFOHEADER));
      bmInfo.biSize=sizeof(BITMAPINFOHEADER);
      bmInfo.biWidth=width;
      bmInfo.biHeight=height;
      bmInfo.biPlanes=1;
      bmInfo.biBitCount=bitCount;
      bmInfo.biCompression=BI_RGB;
      ZeroMemory(&bmFileHeader,sizeof(BITMAPFILEHEADER));
      BitsOffset=sizeof(BITMAPFILEHEADER)+bmInfo.biSize;
      ImageSize=((((bmInfo.biWidth*bmInfo.biBitCount)+31)/32)*4)*bmInfo.biHeight;
      FileSize=BitsOffset+ImageSize;
      bmFileHeader.bfType=0x4d42;//'B'+('M'<<8);
      bmFileHeader.bfSize=FileSize;
      bmFileHeader.bfOffBits=BitsOffset;
      hpal = GetStockObject(DEFAULT_PALETTE);
    if (hpal)
    {
    holdpal = SelectPalette(hmemDC, (HPALETTE)hpal, false);
    RealizePalette(hmemDC);
    }
      GetDIBits(hmemDC,hBitmap,0,bmInfo.biHeight,lpData,(BITMAPINFO *)&bmInfo,DIB_RGB_COLORS);
      if (holdpal)
    {
    SelectPalette(hmemDC, (HPALETTE)holdpal, true);
    RealizePalette(hmemDC);
    }
      bmFile=CreateFile(filename,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
      if(bmFile==INVALID_HANDLE_VALUE)
      {
      AfxMessageBox("Create File Error!!");
      }
      WriteFile(bmFile,&bmFileHeader,sizeof(BITMAPFILEHEADER),&dwWritten,NULL);
      WriteFile(bmFile,&bmInfo,sizeof(BITMAPINFOHEADER),&dwWritten,NULL);
      WriteFile(bmFile,lpData,ImageSize,&dwWritten,NULL);
      CloseHandle(bmFile);
      HeapFree(GetProcessHeap(),HEAP_NO_SERIALIZE,lpData);
      ::ReleaseDC(0,hScreenDC);
      DeleteDC(hmemDC);
      return hBitmap;
    }
      

  2.   

    BitBlt(hmemDC,0,0,width,height,hScreenDC,startX,startY,SRCCOPY);
    你换换这个参数试试吧@
      

  3.   

    好像不行,是不是应该用VFW来编程,对视频数据流进行控制?
      

  4.   


    视频播放是用什么做的,在那个SDK里应该有截图的函数,如果没有,要自己用diectshow做视频播放