VC编程之directdraw显示rgb555
小标 2018-08-14 来源 : 阅读 1431 评论 0

摘要:本文主要向大家介绍了VC编程之directdraw显示rgb555,通过具体的内容向大家展示,希望对大家学习VC编程有所帮助。

本文主要向大家介绍了VC编程之directdraw显示rgb555,通过具体的内容向大家展示,希望对大家学习VC编程有所帮助。

// 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','1','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.dwSize = sizeof(DDPIXELFORMAT);
 ddsd.ddpfPixelFormat.dwFlags  = DDPF_RGB ;
 ddsd.ddpfPixelFormat.dwFourCC = 0;
 ddsd.ddpfPixelFormat.dwRGBBitCount = 16;
 ddsd.ddpfPixelFormat.dwRBitMask = 0x7c00;
 ddsd.ddpfPixelFormat.dwGBitMask = 0x3E0;
 ddsd.ddpfPixelFormat.dwBBitMask = 0x1F;
    ddsd.ddpfPixelFormat.dwRGBAlphaBitMask = 0;
 //
 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;
 buf[0] = new BYTE[720*576*3];
// buf[1] = new BYTE[720*576];
// buf[2] = new BYTE[720*576/4];
 fp = fopen("d:\\temp\\720576.bmp","rb+");
    fread(buf[0],54,1,fp);
 fread(buf[0],720*576*3,1,fp);
 //while(!feof(fp))
 {
  if(DD_OK != lpddsmypage[0]->Lock(NULL,&ddsd,DDLOCK_WAIT|DDLOCK_SURFACEMEMORYPTR,NULL))
  {
   return ;
  }
  UCHAR  *lp_buffer = (UCHAR *)ddsd.lpSurface;
  WORD tmp=0;
  WORD *bmp555=new WORD[720];
  ///////////////////////////提取数据/////////////////////////////////////////////
  for (int i=0;i<576;i++)
  {
   for (int k=0;k<720;k++)
   {
    tmp = ((buf[0][(i*720+k)*3+2]&0xf8)>>3)<<10 | ((buf[0][(i*720+k)*3+1]&0xf8)>>3)<<5 | (buf[0][(i*720+k)*3+0]&0xf8)>>3;
    bmp555[k] = tmp&0xffff;
   }
             memcpy(lp_buffer +(575-i)*ddsd.lPitch,bmp555,720*2);
  }
  Sleep(40); 
  //////////////////////////////////////////////////////////////////////////
  //memcpy(bmp_buffer,buf[0],720*576*2);
  if(DD_OK != lpddsmypage[0]->Unlock(NULL))
  {
   return ;
  }
  HRESULT     ddRval;
  ddRval= lpddsprimary->Blt( &rcRectDest, lpddsmypage[0], &rcRectSrc, DDBLT_WAIT, NULL);
  //while(ddRval == DDERR_WASSTILLDRAWING);
  //ddRval=lpddsprimary->Flip(lpddsmypage[0],1);
  if(DD_OK != ddRval)
  {
   return ;
  } 
 }
 //fclose(fp);
 if(lpddsmypage)
 {
  lpddsmypage[0]->Release();
  lpddsmypage[0]=NULL;
 }
 MessageBox(_T("over"));    

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标编程语言VC/MFC频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved