我也是剛接觸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
同時希望更多的同行能在我這個空間上找到自己要解決的問題,也希望路過的人留下自己在開發中遇到的技術問題,在這個得到大家的協助和協助要解決問題的人,哈哈