多頁圖像是指圖像中包含有多個圖形頁。每頁可以看作圖像幀。這些圖像幀通過連續的顯示就形成了一副動畫。比如GIF文件。
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]);
//PropertyTagFrameDelay是GDI+中預定義的一個GIG屬性ID值,表示標籤幀數據的延遲時間
int size = GetPropertySize(PropertyTagFrameDelay);
PropertyItem* pItem = NULL;
pItem = (PropertyItem*)malloc(size);
image->GetPropertyItem(PropertyTagFrameDelay,size,pItem);
這樣就把所有和PropertyTagFrameDelay屬性相關的數據取到了pItem中。然後通過pItem訪問結構中的value。每兩幀圖像之間的間隔時間是不一定相同的,所以還需要得到當前正顯示的幀圖像的索引值。最後調用Image對象的DrawImage函數把每幀圖像畫出來。簡單代碼如下:
int fcount=0;
//Guid的值在顯示GIF爲FrameDimensionTime,顯示TIF時爲FrameDimensionPage
GUID Guid = FrameDimensionTime;
while(thue)
{
Graphics gh(hDC); //hDC是外部傳入的畫圖DC
gh.DrawImage(image,0,0,image->GetWidth(),image->GetHeight());
//重新設置當前的活動數據幀
image->SelectActiveFrame(&Guid,fcount++);
if(fcount == frameCount) //frameCount是上面GetFrameCount返回值
fcount= 0; //如果到了最後一幀數據又重新開始
//計算此幀要延遲的時間
long lPause = ((long*)pItem->value)[fcount]*10;
Sleep(lPause); //這裏簡單使用了sleep
}