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

我也是刚接触mobile的开发,以前是做java的,后来做了几个月的symbian,现在改用mobile下开发了,对我进来对mobile的一些小的成果写出来,共享给大家,希望后来者可以解签,少走弯路,哈哈,如有不对的地方也请高手指出,将非常感谢

首先我们的开发环境是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);

这是个整个的大体流程,其他的一下细节还要自己去研究做

至于关键以流的形式读入swf格式播放文件的部分还在研究中,如果有那位有做过和有好的实现见解的同行可以给提供好的思路,将万分感谢,同时也希望我的这一点点的总结可以给大家带来帮助。

 

如需技术交流可以联系我 QQ:67530591

同时希望更多的同行能在我这个空间上找到自己要解决的问题,也希望路过的人留下自己在开发中遇到的技术问题,在这个得到大家的帮助和帮助要解决问题的人,哈哈

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值