




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、透明貼圖繪制透明位圖是指在繪制位圖時只繪制除了指定顏色外的其余部分,而指定的顏色就被稱為“透明色”。通過將位圖的背景色指定成“透明色”,在繪制時不繪制帶“透明色”的這部分背景,僅繪制圖像,這樣就可以將圖像透明地繪制到窗口上。繪制包含透明色的位圖的方法有許多種,比較常用的是屏蔽繪制和非屏蔽繪制,屏蔽繪制指的是事先做一張掩碼位圖,非屏蔽繪制是動態(tài)生成掩碼位圖。下面將分別詳細介紹這兩種繪制方法。在寫透明貼圖的方法前先來說說透明貼圖,所謂的透明貼圖并不是真正意義上的透明,而是圖像不需要顯示的部分顯示出的顏色是當前對話框的背景色,也就是說把圖像不需要顯示的顏色當成背景色,顯示的部分作為前景色,透明就是把
2、背景換成對話框背景。要實現(xiàn)這種透明有兩種方法,一種是讓背景色成為白色,然后與對話框背景色進行與運算;還有一種是讓背景色成為黑色,然后與對話框背景色進行或運算。這樣位圖的背景色就消失了。了解了透明的概念,就可以避免透明貼圖的一些缺點,如果位圖的前景色也存在許多白色,則采用將背景色變成黑色,與對話框背景色進行或運算的方法,這樣前景色的白色部分才不會被誤當成背景色透明顯示;反過來,如果位圖前景色存在大量黑色部分是,則采用將背景色變成白色,與對話框背景色進行與運算的方法。當然,如果前景色同時存在大量白色和黑色時,則透明貼圖會遇到大麻煩,需要想辦法將位圖的白色或黑色部分做一些修改后再進行透明貼圖。屏蔽繪
3、制 繪制透明位圖的關(guān)鍵就是創(chuàng)建一個“掩碼”位圖(mask bitmap),這個“掩碼”位圖是一個單色位圖,它是位圖中圖像的一個單色剪影。在MFC中,繪圖需要使用設(shè)備描述表,透明貼圖時需要創(chuàng)建兩個內(nèi)存設(shè)備描述表,一個是用于存放位圖的設(shè)備描述表(imgDC),一個是用于存放“掩碼”位圖的設(shè)備描述表(maskDC)。在“掩碼”位圖設(shè)備描述表中制作“掩碼”位圖的方法是先創(chuàng)建一個單色的bitmap,放入掩碼設(shè)備描述表(maskDC)中,然后使用拷貝粘貼的方式將存放有位圖的設(shè)備描述表(imgDC)繪制到掩碼設(shè)備描述表上,這樣,掩碼設(shè)備描述表顯示的位圖即是“掩碼”位圖。在詳細介紹實現(xiàn)過程之前先介紹下所使用的
4、畫圖函數(shù)以及函數(shù)參數(shù)所代表的功能;整個繪制過程需要使用到BitBlt()函數(shù),關(guān)于這個函數(shù),MSDN上的說明是這樣的:這個函數(shù)的功能是把源設(shè)備上下文中的一個矩形區(qū)域中所有像素的顏色比特信息傳輸給目標設(shè)備上下文。BOOL BitBlt(int x, int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, int ySrc, DWORD dwRop); 函數(shù)參數(shù)如下:Int x表示繪制位圖目標左上角x坐標;Int y表示繪制位圖目標左上角y坐標;Int nWidth表示繪制位圖目標的區(qū)域?qū)挾龋籌nt nHeight表示繪制位圖目標的區(qū)域高度;C
5、DC* pSrcDC表示存儲源位圖的設(shè)備描述表;Int xSrc表示源位圖的左上角x坐標;Int ySrc表示源位圖的左上角y坐標;DWORD dwRop表示柵格運算標志;dwRop的取值與值的描述如下表所示:值描述BLACKNESS用調(diào)色板中索引為0的顏色(默認是黑色)填充目標矩形。CAPTUREBLT用調(diào)色板中索引為0的顏色(默認是黑色)填充目標矩形。DSTINVERT將目標矩形反色。MERGECOPY將源矩形中的顏色與當前目標設(shè)備環(huán)境選中的畫刷通過邏輯與操作進行混合。MERGEPAINT將源矩形的顏色反色后與目標矩形的顏色通過邏輯或操作進行混合。NOMIRRORBITMAP防止位圖鏡像翻
6、轉(zhuǎn)。NOTSRCCOPY源矩形反色復(fù)制到目標矩形。NOTSRCERASE將源矩形與目標矩形的顏色通過邏輯或操作混合后,再反色。PATCOPY將目標設(shè)備環(huán)境選中的畫刷復(fù)制到目標位圖。PATINVERT將目標設(shè)備環(huán)境選中的畫刷與目標矩形中的顏色進行邏輯異或操作,復(fù)制到目標位圖。PATPAINT將目標設(shè)備環(huán)境選中的畫刷與源矩形中的顏色的反色進行邏輯或操作,其結(jié)果再與目標矩形的顏色進行邏輯或操作。SRCAND將源矩形與目標矩形的顏色進行邏輯與操作。SRCCOPY直接將源矩形拷貝到目標矩形,最常用的繪制位圖屬性。SRCERASE將目標矩形的反色與源矩形的顏色進行邏輯與操作。SRCINVERT將源矩形的顏
7、色與目標矩形進行邏輯異或操作。SRCPAINT將源矩形的顏色與目標矩形進行邏輯或操作。WHITENESS用調(diào)色板中索引為1的顏色(默認是白色)填充目標矩形。原圖如下所示,下面是整個實現(xiàn)過程:1) 創(chuàng)建一張大小與需要繪制圖像相同的位圖作為“掩碼”位圖;2) 將新創(chuàng)建的“掩碼”位圖存儲至掩碼位圖的設(shè)備描述表中;3) 把位圖設(shè)備描述表的背景設(shè)置成“透明色”,即不需要顯示的顏色;4) 復(fù)制粘貼位圖到“掩碼”位圖的設(shè)備描述表中,這個時候“掩碼”位圖設(shè)備描述表中存放的位圖與位圖設(shè)備描述表中的位圖一樣;5) 把需要透明繪制的位圖與對話框繪圖相應(yīng)區(qū)域的背景進行邏輯異或操作繪制到對話框上;結(jié)果如下圖所示,6)
8、把“掩碼”位圖與這個時候?qū)υ捒蛳鄳?yīng)區(qū)域的背景進行邏輯與的操作;結(jié)果如下圖所示,這個時候顯示出來的對話框背景就是需要繪制透明位圖的剪影了;7) 最后一步重復(fù)步驟5的操作,把需要透明繪制的位圖與對話框繪圖相應(yīng)區(qū)域的背景進行邏輯異或操作繪制到對話框上;結(jié)果如下圖所示,這個時候大功告成,位圖已經(jīng)透明地顯示在了對話框中;8) 當然最后不要忘記了把系統(tǒng)的畫筆還給系統(tǒng),刪除使用過的GDIObject,釋放非空的指針,最后把新建的設(shè)備描述表也刪除;具體代碼如下顯示,這段代碼只是截取了在WM_PAINT消息中對話框客戶區(qū)畫圖的部分,位圖的加載和刪除分別寫在OnInitDialog()函數(shù)和析構(gòu)函數(shù)中;CDC i
9、mgDC, maskDC; /定義存儲位圖的位圖設(shè)備描述表imgDC和存儲掩碼位圖的掩碼位圖/設(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); /存儲位圖至位圖設(shè)備描述表CBitmap * pOldMaskBmp = maskDC.SelectObject(&bmpMask);
11、 /存儲掩碼位圖至掩碼位圖/設(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);非屏蔽繪制說到非屏蔽繪制透明貼圖就是動態(tài)生成掩碼位圖,最常用的方法就是Transparent
13、Blt()函數(shù),關(guān)于這個函數(shù)MSDN上是這樣描述的:TransparentBlt()函數(shù)從指定源設(shè)備上下文中的矩形區(qū)域中像素的色彩信息轉(zhuǎn)化為目標設(shè)備上下文中。TransparentBlt()函數(shù)在Windows98/Windows2000以上版本運行,系統(tǒng)中需要包含 Msimg32.dll,使用時可以鏈接 Msimg32.lib。Windows98下的TransparentBlt()會產(chǎn)生資源泄漏,所以不建議在WIN98下使用該函數(shù)。TransparentBlt()函數(shù)原型如下: BOOL TransparentBlt(HDC hdcDest, /目標DCint nXOriginDest, /目標
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 垃圾焚燒發(fā)電行業(yè)報告
- 三農(nóng)村水資源管理方案手冊
- 三農(nóng)市場推廣策略與技巧指南
- 生態(tài)旅游度假區(qū)開發(fā)項目可行性研究報告
- 框架、技術(shù)與最佳實踐指南
- 餐飲連鎖店運營管理及拓展策略
- 施工安全管理考核細則
- 發(fā)改委立項可行性分析報告
- 農(nóng)業(yè)技術(shù)推廣創(chuàng)新模式指南
- 低空經(jīng)濟合作
- 不動產(chǎn)登記中心服務(wù)行為規(guī)范辦法(試行)
- 《ISO 55013-2024 資產(chǎn)管理-數(shù)據(jù)資產(chǎn)管理指南》專業(yè)解讀和應(yīng)用指導(dǎo)材料(雷澤佳編制-2024C0)【第1部分:1-130】
- 軟件資格考試嵌入式系統(tǒng)設(shè)計師(基礎(chǔ)知識、應(yīng)用技術(shù))合卷(中級)試卷與參考答案(2024年)
- 2024年下半年杭州黃湖鎮(zhèn)招考編外工作人員易考易錯模擬試題(共500題)試卷后附參考答案
- 浙江省第五屆初中生科學競賽初賽試題卷
- 雷鋒精神在2024:新時代下的學習
- 竣工驗收流程培訓課件
- 2024年上海中考化學終極押題密卷三含答案
- DB14∕T 1334-2017 波形鋼腹板預(yù)應(yīng)力混凝土組合結(jié)構(gòu)橋梁懸臂施工與驗收規(guī)范
- ECharts數(shù)據(jù)可視化課件 第4章 雷達圖、旭日圖和關(guān)系圖
- 幸福女人課件教學課件
評論
0/150
提交評論