透明貼圖實(shí)現(xiàn)_第1頁(yè)
透明貼圖實(shí)現(xiàn)_第2頁(yè)
透明貼圖實(shí)現(xiàn)_第3頁(yè)
透明貼圖實(shí)現(xiàn)_第4頁(yè)
透明貼圖實(shí)現(xiàn)_第5頁(yè)
已閱讀5頁(yè),還剩3頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、透明貼圖繪制透明位圖是指在繪制位圖時(shí)只繪制除了指定顏色外的其余部分,而指定的顏色就被稱(chēng)為“透明色”。通過(guò)將位圖的背景色指定成“透明色”,在繪制時(shí)不繪制帶“透明色”的這部分背景,僅繪制圖像,這樣就可以將圖像透明地繪制到窗口上。繪制包含透明色的位圖的方法有許多種,比較常用的是屏蔽繪制和非屏蔽繪制,屏蔽繪制指的是事先做一張掩碼位圖,非屏蔽繪制是動(dòng)態(tài)生成掩碼位圖。下面將分別詳細(xì)介紹這兩種繪制方法。在寫(xiě)透明貼圖的方法前先來(lái)說(shuō)說(shuō)透明貼圖,所謂的透明貼圖并不是真正意義上的透明,而是圖像不需要顯示的部分顯示出的顏色是當(dāng)前對(duì)話(huà)框的背景色,也就是說(shuō)把圖像不需要顯示的顏色當(dāng)成背景色,顯示的部分作為前景色,透明就是把

2、背景換成對(duì)話(huà)框背景。要實(shí)現(xiàn)這種透明有兩種方法,一種是讓背景色成為白色,然后與對(duì)話(huà)框背景色進(jìn)行與運(yùn)算;還有一種是讓背景色成為黑色,然后與對(duì)話(huà)框背景色進(jìn)行或運(yùn)算。這樣位圖的背景色就消失了。了解了透明的概念,就可以避免透明貼圖的一些缺點(diǎn),如果位圖的前景色也存在許多白色,則采用將背景色變成黑色,與對(duì)話(huà)框背景色進(jìn)行或運(yùn)算的方法,這樣前景色的白色部分才不會(huì)被誤當(dāng)成背景色透明顯示;反過(guò)來(lái),如果位圖前景色存在大量黑色部分是,則采用將背景色變成白色,與對(duì)話(huà)框背景色進(jìn)行與運(yùn)算的方法。當(dāng)然,如果前景色同時(shí)存在大量白色和黑色時(shí),則透明貼圖會(huì)遇到大麻煩,需要想辦法將位圖的白色或黑色部分做一些修改后再進(jìn)行透明貼圖。屏蔽繪

3、制 繪制透明位圖的關(guān)鍵就是創(chuàng)建一個(gè)“掩碼”位圖(mask bitmap),這個(gè)“掩碼”位圖是一個(gè)單色位圖,它是位圖中圖像的一個(gè)單色剪影。在MFC中,繪圖需要使用設(shè)備描述表,透明貼圖時(shí)需要?jiǎng)?chuàng)建兩個(gè)內(nèi)存設(shè)備描述表,一個(gè)是用于存放位圖的設(shè)備描述表(imgDC),一個(gè)是用于存放“掩碼”位圖的設(shè)備描述表(maskDC)。在“掩碼”位圖設(shè)備描述表中制作“掩碼”位圖的方法是先創(chuàng)建一個(gè)單色的bitmap,放入掩碼設(shè)備描述表(maskDC)中,然后使用拷貝粘貼的方式將存放有位圖的設(shè)備描述表(imgDC)繪制到掩碼設(shè)備描述表上,這樣,掩碼設(shè)備描述表顯示的位圖即是“掩碼”位圖。在詳細(xì)介紹實(shí)現(xiàn)過(guò)程之前先介紹下所使用的

