二級(jí)C語言輔導(dǎo):繪制“透明”位圖

字號(hào):

繪制“透明”位圖是指繪制某一位圖中除指定顏色外的其余部分,我們稱這種顏色為“透明色”。通過將位圖的背景色指定為“透明色”,在繪制時(shí),不繪制這部分背景,而僅繪制圖像,這樣就可以將位圖中圖像透明地繪制到窗口上。
    繪制“透明”位圖的關(guān)鍵是創(chuàng)建一個(gè)“掩碼”位圖(mask bitmap),“掩碼”位圖是一個(gè)單色位圖,它是位圖中圖像的一個(gè)單色剪影。
    在Windows編程中,繪圖都要用到設(shè)備描述表,我們需創(chuàng)建兩個(gè)內(nèi)存設(shè)備描述表:位圖設(shè)備描述表(image DC)和“掩碼”位圖設(shè)備描述表(mask DC)。位圖設(shè)備描述表用來裝入位圖,而“掩碼”位圖設(shè)備描述表用來裝入“掩碼”位圖。在“掩碼”位圖設(shè)備描述表中制作“掩碼”位圖的方式是:先創(chuàng)建一個(gè)單色的Bitmap,裝入mask DC,然后,以“SRCCOPY”的方式將裝有位圖的位圖設(shè)備描述表繪制(BitBlt)到mask DC上。這樣,mask DC的顯示平面中的位圖即是“掩碼”位圖。
    繪制“透明”位圖的實(shí)際操作步驟:
    1.將位圖設(shè)備描述表以“SRCINVERT”的方式繪制(BitBlt)到顯示設(shè)備描述表上;
    2.將“掩碼”位圖設(shè)備描述表以“SRCAND”的方式繪制(BitBlt)到顯示設(shè)備描述表上;
    3.再將位圖設(shè)備描述表以“SRCINVERT”的方式繪制(BitBlt)到顯示設(shè)備描述表上。這樣除“透明色”外的其余位圖部分(圖像部分)就被繪制到窗口上了。
    實(shí)現(xiàn)代碼如下:
    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各創(chuàng)建一個(gè)DC
    dcImage.CreateCompatibleDC(pDC);
    dcMask.CreateCompatibleDC(pDC);
    //把圖像裝入image DC
    CBitmap* pOldBitmapImage=dcImage.SelectObject(&bmp);
    //為“掩碼”位圖創(chuàng)建一個(gè)單色bitmap
    CBitmap bitmapMask;
    bitmapMask.CreateBitmap(nWidth, nHeight, 1, 1, NULL); //把mask位圖裝入mask DC
    CBitmap* pOldBitmapMask = dcMask.SelectObject(&bitmapMask); //用透明色創(chuàng)建“掩碼”位圖
    dcImage.SetBkColor(crColour);//crColor是位圖中的透明色
    dcMask.BitBlt(0, 0, nWidth, nHeight, &dcImage, 0, 0, SRCCOPY);//分3步進(jìn)行實(shí)際的繪制
    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); //恢復(fù)原先設(shè)置
    dcImage.SelectObject(pOldBitmapImage);
    dcMask.SelectObject(pOldBitmapMask);
    pDC-〉SetBkColor(crOldBack);
    pDC-〉SetTextColor(crOldText);}
    以上這種“透明”位圖的繪制方法,還可以用到動(dòng)畫技術(shù)中,考試大提示繪制在某場(chǎng)景中不斷移動(dòng)的人物或動(dòng)物,就可以通過將人物或動(dòng)物位圖“透明”地繪制到背景中實(shí)現(xiàn)。
    本文中代碼段在Windows 95平臺(tái)上,經(jīng)Visual C++ 5測(cè)試通過。