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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- DircetDraw c/c++ 使用指導(四) (轉)C++
- DircetDraw c/c++ 使用指導(一) (轉)C++
- DircetDraw c/c++ 使用指導(三) (轉)C++
- [C++]指標和引用(二)C++指標
- C++指標轉換C++指標
- 高中生學習c/c++指導C++
- C++深度探索系列:智慧指標(Smart Pointer) [二] (轉)C++指標
- Prefer C++ (二) (轉)C++
- C/C++指向指標的指標C++指標
- C++ this 指標C++指標
- C++ 指標C++指標
- C++中智慧指標的簡單使用C++指標
- 【C++】智慧指標的正確使用方式C++指標
- 劍指offer——二叉樹的映象C++二叉樹C++
- 劍指offer——二叉樹的深度C++二叉樹C++
- C++模板的定製二:定製C++類 (轉)C++
- C++指標理解C++指標
- 【c++】智慧指標C++指標
- C++智慧指標C++指標
- C/C++指標總結C++指標
- C++中智慧指標的設計和使用C++指標
- C++入門解惑(2)——初探指標(上) (轉)C++指標
- C++入門解惑(3)——初探指標(下) (轉)C++指標
- c++指標使用經驗總結之懸垂指標C++指標
- NX二次開發-使用NXOPEN C++嚮導模板做二次開發C++
- 劍指offer(C++)——把二叉樹列印成多行C++二叉樹
- C++中的this指標C++指標
- c++ 函式指標C++函式指標
- C++引用和指標C++指標
- C++指標問題C++指標
- 「C++」理解智慧指標C++指標
- c++指標小計C++指標
- C++(函式指標)C++函式指標
- 劍指offer——把字串轉換成整數C++字串C++
- Git使用指導Git
- 再造一個WinZip ——C++流技術物件導向分析與設計(二) (轉)C++物件
- C#和C++的速度大比拼(二) (轉)C#C++
- 關於C/C++ void指標,使用void指標拷貝int 陣列C++指標陣列