4、畫(huà)圖函數(shù)以及函數(shù)參數(shù)所代表的功能;整個(gè)繪制過(guò)程需要使用到BitBlt()函數(shù),關(guān)于這個(gè)函數(shù),MSDN上的說(shuō)明是這樣的:這個(gè)函數(shù)的功能是把源設(shè)備上下文中的一個(gè)矩形區(qū)域中所有像素的顏色比特信息傳輸給目標(biāo)設(shè)備上下文。BOOL BitBlt(int x, int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, int ySrc, DWORD dwRop); 函數(shù)參數(shù)如下:Int x表示繪制位圖目標(biāo)左上角x坐標(biāo);Int y表示繪制位圖目標(biāo)左上角y坐標(biāo);Int nWidth表示繪制位圖目標(biāo)的區(qū)域?qū)挾?;Int nHeight表示繪制位圖目標(biāo)的區(qū)域高度;C

5、DC* pSrcDC表示存儲(chǔ)源位圖的設(shè)備描述表;Int xSrc表示源位圖的左上角x坐標(biāo);Int ySrc表示源位圖的左上角y坐標(biāo);DWORD dwRop表示柵格運(yùn)算標(biāo)志;dwRop的取值與值的描述如下表所示:值描述BLACKNESS用調(diào)色板中索引為0的顏色(默認(rèn)是黑色)填充目標(biāo)矩形。CAPTUREBLT用調(diào)色板中索引為0的顏色(默認(rèn)是黑色)填充目標(biāo)矩形。DSTINVERT將目標(biāo)矩形反色。MERGECOPY將源矩形中的顏色與當(dāng)前目標(biāo)設(shè)備環(huán)境選中的畫(huà)刷通過(guò)邏輯與操作進(jìn)行混合。MERGEPAINT將源矩形的顏色反色后與目標(biāo)矩形的顏色通過(guò)邏輯或操作進(jìn)行混合。NOMIRRORBITMAP防止位圖鏡像翻

6、轉(zhuǎn)。NOTSRCCOPY源矩形反色復(fù)制到目標(biāo)矩形。NOTSRCERASE將源矩形與目標(biāo)矩形的顏色通過(guò)邏輯或操作混合后,再反色。PATCOPY將目標(biāo)設(shè)備環(huán)境選中的畫(huà)刷復(fù)制到目標(biāo)位圖。PATINVERT將目標(biāo)設(shè)備環(huán)境選中的畫(huà)刷與目標(biāo)矩形中的顏色進(jìn)行邏輯異或操作,復(fù)制到目標(biāo)位圖。PATPAINT將目標(biāo)設(shè)備環(huán)境選中的畫(huà)刷與源矩形中的顏色的反色進(jìn)行邏輯或操作,其結(jié)果再與目標(biāo)矩形的顏色進(jìn)行邏輯或操作。SRCAND將源矩形與目標(biāo)矩形的顏色進(jìn)行邏輯與操作。SRCCOPY直接將源矩形拷貝到目標(biāo)矩形,最常用的繪制位圖屬性。SRCERASE將目標(biāo)矩形的反色與源矩形的顏色進(jìn)行邏輯與操作。SRCINVERT將源矩形的顏

7、色與目標(biāo)矩形進(jìn)行邏輯異或操作。SRCPAINT將源矩形的顏色與目標(biāo)矩形進(jìn)行邏輯或操作。WHITENESS用調(diào)色板中索引為1的顏色(默認(rèn)是白色)填充目標(biāo)矩形。原圖如下所示,下面是整個(gè)實(shí)現(xiàn)過(guò)程:1) 創(chuàng)建一張大小與需要繪制圖像相同的位圖作為“掩碼”位圖;2) 將新創(chuàng)建的“掩碼”位圖存儲(chǔ)至掩碼位圖的設(shè)備描述表中;3) 把位圖設(shè)備描述表的背景設(shè)置成“透明色”,即不需要顯示的顏色;4) 復(fù)制粘貼位圖到“掩碼”位圖的設(shè)備描述表中,這個(gè)時(shí)候“掩碼”位圖設(shè)備描述表中存放的位圖與位圖設(shè)備描述表中的位圖一樣;5) 把需要透明繪制的位圖與對(duì)話(huà)框繪圖相應(yīng)區(qū)域的背景進(jìn)行邏輯異或操作繪制到對(duì)話(huà)框上;結(jié)果如下圖所示,6)

