注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

回首望星辰

See you in the next world

 
 
 

日志

 
 

windows mobile6 smartphone下使用directdraw的一些问题收藏  

2009-02-23 17:10:38|  分类: 手机开发 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

首先我们的开发环境是wm6 smartphone的开发环境要实现图像解码显示到主界面平面上 ,在开发的初期我们公司都没有一个接触到mobile的,所以对这个问题的解决方案更谈不上好的技术解决,就通过几天的研究决定用directdraw技术来实现,开发的初期我们找了大量的directdraw的资料都是基于ppc的,在我们这个环境下的使用案例几乎没有,我们就借助与ppc的资料,在我们的环境下实现,开始对directdraw的整个流程基本上都已了解,可以在我们这个这个环境下怎么也通不过,后来通过不断的学习研究得出了一些技术性的经验性的结论,在ppc上可以通过实现的属性在这个环境下不支持,在这个环境下不支持如

1:在设置协作等级的时候不支持普通模式,只支持全屏模式 。

2:不支持双缓冲

3:不支持离屏页

4:不支持翻页

下面我对directdraw在wm6 smartphone下的整个过程给予大题的介绍和说明,希望对将要用这个环境下开发的人员一定的帮助,如果那里不对期望高手的指正,将非常的感谢你的支持

1:先定义几个全局变量

private:
LPDIRECTDRAW        m_pDD;
LPDIRECTDRAWSURFACE m_pDDPrimaryBuffer;
LPDIRECTDRAWSURFACE m_pDDBackBuffer;
LPDIRECTDRAWCLIPPER m_pDDClipper;
DDCAPS              m_DDCaps;

bool                m_bPageFlipping;

2:创建directdraw对象

// Perform DirectDraw initialization:
 if (FAILED(DirectDrawCreate(0, &m_pDD, 0)))
  { Shutdown(); return ; }

3:设置协作等级

// Set co-operative level
 if (FAILED(m_pDD->SetCooperativeLevel(m_hWnd, DDSCL_FULLSCREEN)))
  { Shutdown(); return ; }

注意第二个参数在smartphone下必须是全屏模式

4:

// Cache DDraw Device capabilities
 m_pDD->GetCaps(&m_DDCaps, 0);

5:

// True if backbuffers and flipping are supported by hardware
 m_bPageFlipping = CheckSurfaceCaps(DDSCAPS_BACKBUFFER | DDSCAPS_FLIP);

6:

// Create Clipper
  if(FAILED(m_pDD->CreateClipper( 0, &m_pDDClipper, NULL )))
   { Shutdown(); return ; }

7:

// Setting it to our hwnd gives the clipper the coordinates from our window
  if(FAILED(m_pDDClipper->SetHWnd(0, m_hWnd)))
   { Shutdown(); return ; }

8:

// Set up our surface
 DDSURFACEDESC ddsdPrim;

 ZeroMemory(&ddsdPrim, sizeof(ddsdPrim));

9:对m_bPageFlipping进行判断,true说明支持翻页,否则不支持,进行响应操作

ture:

 ddsdPrim.dwSize            = sizeof(ddsdPrim);
  ddsdPrim.dwFlags           = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
  ddsdPrim.ddsCaps.dwCaps    = DDSCAPS_PRIMARYSURFACE | DDSCAPS_FLIP;
  ddsdPrim.dwBackBufferCount = 1;

  // Create Primary Surface
  if (FAILED(m_pDD->CreateSurface(&ddsdPrim, &m_pDDPrimaryBuffer, 0)))
   { Shutdown(); return ; }

  // Attach flipping surface.
  if (FAILED(m_pDDPrimaryBuffer->EnumAttachedSurfaces(&m_pDDBackBuffer, EnumCallback)))
   { Shutdown(); return ; }

false:

 ddsdPrim.dwSize            = sizeof(ddsdPrim);
  ddsdPrim.dwFlags           = DDSD_CAPS;
  ddsdPrim.ddsCaps.dwCaps    = DDSCAPS_PRIMARYSURFACE;
        ddsdPrim.dwBackBufferCount = 1;
  // Create Primary Surface
  if (FAILED(m_pDD->CreateSurface(&ddsdPrim, &m_pDDPrimaryBuffer, 0)))
   { Shutdown(); return ; }

 // m_pDDPrimaryBuffer->GetDDInterface(&m_pDD);//----------------
  // Query full Surface description
  if (FAILED(m_pDDPrimaryBuffer->GetSurfaceDesc(&ddsdPrim)))
   { Shutdown(); return ; }
  // Using Caps, Width and Height, in System Memory...
  ddsdPrim.dwSize = sizeof(ddsdPrim);
  ddsdPrim.dwFlags  = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;
  ddsdPrim.ddsCaps.dwCaps = DDSCAPS_SYSTEMMEMORY;
  ddsdPrim.dwWidth = 240;
  ddsdPrim.dwHeight = 300;
  // Create Back-Buffer Surface
  if (FAILED(m_pDD->CreateSurface(&ddsdPrim, &m_pDDBackBuffer, 0)))
   { Shutdown(); return ; }

10:剪贴到主表面

     // Attach the clipper to the primary surface
 if(FAILED(m_pDDBackBuffer->SetClipper(m_pDDClipper)))
 { Shutdown(); return ; }

11:循环显示

while(1)
   {
     HDC hdc;//,hdc1;
           DDBLTFX ddbltfx;
        memset(&ddbltfx, 0, sizeof(ddbltfx));
     ddbltfx.dwSize = sizeof(ddbltfx);
     ddbltfx.dwFillColor = RGB(0, 0, 31);
             //    m_pDDPrimaryBuffer->Blt(NULL,NULL,NULL,DDBLT_COLORFILL | DDBLT_WAITNOTBUSY,&ddbltfx);
    if (m_pDDPrimaryBuffer->GetDC(&hdc) == DD_OK)
     {

//此处为要显示到主页面的代码

m_pDDPrimaryBuffer->ReleaseDC(hdc);

}

 if (m_pDDBackBuffer->GetDC(&hdc) == DD_OK)
      {

    //此处为显示到后背页面的代码
        m_pDDBackBuffer->ReleaseDC(hdc);//释放离屏页面的dc,一定要释放

//进行为一块,到主页面上是循环显示
        m_pDDPrimaryBuffer->Blt(NULL,m_pDDBackBuffer,NULL, DDBLT_WAITNOTBUSY,&ddbltfx);
      
      }

      Sleep(1000);

 

 

  评论这张
 
阅读(678)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017