1.半透明的原理
一張點陣圖由許多畫素組成,而每一畫素包含r、g、b三原色,三原色的值決定了畫素的色彩,要實現半透明效果,需要把前景圖 和背景圖彼此對應的畫素顏色按某一比例進行調配,稱為 『不透明度』,直接貼圖,則前景圖不透明度為100%,背景圖為0%;
公式:半透明圖色彩=前景圖色彩 * 不透明度 + 背景圖色彩 * (1-不透明度)
2.半透明操作步驟
(1)取得位圖結構,需要使用getobject函式,介紹如下:
函式原型:int getobject(hgdiobj hgdiobj, int cbbuffer, lpvoid lpvobject);
函式功能:表示獲取點陣圖的資訊
引數一 : 要獲取的點陣圖控制代碼
引數二 : 指定將要寫到緩衝區的資訊的位元組數目,在這裡是點陣圖型別的位元組數
關於位圖結構bitmap介紹如下:
(2)建立暫存陣列,目的是為了儲存點陣圖中所有畫素的顏色值
unsigned char * px1 = new unsigned char [bm1.bmheight * bm1.bmwidthbytes];
其中陣列的大小即為整個位圖所有畫素佔的位元組數,若乙個畫素24bits,則佔3個位元組,也就是3個陣列元素
(3)取得點陣圖中所有的顏色值,並儲存到暫存陣列中,函式介紹如下:
函式原型:long getbitmapbits(hbitmap hbmp, long cbbuffer, lpvoid lpvbits);
函式功能:把點陣圖的色彩值儲存到暫存陣列中
引數一 :位圖控制代碼
引數二 :要取得的位元組數
引數三 :指向暫存陣列
(4)合成畫素顏色值,這裡介紹基本思想:
假設每個畫素24bit,則每個畫素佔3位元組,關於背景圖,首先要取得整張影象素各原色值所在的索引值,即:
for(y=ystart;y舉個簡單的例子,假設從(xstart,ystary)~(xend,yend) 為 (0,0)~(1,1),則有如下情況:
[0][1][2] [3][4][5]
[6][7][8] [9][10][11]
注釋:每個畫素佔3個位元組;每一列畫素佔6位元組,書裡都把行稱為列,也不知道為啥
同理:處理前景圖時,直接進行顏色合成:前景圖30%的不透明度+背景圖70%的不透明度,存放到px2
for(y=0;y
while (getmessage(&msg, null, 0, 0))
return msg.wparam;
}atom myregisterclass(hinstance hinstance)
bool initinstance(hinstance hinstance, int ncmdshow)
movewindow(hwnd,10,10,600,445,true);
showwindow(hwnd, ncmdshow);
updatewindow(hwnd);
bg = (hbitmap)loadimage(null,"bg.bmp",image_bitmap,600,400,lr_loadfromfile); //背景圖控制代碼
bmp = (hbitmap)loadimage(null,"girlmask.bmp",image_bitmap,766,345,lr_loadfromfile);//前景圖控制代碼
getobject(bg,sizeof(bitmap),&bm1); //get the message of image to bm1
if(bm1.bmbitspixel != 32 && bm1.bmbitspixel != 24) //bit of pixe l
hdc = getdc(hwnd);
mdc = createcompatibledc(hdc);//建立與視窗dc相容的記憶體dc "mdc"
bufdc = createcompatibledc(hdc);//建立與視窗dc相容的記憶體dc "bufdc",選擇前景圖或背景圖,貼到mdc作透明處理
girl = createcompatiblebitmap(hdc,383,345);//建立乙個與視窗相相容的空位圖"girl",298*329畫素,處理後就是要貼到視窗的透明半透明圖案
selectobject(mdc,girl);//girl 存到 mdc,在mdc上進行透明處理
selectobject(bufdc,bg);//bg replace bufdc,背景圖bg存入bufdc
bitblt(mdc,0,0,383,345,bufdc,xstart,ystart,srccopy);//將透明區域的背景圖貼到mdc中
selectobject(bufdc,bmp);//將包含遮蔽圖的前景圖存入bufdc
bitblt(mdc,0,0,383,345,bufdc,383,0,srcand);//遮蔽圖在整張圖中,左上角座標(298,0),遮蔽圖與背景圖and運算
bitblt(mdc,0,0,383,345,bufdc,0,0,srcpaint);//前景圖與背景圖or運算,得到透明後的前景圖,接下來進行半透明處理
unsigned char *px1,*px2;
px1 = new unsigned char [bm1.bmheight * bm1.bmwidthbytes];
getbitmapbits(bg,bm1.bmheight * bm1.bmwidthbytes,px1);//px1儲存位圖顏色值
getobject(girl,sizeof(bitmap),&bm2);//bme得到girl的全部資訊
px2 = new unsigned char [bm2.bmheight * bm2.bmwidthbytes];
getbitmapbits(girl,bm2.bmheight * bm2.bmwidthbytes,px2);//px2儲存點陣圖bm2的顏色值
Visual C 遊戲程式設計基礎之遊戲迴圈
1.函式原型 boolpeekmessage lpmsgipmsg,hwndhwnd,uintwmsgfiltermin,uintwmsgfiltermax,uintwremovemsg 功 能 用於檢測訊息,檢測到了就返回非0值,否則返回0 引數一 接收訊息資訊的msg結構指標 引數二 其訊息被檢...
Visual C 遊戲程式設計基礎之透明動畫
1.利用前面學過的透明處理,這一次相當於是對每一幀進行透明處理,如第一次迴圈對第一幀進行透明處理,接著顯示 第二次對第二幀透明處理,接著顯示,直到最後一幀,然後再從第一幀開始,就這樣無限迴圈 include stdafx.h hinstance hinst hbitmap dra,bg bg為背景圖...
Visual C 遊戲程式設計基礎之鍵盤訊息
1.虛擬鍵碼 windows系統下所有的按鍵被視為虛擬鍵 包含滑鼠在內 每乙個虛擬鍵都有其對應的虛擬鍵碼 2.鍵盤訊息 1 vm kewdown 按下按鍵訊息 2 vm keyup 鬆開按鍵訊息 3 vm char 字元訊息,當按下的按鍵為定義於ascii碼中的可列印字元時,便發出此字元訊息 3.系...