绘制“透明”位图
繪制“透明”位圖是指繪制某一位圖中除指定顏色外的其余部分,我們稱這種顏色為“透明色”。通過將位圖的背景色指定為“透明色”,在繪制時,不繪制這部分背景,而僅繪制圖像,這樣就可以將位圖中圖像透明地繪制到窗口上。
繪制“透明”位圖的關鍵是創建一個“掩碼”位圖(mask bitmap),“掩碼”位圖是一個單色位圖,它是位圖中圖像的一個單色剪影。
在Windows編程中,繪圖都要用到設備描述表,我們需創建兩個內存設備描述表:位圖設備描述表(image DC)和“掩碼”位圖設備描述表(mask DC)。位圖設備描述表用來裝入位圖,而“掩碼”位圖設備描述表用來裝入“掩碼”位圖。在“掩碼”位圖設備描述表中制作“掩碼”位圖的方式是:先創建一個單色的Bitmap,裝入mask DC,然后,以“SRCCOPY”的方式將裝有位圖的位圖設備描述表繪制(BitBlt)到mask DC上。這樣,mask DC的顯示平面中的位圖即是“掩碼”位圖。
繪制“透明”位圖的實際操作步驟:
1.將位圖設備描述表以“SRCINVERT”的方式繪制(BitBlt)到顯示設備描述表上;
2.將“掩碼”位圖設備描述表以“SRCAND”的方式繪制(BitBlt)到顯示設備描述表上;
3.再將位圖設備描述表以“SRCINVERT”的方式繪制(BitBlt)到顯示設備描述表上。這樣除“透明色”外的其余位圖部分(圖像部分)就被繪制到窗口上了。
實現代碼如下:
void DrawTransparent(CDC * pDC, int x, int y, COLORREF crColour)
{ COLORREF crOldBack=pDC-〉SetBkColor(RGB(255,255,255));
COLORREF crOldText=pDC-〉SetTextColor(RGB(0,0,0));
CDC dcImage, dcMask;
CBitmap bmp;
bmp.LoadBitmap(IDB—TRANS);
//IDB—TRANS是待顯示位圖的資源ID
BITMAP bm;bmp.GetBitmap(&bm);
int nWidth=bm.bmWidth,nHeight=bm.bmHeight;
//為圖像及mask各創建一個DC
dcImage.CreateCompatibleDC(pDC);
dcMask.CreateCompatibleDC(pDC);
//把圖像裝入image DC
CBitmap* pOldBitmapImage=dcImage.SelectObject(&bmp);
//為“掩碼”位圖創建一個單色bitmap
CBitmap bitmapMask;
bitmapMask.CreateBitmap(nWidth, nHeight, 1, 1, NULL); //把mask位圖裝入mask DC
CBitmap* pOldBitmapMask = dcMask.SelectObject(&bitmapMask); //用透明色創建“掩碼”位圖
dcImage.SetBkColor(crColour);//crColor是位圖中的透明色
dcMask.BitBlt(0, 0, nWidth, nHeight, &dcImage, 0, 0, SRCCOPY);//分3步進行實際的繪制
pDC-〉BitBlt(x, y, nWidth, nHeight, &dcImage, 0, 0, SRCINVERT);
pDC-〉BitBlt(x, y, nWidth, nHeight, &dcMask, 0, 0, SRCAND);
pDC-〉BitBlt(x, y, nWidth, nHeight, &dcImage, 0, 0, SRCINVERT); //恢復原先設置
dcImage.SelectObject(pOldBitmapImage);
dcMask.SelectObject(pOldBitmapMask);
pDC-〉SetBkColor(crOldBack);
pDC-〉SetTextColor(crOldText);}
以上這種“透明”位圖的繪制方法,還可以用到動畫技術中,如繪制在某場景中不斷移動的人物或動物,就可以通過將人物或動物位圖“透明”地繪制到背景中實現。
繪制“透明”位圖的關鍵是創建一個“掩碼”位圖(mask bitmap),“掩碼”位圖是一個單色位圖,它是位圖中圖像的一個單色剪影。
在Windows編程中,繪圖都要用到設備描述表,我們需創建兩個內存設備描述表:位圖設備描述表(image DC)和“掩碼”位圖設備描述表(mask DC)。位圖設備描述表用來裝入位圖,而“掩碼”位圖設備描述表用來裝入“掩碼”位圖。在“掩碼”位圖設備描述表中制作“掩碼”位圖的方式是:先創建一個單色的Bitmap,裝入mask DC,然后,以“SRCCOPY”的方式將裝有位圖的位圖設備描述表繪制(BitBlt)到mask DC上。這樣,mask DC的顯示平面中的位圖即是“掩碼”位圖。
繪制“透明”位圖的實際操作步驟:
1.將位圖設備描述表以“SRCINVERT”的方式繪制(BitBlt)到顯示設備描述表上;
2.將“掩碼”位圖設備描述表以“SRCAND”的方式繪制(BitBlt)到顯示設備描述表上;
3.再將位圖設備描述表以“SRCINVERT”的方式繪制(BitBlt)到顯示設備描述表上。這樣除“透明色”外的其余位圖部分(圖像部分)就被繪制到窗口上了。
實現代碼如下:
void DrawTransparent(CDC * pDC, int x, int y, COLORREF crColour)
{ COLORREF crOldBack=pDC-〉SetBkColor(RGB(255,255,255));
COLORREF crOldText=pDC-〉SetTextColor(RGB(0,0,0));
CDC dcImage, dcMask;
CBitmap bmp;
bmp.LoadBitmap(IDB—TRANS);
//IDB—TRANS是待顯示位圖的資源ID
BITMAP bm;bmp.GetBitmap(&bm);
int nWidth=bm.bmWidth,nHeight=bm.bmHeight;
//為圖像及mask各創建一個DC
dcImage.CreateCompatibleDC(pDC);
dcMask.CreateCompatibleDC(pDC);
//把圖像裝入image DC
CBitmap* pOldBitmapImage=dcImage.SelectObject(&bmp);
//為“掩碼”位圖創建一個單色bitmap
CBitmap bitmapMask;
bitmapMask.CreateBitmap(nWidth, nHeight, 1, 1, NULL); //把mask位圖裝入mask DC
CBitmap* pOldBitmapMask = dcMask.SelectObject(&bitmapMask); //用透明色創建“掩碼”位圖
dcImage.SetBkColor(crColour);//crColor是位圖中的透明色
dcMask.BitBlt(0, 0, nWidth, nHeight, &dcImage, 0, 0, SRCCOPY);//分3步進行實際的繪制
pDC-〉BitBlt(x, y, nWidth, nHeight, &dcImage, 0, 0, SRCINVERT);
pDC-〉BitBlt(x, y, nWidth, nHeight, &dcMask, 0, 0, SRCAND);
pDC-〉BitBlt(x, y, nWidth, nHeight, &dcImage, 0, 0, SRCINVERT); //恢復原先設置
dcImage.SelectObject(pOldBitmapImage);
dcMask.SelectObject(pOldBitmapMask);
pDC-〉SetBkColor(crOldBack);
pDC-〉SetTextColor(crOldText);}
以上這種“透明”位圖的繪制方法,還可以用到動畫技術中,如繪制在某場景中不斷移動的人物或動物,就可以通過將人物或動物位圖“透明”地繪制到背景中實現。
總結
- 上一篇: 一种巧妙的删除程序自己的方法
- 下一篇: windows ternimal 使用