繪圖是屬于GDI的對象之一,在一套游戲開發過程中,常常需要運用大量的位圖來構建游戲的所有畫面。
以游戲程序來說,由于使用的位圖數量相當多,因此都會先將位圖存成文件,等到程序需要時再將文件加載到窗口中。
將位圖從文件中加載到繪制窗口中必須經過以下幾個步驟:
①從文件中加載位圖(BITMAP)對象。
②建立一個與窗口DC兼容的內存DC。
③內存DC使用步驟1所建立的位圖對象。
④將內存DC的內容粘帖到窗口DC中,完成顯像的操作。
以上是大致的流程,接下來一步步地說明如何完成這些操作
步驟一:加載位圖
要從文件加載位圖,常使用LoadImage()函數
HANDLE LoadImage( HINSTANCE 來源實體, //加載位圖
LPCTSTR 名稱,
UINT 位圖類型,
int 加載寬度,
int 加載高度,
UINT 加載方式,);
詳細說明如下:
參數
|
說明
|
HINSTANCE
|
包含位圖所在的實體,若要加載的位圖存在于硬盤或者資源文件中,則將此項參數設為”NULL”
|
LPCTSTR
|
要加載位圖所在的路徑與文件名或者資源名稱
|
UINT
|
加載位圖的類型,有下列3種:
◆IMAGE_BITMAP:加載的位圖為一般圖文件,擴展名為“.bmp”
◆IMAGE_CURSOR:加載的位圖為光標圖標,擴展名為“.cur”
◆IMAGE_ICON:加載的位圖為圖標,擴展名為“.ico”
|
int
|
位圖加載的寬度,單位為像素
|
int
|
位圖加載的高度,單位為像素
|
UINT
|
設定位圖的加載方式,若是從文件中加載位圖,則設為“LR_LOADFROMFILE
|
步驟二:建立與窗口DC兼容的內存DC
內存DC并不是真正的設備的DC,在這里把它揭示為一個緩沖區或許會更恰當些。內存DC用來暫存加載的位圖,由于最終會把存儲在這個內存DC上的位圖貼到真正的窗口的DC上,因此這個內存DC必須跟窗口DC的性質兼容。可調用CreateCompatibleDC()函數來建立內存DC。
HDC CreateCompatibleDC(HDC hdc); // 建立兼容DC
函數中輸入的唯一參數就是要與內存DC兼容的目的DC。跟窗口DC一樣,內存DC使用后也必須進行釋放的操作,釋放內存DC所調用的函數為DeleteDC()。
DeleteDC(HDC DC名稱); //釋放DC
步驟三:選用位圖對象
位圖對象是GDI的6種對象之一,內存DC選用位圖對象的方法和前面介紹的選用畫筆或畫刷的方式相同,都是通過調用SelectObject()函數來實現。
步驟四:貼圖
把內存DC中的位圖復制到顯示的DC上,這個操作被稱為“貼圖”。函數是BitBlt():
BOOL BitBlt ( HDC 目的DC,
int 目的DC X坐標,
int 目的DC Y坐標,
int 貼到目的DC的寬度,
int 貼到目的DC的高度,
HDC 來源DC,
int 來源DC X坐標,
int 來源DC Y坐標,
DWORD 貼圖方式)
BitBlt()函數最后一個參數所輸入的是稱為“Raster”的運算值,這個值是用來設定內存DC到目的DC的貼圖方式。范例中輸入的Raster值是SRCCOPY,表示貼圖后的位圖與原來的位圖完全一樣,下表列出了可使用的Raster值及說明。
Raster值
|
說明
|
BLACKNESS
|
將來源位圖轉換為黑色
|
DSTINVERT
|
將目的地DC做“NOT”運算
|
MERGECOPY
|
將選擇的筆刷與來源位圖做“AND”運算
|
MERGEPAINT
|
先將來源位圖做“NOT”運算,再與目的地DC做“OR”運算
|
NOTSRCCOPY
|
將來源位圖做“NOT”運算
|
NOTSRCERASE
|
先將來源位圖與目的地DC做“OR”運算,再將其做“NOT”運算
|
PATCOPY
|
將選擇的筆刷貼到目的地DC上
|
PATINVERT
|
將目的地DC與選擇的筆刷做“XOR”運算
|
PATPAINT
|
先將來源位圖做“NOT”運算,再與筆刷做“OR”運算,最后再與目的地DC做“OR”運算
|
SRCAND
|
將來源位圖與目的地DC做“AND”運算
|
SRCCOPY
|
將來源位圖貼到目的地DC上
|
SRCERASE
|
先將目的地DC做“NOT”運算,再與來源位圖做“AND”運算
|
SRCINVERT
|
將來源位圖與目的地DC做“XOR”運算
|
SRCPAINT
|
將來源位圖與目的地DC做“OR”運算
|
WHITENESS
|
將來源位圖轉換為白色
|
范例ch2_5:從文件中加載位圖,并顯示在窗口上。
下載地址:ch2_5(上傳到windows live空間,可能需要MSN賬號登陸)
說明:程序源代碼中有相關的注釋。
程序運行結果如下圖:

PS:如想獲得更多關于Visual C++游戲開發的內容,可點擊隨筆:《Visual C++游戲編程基礎》學習筆記——索引隨筆。