![透明貼圖實(shí)現(xiàn)_第1頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-3/1/fbf84f76-8505-46b1-b644-54d5bf9b7fff/fbf84f76-8505-46b1-b644-54d5bf9b7fff1.gif)
![透明貼圖實(shí)現(xiàn)_第2頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-3/1/fbf84f76-8505-46b1-b644-54d5bf9b7fff/fbf84f76-8505-46b1-b644-54d5bf9b7fff2.gif)
![透明貼圖實(shí)現(xiàn)_第3頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-3/1/fbf84f76-8505-46b1-b644-54d5bf9b7fff/fbf84f76-8505-46b1-b644-54d5bf9b7fff3.gif)
![透明貼圖實(shí)現(xiàn)_第4頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-3/1/fbf84f76-8505-46b1-b644-54d5bf9b7fff/fbf84f76-8505-46b1-b644-54d5bf9b7fff4.gif)
![透明貼圖實(shí)現(xiàn)_第5頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-3/1/fbf84f76-8505-46b1-b644-54d5bf9b7fff/fbf84f76-8505-46b1-b644-54d5bf9b7fff5.gif)
版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 現(xiàn)代辦公環(huán)境下的教學(xué)理念與方法研究
- 醫(yī)療護(hù)理醫(yī)學(xué)培訓(xùn) 一例腹膜后濾泡淋巴瘤乳糜漏患者的個(gè)案護(hù)理課件
- 現(xiàn)代辦公環(huán)境中的運(yùn)動(dòng)文化培育
- 生態(tài)農(nóng)業(yè)技術(shù)與商業(yè)模式的創(chuàng)新
- 環(huán)境友好型產(chǎn)品的社交電商推廣策略
- Unit 5 A party (說(shuō)課稿)-2023-2024學(xué)年譯林版(三起)英語(yǔ)六年級(jí)下冊(cè)
- 《分米和毫米》說(shuō)課稿-2023-2024學(xué)年二年級(jí)下冊(cè)數(shù)學(xué)蘇教版
- 《第二單元 數(shù)字畫(huà)家 7 復(fù)制與變換》說(shuō)課稿-2024-2025學(xué)年浙江攝影版(三起)(2020)信息技術(shù)三年級(jí)上冊(cè)
- 2024秋八年級(jí)道德與法治上冊(cè) 第二單元 協(xié)調(diào)人際關(guān)系 第5課 同窗之誼 第1框 同學(xué)之間說(shuō)課稿 蘇教版
- 2025年中國(guó)混凝土布料桿市場(chǎng)調(diào)查研究報(bào)告
- 2024年電工(高級(jí)技師)考前必刷必練題庫(kù)500題(含真題、必會(huì)題)
- 公司組織架構(gòu)與管理體系制度
- 2024-2030年中國(guó)涂碳箔行業(yè)現(xiàn)狀調(diào)查與投資策略分析研究報(bào)告
- 2024-2030年中國(guó)派對(duì)用品行業(yè)供需規(guī)模調(diào)研及發(fā)展趨勢(shì)預(yù)測(cè)研究報(bào)告
- 2023-2024年度數(shù)字經(jīng)濟(jì)與驅(qū)動(dòng)發(fā)展公需科目答案(第5套)
- 工傷保險(xiǎn)代理委托書(shū)
- 職業(yè)分類(lèi)表格
- 廣東省深圳高級(jí)中學(xué)2023-2024學(xué)年八年級(jí)下學(xué)期期中考試物理試卷
- 電網(wǎng)建設(shè)項(xiàng)目施工項(xiàng)目部環(huán)境保護(hù)和水土保持標(biāo)準(zhǔn)化管理手冊(cè)(變電工程分冊(cè))
- 口腔門(mén)診部設(shè)置可行性研究報(bào)告
- 新粵教版科學(xué)一年級(jí)下冊(cè)全冊(cè)優(yōu)質(zhì)課件(全冊(cè))
評(píng)論
0/150
提交評(píng)論