| 導購 | 订阅 | 在线投稿
分享
 
 
 

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

來源:互聯網網民  2006-12-17 09:28:29  評論

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

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 = DDReLoadBitmap(lpDDSBack, szBackground);

if(ddrval != DD_OK)

goto error;

step1:建立調色板

在ddex2中,首先用如下代碼建立調色板.

lpDDPal = DDLoadPalette(lpDD, szBackground);

if (lpDDPal == NULL)

goto error;

DDLoadPalette這個函數是在\Dxsdk\sdk\samples\misc\ddutil.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函數將位圖拷貝到內存中,用GetObject函數恢複位圖的大小.然後是由下面的代碼將位圖調整到將要放位圖的緩存的大小.

// 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函數將位圖重新載入緩存.

 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
DircetDraw c/c++ 使用指導(二) 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 = DDReLoadBitmap(lpDDSBack, szBackground); if(ddrval != DD_OK) goto error; step1:建立調色板 在ddex2中,首先用如下代碼建立調色板. lpDDPal = DDLoadPalette(lpDD, szBackground); if (lpDDPal == NULL) goto error; DDLoadPalette這個函數是在\Dxsdk\sdk\samples\misc\ddutil.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函數將位圖拷貝到內存中,用GetObject函數恢複位圖的大小.然後是由下面的代碼將位圖調整到將要放位圖的緩存的大小. // 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函數將位圖重新載入緩存.
󰈣󰈤
王朝萬家燈火計劃
期待原創作者加盟
 
 
 
>>返回首頁<<
 
 
 
 
 
 熱帖排行
 
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有