• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆 - 224  文章 - 41  trackbacks - 0
            <2011年5月>
            24252627282930
            1234567
            891011121314
            15161718192021
            22232425262728
            2930311234

            享受編程

            常用鏈接

            留言簿(11)

            隨筆分類(159)

            隨筆檔案(224)

            文章分類(2)

            文章檔案(4)

            經(jīng)典c++博客

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            原文地址:http://www.vckbase.com/document/viewdoc/?id=532

            包含透明色的位圖的繪制方法有多種,最簡單的方法是調(diào)用現(xiàn)成的函數(shù):TransparentBlt,也可以通過自己的代碼實(shí)現(xiàn)類似TransparentBlt的功能,實(shí)現(xiàn)過程也有兩種形式,一種是事先做一張掩碼位圖,另一種是動態(tài)生成掩碼位圖。本文將介紹動態(tài)生成掩碼位圖繪制具有透明區(qū)域位圖的方法。

            一、TransparentBlt 函數(shù)的使用

            TransparentBlt 函數(shù)在Windows98/Windows2000以上版本運(yùn)行,系統(tǒng)中需要包含 Msimg32.dll,使用時(shí)可以鏈接 Msimg32.lib
            Windows98下的TransparentBlt會產(chǎn)生資源泄漏,所以不建議在WIN98下使用該函數(shù)。
            TransparentBlt函數(shù)原型如下:

            BOOL TransparentBlt(

            HDC hdcDest,      // 目標(biāo)DC

            int nXOriginDest,   // 目標(biāo)X偏移

            int nYOriginDest,   // 目標(biāo)Y偏移

            int nWidthDest,     // 目標(biāo)寬度

            int hHeightDest,    // 目標(biāo)高度

            HDC hdcSrc,         // DC

            int nXOriginSrc,    // X起點(diǎn)

            int nYOriginSrc,    // Y起點(diǎn)

            int nWidthSrc,      // 源寬度

            int nHeightSrc,     // 源高度

            UINT crTransparent  // 透明色,COLORREF類型

            );

            使用示例

            CBitmap FootballBMP;

            FootballBMP.LoadBitmap(IDB_FOOTBALLBMP);

            CDC ImageDC;

            ImageDC.CreateCompatibleDC(pDC);

            CBitmap *pOldImageBMP = ImageDC.SelectObject(&FootballBMP);

            TransparentBlt(pDC->m_hDC, 0, 0, 218, 199, ImageDC.m_hDC, 0, 0, 218, 199, RGB(0,0,0xff));

            ImageDC.SelectObject(pOldImageBMP);

            二、實(shí)現(xiàn)TransparentBlt函數(shù)

            為了理解具有透明色位圖的繪制過程,我們來親手建立一個(gè)具有同TransparentBlt功能一致的實(shí)驗(yàn)函數(shù),稱之為TransparentBlt2

            實(shí)驗(yàn)素材:有兩張位圖:bk.bmp是背景位圖,football.bmp包含透明區(qū)域,透明色為藍(lán)色RGB(0,0,0xff)
            實(shí)驗(yàn)?zāi)康模阂?font face="Times New Roman">bk.bmp為背景,將football.bmp繪制到背景中,形成如下的最終效果圖。
             

            2.1 透明位圖繪制原理
            假設(shè)football.bmp ->載入 HBITMAP hImageBMP -> 選入 HDC hImageDC

            2.1.1 生成足球的單色掩碼位圖,透明區(qū)域?yàn)榘咨ㄈ?/font>1),非透明區(qū)域?yàn)楹谏ㄈ?/font>0) 

            HBITMAP hMaskBMP = CreateBitmap(nWidthDest, nHeightDest, 1, 1, NULL); // 建立單色位圖

            SetBkColor(hImageDC, RGB(0,0,0xff)); // 設(shè)置背景色為藍(lán)色

            BitBlt(hMaskDC, 0, 0, nWidthDest, nHeightDest, hImageDC, 0, 0, SRCCOPY); // 拷貝到hMaskDC

            這樣足球位圖中藍(lán)色區(qū)域在掩碼位圖中成了白色,其它區(qū)域?yàn)楹谏藭r(shí)hMaskBMP 如下圖:
             (圖一)

            2.1.2 設(shè)置背景色為黑色,前景色為白色,將掩碼位圖(圖一)與足球位圖相"" 

            SetBkColor(hImageDC, RGB(0,0,0));

            SetTextColor(hImageDC, RGB(255,255,255));

            BitBlt(hImageDC, 0, 0, nWidthDest, nHeightDest, hMaskDC, 0, 0, SRCAND);

            這樣,掩碼位圖中背景色(黑色)的區(qū)域在hImageBMP中被保留,前景色(白色)的部分變?yōu)楹谏?nbsp;此時(shí)hImageBMP 如下圖:
             (圖二)

            2.1.3 設(shè)置背景色為白色,前景色為黑色,將掩碼位圖(圖一)與背景進(jìn)行運(yùn)算

            SetBkColor(hdcDest,RGB(255,255,255));

            SetTextColor(hdcDest,RGB(0,0,0));

            BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hMaskDC, 0, 0, SRCAND);

            掩碼中白色區(qū)域(數(shù)據(jù)與1結(jié)果不變)使背景保持不變,黑色區(qū)域變成黑色,此時(shí)背景顯示如下:
             (圖三)

            2.1.4 hImageBMP(圖二)與背景(圖三)進(jìn)行運(yùn)算 

            BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hImageDC, 0, 0, SRCPAINT);

            這樣就將足球繪制到背景上了。

            2.2 TransparentBlt2函數(shù)全部實(shí)現(xiàn)代碼

            void TransparentBlt2( HDC hdcDest,      // 目標(biāo)DC

                                int nXOriginDest,   // 目標(biāo)X偏移

                                int nYOriginDest,   // 目標(biāo)Y偏移

                                int nWidthDest,     // 目標(biāo)寬度

                                int nHeightDest,    // 目標(biāo)高度

                                HDC hdcSrc,         // DC

                                int nXOriginSrc,    // X起點(diǎn)

                                int nYOriginSrc,    // Y起點(diǎn)

                                int nWidthSrc,      // 源寬度

                                int nHeightSrc,     // 源高度

                                UINT crTransparent  // 透明色,COLORREF類型

                                )

            {

                HBITMAP hOldImageBMP, hImageBMP = CreateCompatibleBitmap(hdcDest, nWidthDest, nHeightDest); // 創(chuàng)建兼容位圖

                HBITMAP hOldMaskBMP, hMaskBMP = CreateBitmap(nWidthDest, nHeightDest, 1, 1, NULL);          // 創(chuàng)建單色掩碼位圖

                HDC     hImageDC = CreateCompatibleDC(hdcDest);

                HDC     hMaskDC = CreateCompatibleDC(hdcDest);

                hOldImageBMP = (HBITMAP)SelectObject(hImageDC, hImageBMP);

                hOldMaskBMP = (HBITMAP)SelectObject(hMaskDC, hMaskBMP);

                // 將源DC中的位圖拷貝到臨時(shí)DC

                if (nWidthDest == nWidthSrc && nHeightDest == nHeightSrc)

                    BitBlt(hImageDC, 0, 0, nWidthDest, nHeightDest, hdcSrc, nXOriginSrc, nYOriginSrc, SRCCOPY);

                else

                    StretchBlt(hImageDC, 0, 0, nWidthDest, nHeightDest, 

                                hdcSrc, nXOriginSrc, nYOriginSrc, nWidthSrc, nHeightSrc, SRCCOPY);

                // 設(shè)置透明色

                SetBkColor(hImageDC, crTransparent);

                // 生成透明區(qū)域?yàn)榘咨渌鼌^(qū)域?yàn)楹谏难诖a位圖

                BitBlt(hMaskDC, 0, 0, nWidthDest, nHeightDest, hImageDC, 0, 0, SRCCOPY);

                // 生成透明區(qū)域?yàn)楹谏渌鼌^(qū)域保持不變的位圖

                SetBkColor(hImageDC, RGB(0,0,0));

                SetTextColor(hImageDC, RGB(255,255,255));

                BitBlt(hImageDC, 0, 0, nWidthDest, nHeightDest, hMaskDC, 0, 0, SRCAND);

                // 透明部分保持屏幕不變,其它部分變成黑色

                SetBkColor(hdcDest,RGB(255,255,255));

                SetTextColor(hdcDest,RGB(0,0,0));

                BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hMaskDC, 0, 0, SRCAND);

                // ""運(yùn)算,生成最終效果

                BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hImageDC, 0, 0, SRCPAINT);

                // 清理、恢復(fù)    

                SelectObject(hImageDC, hOldImageBMP);

                DeleteDC(hImageDC);

                SelectObject(hMaskDC, hOldMaskBMP);

                DeleteDC(hMaskDC);

                DeleteObject(hImageBMP);

                DeleteObject(hMaskBMP);

            }

            2.3 TransparentBlt的另外一個(gè)版本:TransparentBltU

            TransparentBltUChristian Graus WinDEV發(fā)表的一個(gè)函數(shù),功能與TransparentBlt一致,以下是全部實(shí)現(xiàn)代碼

            bool TransparentBltU(

                 HDC dcDest,         // handle to Dest DC

                 int nXOriginDest,   // x-coord of destination upper-left corner

                 int nYOriginDest,   // y-coord of destination upper-left corner

                 int nWidthDest,     // width of destination rectangle

                 int nHeightDest,    // height of destination rectangle

                 HDC dcSrc,          // handle to source DC

                 int nXOriginSrc,    // x-coord of source upper-left corner

                 int nYOriginSrc,    // y-coord of source upper-left corner

                 int nWidthSrc,      // width of source rectangle

                 int nHeightSrc,     // height of source rectangle

                 UINT crTransparent  // color to make transparent

              )

            {

                 if (nWidthDest < 1) return false;

                 if (nWidthSrc < 1) return false;

                 if (nHeightDest < 1) return false;

                 if (nHeightSrc < 1) return false;

                 HDC dc = CreateCompatibleDC(NULL);

                 HBITMAP bitmap = CreateBitmap(nWidthSrc, nHeightSrc, 1, GetDeviceCaps(dc,

                                                                          BITSPIXEL), NULL);

                 if (bitmap == NULL)

                 {

                     DeleteDC(dc);    

                     return false;

                 }

                 HBITMAP oldBitmap = (HBITMAP)SelectObject(dc, bitmap);

                 if (!BitBlt(dc, 0, 0, nWidthSrc, nHeightSrc, dcSrc, nXOriginSrc,

                                                                     nYOriginSrc, SRCCOPY))

                 {

                     SelectObject(dc, oldBitmap); 

                     DeleteObject(bitmap);        

                     DeleteDC(dc);                

                     return false;

                 }

                 HDC maskDC = CreateCompatibleDC(NULL);

                 HBITMAP maskBitmap = CreateBitmap(nWidthSrc, nHeightSrc, 1, 1, NULL);

                 if (maskBitmap == NULL)

                 {

                     SelectObject(dc, oldBitmap); 

                     DeleteObject(bitmap);        

                     DeleteDC(dc);                

                     DeleteDC(maskDC);            

                     return false;

                 }

                 HBITMAP oldMask =  (HBITMAP)SelectObject(maskDC, maskBitmap);

                 SetBkColor(maskDC, RGB(0,0,0));

                 SetTextColor(maskDC, RGB(255,255,255));

                 if (!BitBlt(maskDC, 0,0,nWidthSrc,nHeightSrc,NULL,0,0,BLACKNESS))

                 {

                     SelectObject(maskDC, oldMask); 

                     DeleteObject(maskBitmap);      

                     DeleteDC(maskDC);              

                     SelectObject(dc, oldBitmap);   

                     DeleteObject(bitmap);          

                     DeleteDC(dc);                  

                     return false;

                 }

                 SetBkColor(dc, crTransparent);

                 BitBlt(maskDC, 0,0,nWidthSrc,nHeightSrc,dc,0,0,SRCINVERT);

                 SetBkColor(dc, RGB(0,0,0));

                 SetTextColor(dc, RGB(255,255,255));

                 BitBlt(dc, 0,0,nWidthSrc,nHeightSrc,maskDC,0,0,SRCAND);

                 HDC newMaskDC = CreateCompatibleDC(NULL);

                 HBITMAP newMask;

                 newMask = CreateBitmap(nWidthDest, nHeightDest, 1,

                                                GetDeviceCaps(newMaskDC, BITSPIXEL), NULL);

                 if (newMask == NULL)

                 {

                     SelectObject(dc, oldBitmap);

                     DeleteDC(dc);

                     SelectObject(maskDC, oldMask);

                     DeleteDC(maskDC);

                      DeleteDC(newMaskDC);

                     DeleteObject(bitmap);     

                     DeleteObject(maskBitmap); 

                     return false;

                 }

                 SetStretchBltMode(newMaskDC, COLORONCOLOR);

                 HBITMAP oldNewMask = (HBITMAP) SelectObject(newMaskDC, newMask);

                 StretchBlt(newMaskDC, 0, 0, nWidthDest, nHeightDest, maskDC, 0, 0,

                                                           nWidthSrc, nHeightSrc, SRCCOPY);

                 SelectObject(maskDC, oldMask);

                 DeleteDC(maskDC);

                 DeleteObject(maskBitmap); 

                 HDC newImageDC = CreateCompatibleDC(NULL);

                 HBITMAP newImage = CreateBitmap(nWidthDest, nHeightDest, 1,

                                                GetDeviceCaps(newMaskDC, BITSPIXEL), NULL);

                 if (newImage == NULL)

                 {

                     SelectObject(dc, oldBitmap);

                     DeleteDC(dc);

                     DeleteDC(newMaskDC);

                     DeleteObject(bitmap);     

                     return false;

                 }

                 HBITMAP oldNewImage = (HBITMAP)SelectObject(newImageDC, newImage);

                 StretchBlt(newImageDC, 0, 0, nWidthDest, nHeightDest, dc, 0, 0, nWidthSrc,

                                                                      nHeightSrc, SRCCOPY);

                 SelectObject(dc, oldBitmap);

                 DeleteDC(dc);

                 DeleteObject(bitmap);     

                 BitBlt( dcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest,

                                                                  newMaskDC, 0, 0, SRCAND);

                 BitBlt( dcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest,

                                                               newImageDC, 0, 0, SRCPAINT);

                 SelectObject(newImageDC, oldNewImage);

                 DeleteDC(newImageDC);

                 SelectObject(newMaskDC, oldNewMask);

                 DeleteDC(newMaskDC);

                 DeleteObject(newImage);   

                 DeleteObject(newMask);    

                 return true;

            }


            說明:本文提供的TransparentBlt2函數(shù)旨在說明透明位圖的顯示原理,在Windows2000以上環(huán)境實(shí)際運(yùn)用中建議使用現(xiàn)成的TransparentBlt函數(shù)來繪制透明位圖。

            posted on 2010-03-18 15:18 漂漂 閱讀(454) 評論(0)  編輯 收藏 引用 所屬分類: 深入vc++
            亚洲中文字幕无码久久2020| 久久久久久av无码免费看大片| 久久精品国产亚洲欧美| 亚洲中文字幕伊人久久无码| 亚洲午夜久久久精品影院| 久久精品黄AA片一区二区三区| 久久久久久国产a免费观看黄色大片| 久久精品www| 国产精品成人99久久久久91gav| 欧美黑人又粗又大久久久| 伊人久久大香线蕉成人| 久久精品无码一区二区三区日韩 | 国产69精品久久久久久人妻精品 | 久久99热这里只有精品国产| 久久久久久久97| 亚洲精品tv久久久久久久久久| 国产精品美女久久久m| 欧美无乱码久久久免费午夜一区二区三区中文字幕 | 久久综合综合久久97色| 久久久久亚洲AV片无码下载蜜桃| 91精品国产综合久久久久久| 欧美日韩精品久久久免费观看| 国产激情久久久久影院老熟女| 日产精品99久久久久久| 久久精品国产精品亚洲下载| 久久精品国产99国产精品澳门| 精品无码久久久久国产动漫3d| 久久综合视频网站| 精品久久久久久99人妻| 久久精品一区二区| 777米奇久久最新地址| 久久精品国产免费观看| 无码人妻少妇久久中文字幕| 亚洲精品tv久久久久| 色婷婷久久久SWAG精品| 久久婷婷五月综合97色直播| 蜜桃麻豆www久久国产精品| 久久亚洲精品无码播放| 三级韩国一区久久二区综合 | 色婷婷综合久久久中文字幕| 午夜精品久久久久久久久|