DircetDraw c/c++ 使用指導(二) (轉)

gugu99發表於2007-10-16
DircetDraw c/c++ 使用指導(二) (轉)[@more@]

DircetDraw c/c++ 使用指導(二)



310cdt 譯


tutorial2:在快取中載入點陣圖


這個例子討論在ddex1的基礎上進行擴充套件.ddex2(例程在msdn上就有,搜尋...)講包含載入點陣圖的.新的功能靠以下的步驟實現:
step1:建立調色盤
step2:設定調色盤
step3:在快取中載入點陣圖
step4:翻轉平面.
像在ddex1中一樣,在初始化函式中初始化了ddex2.
不同的程式碼如下:
lpDDPal = DDLoadPalette(lpDD, szBackground);
 
if (lpDDPal == NULL)
  goto error;
 
ddrval = lpDDSPrimary->SetPalette(lpDDPal);
 
if(ddrval != DD_OK)
  goto error;
 
// Load a bitmap into the back buffer.
ddrval = DDReLoaitmap(lpDDSBack, szBackground);
 
if(ddrval != DD_OK)
  goto error;


 



step1:建立調色盤
在ddex2中,首先用如下程式碼建立調色盤.
lpDDPal = DDLoadPalette(lpDD, szBackground);
 
if (lpDDPal == NULL)
  goto error;
DDLoadPalette這個函式是在Dxsdksdksamplesmiscddutil.cpp中的公共directdraw函式.很多directdraw的例子(sdk包中的)都用到這個檔案.重要的是,它包含了載入調色盤和點陣圖的函式,無論是從檔案還是資源.為了不重複的寫程式碼,就把他放在了一個可以重複使用的檔案中.確信你在編譯ddexn是包含了這檔案.
(以下內容在ddutial.cpp中)ddex2中,DDLoadPalette函式從back.bmp檔案建立了DirectDrawPalette.DDLoadPalette函式判斷建立調色盤的檔案或資源是否存在.如果不是的話,就建立一個預設的調色盤.在ddex2中,他從位件提取調色盤資訊並儲存在一個ape指向的結構中.
DDEx2隨後建立了DirectDrawPalette物件,如下:
pdd->CreatePalette(DDPCAPS_8BIT, ape, &ddpal, NULL);
return ddpal;
當IDirectDraw7::CreatePalette方法返回,ddpal引數指向從DDLoadPalette函式返回的DirectDrawPalette物件.
ape引數是一個指標,指向一個能包含或者2或4或16或256個線性組織的紀錄的結構.記錄的數目依靠於CreatePalette方法中的dwFlags引數.在上面的情況下,dwFlags引數設為DDPCAPS_8BIT.這表示結構中有256個記錄.每一條記錄包含4位元組(分別是紅,綠,蘭的通道和一個標誌位).


 



step2:設定調色盤
建立完調色盤以後,透過指標主平面的IDirectDrawSurface7::SetPalette方法,如下:
ddrval = lpDDSPrimary->SetPalette(lpDDPal);
 
if(ddrval != DD_OK)
  goto error;// SetPalette failed.
在你呼叫完IDirectDrawSurface7::SetPalette方法之後,DirectDrawPalette物件就與DirectDrawSurface物件聯絡起來了.什麼時候你想改變調色盤了,可以簡單的建立一個新的調色盤,然後設定一下就可以了.(雖然這篇指導用了這些步驟,其實還有其他的方法改變調色盤,以後的例子中將會演示)



step3:在快取區載入點陣圖
DirectDrawPalette物件與DirectDrawSurface物件聯絡起來之後,DDEx2用下面的程式碼在快取中載入點陣圖back.bmp
// Load a bitmap into the back buffer.
ddrval = DDReLoadBitmap(lpDDSBack, szBackground);
 
if(ddrval != DD_OK)
  // Load failed.
DDReLoadBitmap是另一個在Ddutil.cpp中的函式.他載入一個點陣圖檔案或資源到一個已經存在的DirectDraw平面.(你也可以使用DDLoadBitmap函式建立一個平面然後載入.函式也在ddutil.cpp中.)在ddex2中,他載入由szBackground(ID)指向的back.bmp檔案到由lpDDSBack(指標)指向的後臺快取.DDReLoadBitmap函式呼叫DDCopyBitmap函式將檔案複製到快取,並拉伸到適當的大小.
DDCopyBitmap函式將點陣圖複製到中,用Get函式恢復點陣圖的大小.然後是由下面的程式碼將點陣圖調整到將要放點陣圖的快取的大小.
// Get the size of the surface.
ddsd.dwSize = sizeof(ddsd);
ddsd.dwFlags = DDSD_HEIGHT | DDSD_WIDTH;
pdds->GetSurfaceDesc(&ddsd);
ddsd是一個DDSURFACEDESC2結構的指標.這個結構儲存了現在的DirectDraw平面的描述.在這種情況下,DDSURFACEDESC2的成員描述了平面的高和寬,由DDSD_HEIIGHT和DDSD_WIDTH標示的.IDirectDrawSurface7::GetSurfaceDesc方法的呼叫把屬性值裝入了這個結構.在DDEX2中,值將被設為高480,寬640.
DDCopyBitmap函式給平面加鎖然後把點陣圖複製到快取中,用StretchBlt函式拉伸或.如下:
if ((hr = pdds->GetDC(&hdc)) == DD_OK)
{
  StretchBlt(hdc, 0, 0, ddsd.dwWidth, ddsd.dwHeight, hdcImage, x, y,
  dx, dy, SRCCOPY);
  pdds->ReleaseDC(hdc);
}



step4:翻轉頁面
ddex2中翻轉頁面的部分與ddex1中的十分的相像.所不同的是:當平面丟失時(DDERR_SURFACELOST),在平面儲存後,必須用DDReLoadBitmap函式將點陣圖重新載入快取.


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-976888/,如需轉載,請註明出處,否則將追究法律責任。

相關文章