繪圖是屬于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++游戲編程基礎》學習筆記——索引隨筆。


