DircetDraw c/c++ 使用指導(二) (轉)
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 高中生學習c/c++指導C++
- C++ this 指標C++指標
- C++ 指標C++指標
- 劍指offer——二叉樹的深度C++二叉樹C++
- 劍指offer——二叉樹的映象C++二叉樹C++
- C++指標理解C++指標
- C++智慧指標C++指標
- 【C++】智慧指標的正確使用方式C++指標
- NX二次開發-使用NXOPEN C++嚮導模板做二次開發C++
- C/C++指標總結C++指標
- 劍指offer——把字串轉換成整數C++字串C++
- C++ 使用 new 建立二維陣列C++陣列
- 【C++】C++之型別轉換C++型別
- c++ 函式指標C++函式指標
- C++(函式指標)C++函式指標
- C++中的this指標C++指標
- 劍指offer--把二叉樹列印成多行(C++)二叉樹C++
- 劍指offer——從上往下列印二叉樹C++二叉樹C++
- C++型別推導C++型別
- C++ 物件導向 一C++物件
- 1-7 C++指標C++指標
- C++進階(智慧指標)C++指標
- C++ 類成員指標C++指標
- C/C++ 二叉樹C++二叉樹
- wxPython使用指導Python
- Git使用指導Git
- (C++)二分C++
- 實驗二 c++C++
- C++物件導向總結——虛指標與虛擬函式表C++物件指標函式
- 【C++】翻轉二叉樹(遞迴、非遞迴)C++二叉樹遞迴
- (轉貼) C++,C#,Java功能比較 (.NET) (C#) (C/C++)C++C#Java
- 學懂現代C++——《Effective Modern C++》之轉向現代C++C++
- C++ 類(物件導向初探)C++物件
- (轉貼) C++ Builder 2007六月上市 (C/C++) (News)C++UI
- 1161:轉進位制(C C++)C++
- c++ 智慧指標用法詳解C++指標
- 120 C++中的物件指標C++物件指標
- C++筆記(11) 智慧指標C++筆記指標
- 詳解c++指標的指標和指標的引用C++指標