zoukankan      html  css  js  c++  java
  • directdraw显示yuv422(yuy2) 分类: VC++ 2013-11-14 14:58 932人阅读 评论(0) 收藏


    #include <mmsystem.h>
    void CshowpicDlg::OnBnClickedButton3()
    {
     // TODO: 在此添加控件通知处理程序代码

        height=width=widthBytes=0;
     m_screen.SetWindowPos(&CWnd::wndBottom,0,0,720,576, SWP_NOMOVE | SWP_SHOWWINDOW);
     UpdateWindow();
     main_window_handle = m_screen.GetSafeHwnd();
       
     if(DD_OK!=(DirectDrawCreateEx(NULL, (void **)&lpdd7, IID_IDirectDraw7, NULL)))
     {
      return ;
     }
     // set the cooperative level for full-screen mode
     if(DD_OK != lpdd7->SetCooperativeLevel(AfxGetMainWnd()->GetSafeHwnd(), DDSCL_NORMAL))
     {
      return ;
     }
     /*设置控制级时,如果应用程序请求了 DDSCL_NORMAL 模式(表明应用程序以普通窗口的形式运行),则不需要提供一个指定窗口的句柄.给窗口句柄参数为 NULL, 所有的窗口都可以被设置为普通的控制级. */
     // set the display mode to 640x480x256
     // clear ddsd and set size
     memset(&ddsd,0,sizeof(ddsd));
     ddsd.dwSize = sizeof(ddsd);
     
     // enable valid fields
     ddsd.dwFlags=DDSD_CAPS;
     ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
     // create the primary surface
     
     if(DD_OK!=(lpdd7->CreateSurface(&ddsd, &lpddsprimary, NULL)))
     {
      return ;
     }
     
     // 创建裁剪器
     if (FAILED(lpdd7->CreateClipper(0, &lpDDClipper, NULL)))
      return ;
     // 与窗口工作区关联

     if (FAILED(lpDDClipper->SetHWnd(0, main_window_handle)))
     {
      lpDDClipper->Release();
      return ;
     }
     
     if (FAILED(lpddsprimary->SetClipper(lpDDClipper)))
     {
      lpDDClipper->Release();
      return ;
     }


     //
     memset(&ddsd,0,sizeof(ddsd));
     ddsd.dwSize = sizeof(ddsd);
     DDPIXELFORMAT camdispPixelFormat = {sizeof(DDPIXELFORMAT), DDPF_FOURCC, mmioFOURCC('Y','U','Y','2'), 0,0,0,0,0}; 
     ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT;
     ddsd.dwWidth = 720;
     ddsd.dwHeight = 576;
     ddsd.dwBackBufferCount = 0;
     ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN| DDSCAPS_VIDEOMEMORY;
     ddsd.ddpfPixelFormat = camdispPixelFormat;
     //
     
     if(DD_OK!=(lpdd7->CreateSurface(&ddsd, &lpddsmypage[0], NULL)))
     {
      return ;
     }

     POINT p;

     p.x = 0; p.y = 0;
     m_screen.ClientToScreen(&p);//获取屏幕顶点
     // m_screen.GetClientRect(&rcRectDest);

     rcRectDest.left = 0;  rcRectDest.top=0;  rcRectDest.right = 720;  rcRectDest.bottom = 576;


     OffsetRect(&rcRectDest, p.x, p.y);//把窗口区域转化为屏幕区域坐标

     SetRect(&rcRectSrc, 0, 0, 720, 576);//初始化窗口区域
     /////////////////////////////////////////////////////////////
     FILE *fp;
     fp = fopen("D:\6089.DAT","rb+");
     buf[0] = new BYTE[720*2*576];
     for (int i=0;i<200;i++)
     {
      if(DD_OK != lpddsmypage[0]->Lock(NULL,&ddsd,DDLOCK_WAIT|DDLOCK_SURFACEMEMORYPTR,NULL))
      {
       return ;
      }

      UCHAR  *bmp_buffer = (UCHAR *)ddsd.lpSurface;
    ///////////////////////////提取数据/////////////////////////////////////////////
      fread(buf[0],720*2*576,1,fp); 
      for (int k=0;k<576;k++)
      {
       memcpy(bmp_buffer+k*ddsd.lPitch,buf[0]+k*720*2,720*2);
      }
         Sleep(40);
    //////////////////////////////////////////////////////////////////////////
      //memcpy(bmp_buffer,buf[0],720*576*2);

      if(DD_OK != lpddsmypage[0]->Unlock(NULL))
      {
       return ;
      }
      if(DD_OK != lpddsprimary->Blt( &rcRectDest, lpddsmypage[0], &rcRectSrc, DDBLT_WAIT, NULL))
      {
       return ;
      }
     }
     fclose(fp);
     if(lpddsmypage)
     {
      lpddsmypage[0]->Release();
      lpddsmypage[0]=NULL;
     }
     MessageBox(_T("over"));
    }

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    The Quad
    将OrCAD Capture CIS的设计文件(.dsn)导入到PADS Logic VX.2.3
    OrCAD Capture CIS 16.6 将版本16.6的设计文件另存为版本16.2的设计文件
    Eclipse IDE 添加jar包到Java工程中
    PADS Logic VX.2.3 修改软件界面语言
    切换Allegro PCB Editor
    Allegro PCB Design GXL (legacy) 将brd文件另存为低版本文件
    Allegro PCB Design GXL (legacy) 设置自动保存brd文件
    Could not create an acl object: Role '16'
    windows 下apache开启FastCGI
  • 原文地址:https://www.cnblogs.com/mao0504/p/4706724.html
Copyright © 2011-2022 走看看