多頁(yè)圖像是指圖像中包含有多個(gè)圖形頁(yè)。每頁(yè)可以看作圖像幀。這些圖像幀通過(guò)連續(xù)的顯示就形成了一副動(dòng)畫(huà)。比如GIF文件。

   GDI+Image對(duì)象提供了直接的對(duì)GIFTIF文件格式的支持。調(diào)用Image對(duì)象的成員函數(shù)GetFrameDimensionsCount可以得到Image對(duì)象的Dimension數(shù)。每個(gè)Dimension通過(guò)一個(gè)GUID標(biāo)示。函數(shù)GetFrameDimensionsList可以返回所有DimensionGUID值。第一個(gè)GUID值保存在函數(shù)參數(shù)pDimensionsIDs數(shù)組的索引0處。GetFrameCount可以得到每個(gè)Dimension里有多少個(gè)Frame簡(jiǎn)單示例代碼:
   Image* image = new Image(L"Multiframe.gif");
   UINT count = 0;
   count = image->GetFrameDimensionsCount();
   GUID *pDimensionIDs=(GUID*)new GUID[count];
   image->GetFrameDimensionsList(pDimensionIDs, count);
   WCHAR strGuid[39];
   StringFromGUID2(pDimensionIDs[0], strGuid, 39);
   UINT frameCount=image->GetFrameCount(&pDimensionIDs[0]);

   delete []pDimensionIDs;   
   并不是所有的GIF文件都是含有多幀的,所以我們?cè)陲@示GIF的時(shí)候可以通過(guò)上面的代碼根據(jù)frameCount的值判斷這個(gè)GIF文件是否有多個(gè)幀。

   在確認(rèn)有多個(gè)幀的圖像以后,還要得到每幀圖像顯示的間隔時(shí)間。GDI+Image對(duì)象提供了 GetPropertyItem獲取圖像的屬性。GetPropertyItem函數(shù)需要用戶(hù)傳遞數(shù)據(jù)返回緩沖區(qū)和大小。所以在使用前先用GetPropertyItemSize得到需要的緩沖區(qū)大小,分配空間后再取得屬性數(shù)據(jù)。  

   //PropertyTagFrameDelayGDI+中預(yù)定義的一個(gè)GIG屬性ID值,表示標(biāo)簽幀數(shù)據(jù)的延遲時(shí)間

   int size = GetPropertySize(PropertyTagFrameDelay);
   PropertyItem* pItem = NULL;
   pItem = (PropertyItem*)malloc(size);
   image->GetPropertyItem(PropertyTagFrameDelay,size,pItem);
   這樣就把所有和PropertyTagFrameDelay屬性相關(guān)的數(shù)據(jù)取到了pItem中。然后通過(guò)pItem訪問(wèn)結(jié)構(gòu)中的value。每?jī)蓭瑘D像之間的間隔時(shí)間是不一定相同的,所以還需要得到當(dāng)前正顯示的幀圖像的索引值。最后調(diào)用Image對(duì)象的DrawImage函數(shù)把每幀圖像畫(huà)出來(lái)。簡(jiǎn)單代碼如下:
int     fcount=0;
//Guid的值在顯示GIFFrameDimensionTime,顯示TIF時(shí)為FrameDimensionPage
GUID    Guid = FrameDimensionTime;
while(thue)
{
        Graphics gh(hDC); //hDC是外部傳入的畫(huà)圖DC
        gh.DrawImage(image,0,0,image->GetWidth(),image->GetHeight());
        //重新設(shè)置當(dāng)前的活動(dòng)數(shù)據(jù)幀
        image->SelectActiveFrame(&Guid,fcount++);
        if(fcount == frameCount) //frameCount是上面GetFrameCount返回值
               fcount= 0;     //如果到了最后一幀數(shù)據(jù)又重新開(kāi)始
        //計(jì)算此幀要延遲的時(shí)間
        long lPause = ((long*)pItem->value)[fcount]*10;
        Sleep(lPause);         //這里簡(jiǎn)單使用了sleep
}