windows mobile6 smartphone下使用directdraw的一些問題

來源:互聯網
上載者:User

我也是剛接觸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

同時希望更多的同行能在我這個空間上找到自己要解決的問題,也希望路過的人留下自己在開發中遇到的技術問題,在這個得到大家的協助和協助要解決問題的人,哈哈

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.