WINCE 如何顯示PNG和GIF圖片

忙活了一整天,終於找到顯示PNG和GIF格式圖片的方法了,相當HAPPY!!!!!!!!!!!
     wince的開發過程中,經常要涉及到GUI等開發,其強大的功能依賴於微軟各種動態庫和組件的支持,特別我最近在做仿IPHONE效果的UI時,有很多花稍的圖片,只能用PNG格式的圖片來實現,這裏主要介紹wince下各種圖片的顯示方法,開發環境是VS2005+wince5.0,源程序爲實現PNG和GIF的解碼和顯示函數。
    在一些多媒體項目中,圖片顯示是必不可少的,然而EVC的標準win32函數中,用於圖片操作的只有LoadBitmap和BitBlt等位圖函數,當然,用位圖示是速度最快的一種方式,但是由於位圖的不壓縮性,使圖片的體積非常大,使有些項目的開發板中,位圖佔用了大量的磁盤空間,如果使用JPG,GIF等高壓縮比的圖片,可以大大縮小程序的體積,然而EVC沒有直接支持這些圖片操作的函數,我們可以使用微軟提供的組件去實現這個功能。
    首先,在EVC的項目中導入圖片資源,導入的類名可使用圖片的壓縮格式,比方說,要導入JPG?片,可定類名爲"JPG",如果是GIF,就是"GIF",這樣,在編譯內核的時候,圖片作爲資源可直接在內核中使用,然後開始寫代碼:
//***************************************************************************************
//函數: LoaResourceImage
//目的: 解碼並顯示PNG圖片
//參數說明:hwnd:傳入句柄,lpName:資源文件名,lpType:資源文件類名(unicode),
//         i:保留,後面參數爲RECT
//***************************************************************************************
void LoaResourceImage(HWND hwnd,LPCWSTR lpName,LPCWSTR lpType,int i,
       int left,int right,int bottom,int top)
{
    HDC       hdc;
    HRSRC     hr;
    DWORD    dwsize;
    HGLOBAL    hg;
    LPSTR    lp;
 HMODULE hModule_Current = GetModuleHandle(NULL);
    hr = FindResource(hModule_Current,lpName,lpType);
    dwsize = SizeofResource(GetModuleHandle(NULL),hr);
    hg = LoadResource(GetModuleHandle(NULL),hr);
    lp = (LPSTR)LockResource(hg);
    hdc = GetDC(hwnd);
    RECT    rect;
 rect.bottom = bottom;
    rect.top = top;
    rect.right = right;
    rect.left = left;
    DrawImage(hdc,lp,dwsize,&rect);
    DeleteObject(hr);
}
    LoadResourceImage函數主要將圖片導入內存,使用這個函數,只要將圖片的ID,圖片的類名,以及要顯示圖片的座標位置輸入即可,下面主要是顯示的函數代碼:
//******************************************************************************
//函數: DrawImage
//目的: 顯示PNG圖片
//參數說明:hdc:HDC,buffer:數據流BUFFER,size:資源大小,
//         rect:RECT
//******************************************************************************
void DrawImage(HDC hdc,const void *buffer,UINT size,LPCRECT rect)
{
    IImagingFactory *pImageFactory = NULL;
    IImage        *pImage = NULL;
    CoInitializeEx(NULL,COINIT_MULTITHREADED);
    if(SUCCEEDED(CoCreateInstance(CLSID_ImagingFactory,
                      NULL,
                      CLSCTX_INPROC_SERVER,
                      IID_IImagingFactory,
                      (void **)&pImageFactory)))
 {
  
  if(SUCCEEDED(pImageFactory->CreateImageFromBuffer(buffer,size,DISPOSAL_NONE,&pImage)))
        {
   pImage->Draw(hdc,rect,NULL);
   pImage->Release();
        }
        pImageFactory->Release();
    }
 CoUninitialize();
}
    這裏使用了微軟的組件的調用,然後在指定位置顯示,當然,只要組件中支持相應的圖片解碼,這種方法就可以使用,目前,大多數的解碼,wince5.0都可以解,這樣wince下的圖片顯示問題解決。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章