我也是刚接触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
同时希望更多的同行能在我这个空间上找到自己要解决的问题,也希望路过的人留下自己在开发中遇到的技术问题,在这个得到大家的帮助和帮助要解决问题的人,哈哈