8、把“掩碼”位圖與這個(gè)時(shí)候?qū)υ?huà)框相應(yīng)區(qū)域的背景進(jìn)行邏輯與的操作;結(jié)果如下圖所示,這個(gè)時(shí)候顯示出來(lái)的對(duì)話(huà)框背景就是需要繪制透明位圖的剪影了;7) 最后一步重復(fù)步驟5的操作,把需要透明繪制的位圖與對(duì)話(huà)框繪圖相應(yīng)區(qū)域的背景進(jìn)行邏輯異或操作繪制到對(duì)話(huà)框上;結(jié)果如下圖所示,這個(gè)時(shí)候大功告成,位圖已經(jīng)透明地顯示在了對(duì)話(huà)框中;8) 當(dāng)然最后不要忘記了把系統(tǒng)的畫(huà)筆還給系統(tǒng),刪除使用過(guò)的GDIObject,釋放非空的指針,最后把新建的設(shè)備描述表也刪除;具體代碼如下顯示,這段代碼只是截取了在WM_PAINT消息中對(duì)話(huà)框客戶(hù)區(qū)畫(huà)圖的部分,位圖的加載和刪除分別寫(xiě)在OnInitDialog()函數(shù)和析構(gòu)函數(shù)中;CDC i

9、mgDC, maskDC; /定義存儲(chǔ)位圖的位圖設(shè)備描述表imgDC和存儲(chǔ)掩碼位圖的掩碼位圖/設(shè)備描述表maskDCCRect rcWnd, rcPic;imgDC.CreateCompatibleDC(NULL); /初始化設(shè)備描述表maskDC.CreateCompatibleDC(NULL); /初始化設(shè)備描述表CBitmap bmpMask;BITMAP bm;m_bmpSample.GetBitmap(&bm);GetClientRect(rcWnd);rcPic.left = (rcWnd.Width() - bm.bmWidth)/2;rcPic.right = rcPi

10、c.left + bm.bmWidth;rcPic.top = (rcWnd.Height() - bm.bmHeight)/2;rcPic.bottom = rcPic.top + bm.bmHeight;bmpMask.CreateBitmap(bm.bmWidth, bm.bmHeight, 1, 1, NULL); /初始化掩碼位圖CBitmap * pOldBmp = imgDC.SelectObject(&m_bmpSample); /存儲(chǔ)位圖至位圖設(shè)備描述表CBitmap * pOldMaskBmp = maskDC.SelectObject(&bmpMask);

11、 /存儲(chǔ)掩碼位圖至掩碼位圖/設(shè)備描述表imgDC.SetBkColor(RGB(255, 255, 0); /設(shè)置位圖設(shè)備描述表的背景色為透明色maskDC.BitBlt(0, 0, bm.bmWidth, bm.bmHeight, &imgDC, 0, 0, SRCCOPY);dc.BitBlt(rcPic.left, rcPic.top, bm.bmWidth, bm.bmHeight, &imgDC, 0, 0, SRCINVERT);dc.BitBlt(rcPic.left, rcPic.top, bm.bmWidth, bm.bmHeight, &maskDC

12、, 0, 0, SRCAND);dc.BitBlt(rcPic.left, rcPic.top, bm.bmWidth, bm.bmHeight, &imgDC, 0, 0, SRCINVERT);imgDC.SelectObject(pOldBmp);maskDC.SelectObject(pOldMaskBmp);bmpMask.DeleteObject();pOldBmp = NULL;pOldMaskBmp = NULL;DeleteDC(imgDC);DeleteDC(maskDC);非屏蔽繪制說(shuō)到非屏蔽繪制透明貼圖就是動(dòng)態(tài)生成掩碼位圖,最常用的方法就是Transparent

13、Blt()函數(shù),關(guān)于這個(gè)函數(shù)MSDN上是這樣描述的:TransparentBlt()函數(shù)從指定源設(shè)備上下文中的矩形區(qū)域中像素的色彩信息轉(zhuǎn)化為目標(biāo)設(shè)備上下文中。TransparentBlt()函數(shù)在Windows98/Windows2000以上版本運(yùn)行,系統(tǒng)中需要包含 Msimg32.dll,使用時(shí)可以鏈接 Msimg32.lib。Windows98下的TransparentBlt()會(huì)產(chǎn)生資源泄漏,所以不建議在WIN98下使用該函數(shù)。TransparentBlt()函數(shù)原型如下: BOOL TransparentBlt(HDC hdcDest, /目標(biāo)DCint nXOriginDest, /目標(biāo)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論