windows api實現圖片的鏤空效果
時間緊迫:簡單說一下:
其實鏤空我學到的有三種代碼方法:
- directdraw用顏色鍵碼實現(簡單,這個不介紹)
- Windows api Bitblt函數實現
第三種方法可以用easyx庫中的函數。方法不解釋了(easyx過時的東西,玩玩可以)
2方法的具體實現
這個的原理:利用圖片的位運算實現,因爲圖片的顏色使用RGB三原色表示,黑色的RGB全爲0 ,白色的RGB全爲1。圖片在內存的存儲就是存儲的這些值(單片機老師講過)。根據位運算,和黑色0與(and)全爲0 ,和白色1與(and)顏色不變。等根據這樣的原理,只要將我們的圖片和背景圖片進行位運算放在一個內存dc裏面,然後再輸出到屏幕上,就可以實現圖片的鏤空效果。
原圖:要鏤空的圖片
遊戲背景的圖
還需要一張蒙版圖
目的:將遊戲的白色背景改成遊戲背景圖
原理:
1:先將蒙版圖和背景圖先或運算,得到目的dc:2:在將目的的dc的圖片和原圖進行與運算。
3:將內存dc上的圖片複製到設備dc,即屏幕。
完整代碼
win32在paint事件中添加
HDC hdc ;
//得到設備dc,hwnd是窗口句柄
hdc = GetDC(hwnd);
//定義內存dc
HDC hdcSrc = CreateCompatibleDC(hdc);
HDC hdcBack = CreateCompatibleDC(hdc);
HDC hdcMem = CreateCompatibleDC(hdc);
//加載圖片,需要是.bmp圖片,也可以是資源
HBITMAP HBitmapSrc = (HBITMAP)::LoadImage(NULL, "flappy_packer.bmp", IMAGE_BITMAP, 600, 600, LR_LOADFROMFILE);
HBITMAP HBitmapBack = (HBITMAP)::LoadImage(NULL , "bg.bmp" , IMAGE_BITMAP , 600 , 600 , LR_LOADFROMFILE);
HBITMAP hBitmapMem = (HBITMAP)::LoadImage(NULL , "flappy_packer2.bmp" , IMAGE_BITMAP , 600 , 600 , LR_LOADFROMFILE);
//將位圖選入內存dc
SelectObject(hdcSrc , HBitmapSrc);
SelectObject(hdcBack , HBitmapBack);
SelectObject(hdcMem , hBitmapMem);
//BitBlt(hdcMem , 0 ,0 , 600 , 600 , hdcBack , 0 , 0 ,SRCCOPY);
//BitBlt(hdc , 0 , 0 , 600 , 600 , hdcMem , 0 , 0 , SRCCOPY);
//先將背景圖和蒙版圖進行或運算,得到新的hdcMem
BitBlt(hdcMem , 0 , 0 , 600 , 600 , hdcBack , 0, 0 , SRCPAINT);
//在將原圖和hdcMem進行與運算,的到新的hdcMem
BitBlt(hdcMem , 0 , 0 , 600 , 600 , hdcSrc , 0 , 0 , SRCAND);
//將hdcMem的內容貼到屏幕上,即窗口
BitBlt(hdc , 0 ,0 , 600, 600 , hdcMem , 0 , 0 , SRCCOPY);
結果圖