青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆 - 224  文章 - 41  trackbacks - 0
<2009年3月>
22232425262728
1234567
891011121314
15161718192021
22232425262728
2930311234

享受編程

常用鏈接

留言簿(11)

隨筆分類(159)

隨筆檔案(224)

文章分類(2)

文章檔案(4)

經典c++博客

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

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

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

一、TransparentBlt 函數的使用

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

BOOL TransparentBlt(

HDC hdcDest,      // 目標DC

int nXOriginDest,   // 目標X偏移

int nYOriginDest,   // 目標Y偏移

int nWidthDest,     // 目標寬度

int hHeightDest,    // 目標高度

HDC hdcSrc,         // DC

int nXOriginSrc,    // X起點

int nYOriginSrc,    // Y起點

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);

二、實現TransparentBlt函數

為了理解具有透明色位圖的繪制過程,我們來親手建立一個具有同TransparentBlt功能一致的實驗函數,稱之為TransparentBlt2

實驗素材:有兩張位圖:bk.bmp是背景位圖,football.bmp包含透明區域,透明色為藍色RGB(0,0,0xff)
實驗目的:以bk.bmp為背景,將football.bmp繪制到背景中,形成如下的最終效果圖。
 

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

2.1.1 生成足球的單色掩碼位圖,透明區域為白色(全1),非透明區域為黑色(全0) 

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

SetBkColor(hImageDC, RGB(0,0,0xff)); // 設置背景色為藍色

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

這樣足球位圖中藍色區域在掩碼位圖中成了白色,其它區域為黑色,此時hMaskBMP 如下圖:
 (圖一)

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

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

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

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

這樣,掩碼位圖中背景色(黑色)的區域在hImageBMP中被保留,前景色(白色)的部分變為黑色。 此時hImageBMP 如下圖:
 (圖二)

2.1.3 設置背景色為白色,前景色為黑色,將掩碼位圖(圖一)與背景進行運算

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

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

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

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

2.1.4 hImageBMP(圖二)與背景(圖三)進行運算 

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

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

2.2 TransparentBlt2函數全部實現代碼

void TransparentBlt2( HDC hdcDest,      // 目標DC

                    int nXOriginDest,   // 目標X偏移

                    int nYOriginDest,   // 目標Y偏移

                    int nWidthDest,     // 目標寬度

                    int nHeightDest,    // 目標高度

                    HDC hdcSrc,         // DC

                    int nXOriginSrc,    // X起點

                    int nYOriginSrc,    // Y起點

                    int nWidthSrc,      // 源寬度

                    int nHeightSrc,     // 源高度

                    UINT crTransparent  // 透明色,COLORREF類型

                    )

{

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

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

    HDC     hImageDC = CreateCompatibleDC(hdcDest);

    HDC     hMaskDC = CreateCompatibleDC(hdcDest);

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

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

    // 將源DC中的位圖拷貝到臨時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);

    // 設置透明色

    SetBkColor(hImageDC, crTransparent);

    // 生成透明區域為白色,其它區域為黑色的掩碼位圖

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

    // 生成透明區域為黑色,其它區域保持不變的位圖

    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);

    // ""運算,生成最終效果

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

    // 清理、恢復    

    SelectObject(hImageDC, hOldImageBMP);

    DeleteDC(hImageDC);

    SelectObject(hMaskDC, hOldMaskBMP);

    DeleteDC(hMaskDC);

    DeleteObject(hImageBMP);

    DeleteObject(hMaskBMP);

}

2.3 TransparentBlt的另外一個版本:TransparentBltU

TransparentBltUChristian Graus WinDEV發表的一個函數,功能與TransparentBlt一致,以下是全部實現代碼

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函數旨在說明透明位圖的顯示原理,在Windows2000以上環境實際運用中建議使用現成的TransparentBlt函數來繪制透明位圖。

posted on 2010-03-18 15:18 漂漂 閱讀(472) 評論(0)  編輯 收藏 引用 所屬分類: 深入vc++
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            国产亚洲综合在线| 美女黄色成人网| 亚洲一区二区三区国产| 亚洲国产经典视频| 亚洲第一主播视频| 亚洲区欧美区| 亚洲一区二区免费在线| 亚洲美女黄网| 亚洲手机在线| 久久中文字幕一区| 蜜臀av性久久久久蜜臀aⅴ| 久久久久久久一区二区| 性感少妇一区| 欧美成年人视频网站| 欧美国产日韩xxxxx| 亚洲第一页在线| 亚洲高清视频在线| 亚洲天堂av在线免费观看| 久久亚洲精品一区二区| 欧美精品一区二| 国产伦精品一区二区三区四区免费 | 欧美日韩久久久久久| 国产精品理论片| 99精品视频免费观看| 久久视频一区二区| 国产亚洲aⅴaaaaaa毛片| 美女精品在线观看| 国产精品尤物| 亚洲欧美精品伊人久久| 日韩视频在线观看| 欧美日韩精品一区| 亚洲精品一区二区三区不| 久久久久久穴| 亚洲自拍都市欧美小说| 欧美午夜精品久久久久久超碰| 亚洲精品美女久久7777777| 久久一区二区三区av| 鲁大师成人一区二区三区| 狠狠色丁香久久婷婷综合丁香| 久久人体大胆视频| 曰本成人黄色| 亚洲精品久久久久久一区二区| 欧美激情综合色| 亚洲色图在线视频| 午夜欧美大片免费观看| 尤物网精品视频| 99re6这里只有精品| 国产日韩欧美综合一区| 欧美1区2区3区| 欧美性做爰毛片| 欧美在线999| 美女国产一区| 久久天天综合| 国产精品亚洲综合天堂夜夜| 蜜臀av国产精品久久久久| 国产精品高潮呻吟视频| 美日韩在线观看| 国产欧美日韩中文字幕在线| 亚洲高清自拍| 亚洲国产99| 久久久精品国产99久久精品芒果| 在线亚洲美日韩| 免费成人你懂的| 国产精品香蕉在线观看| 99热在线精品观看| 亚洲日本免费| 六月丁香综合| 久久精品视频在线播放| 国产网站欧美日韩免费精品在线观看 | 亚洲第一中文字幕| 久久精精品视频| 久久久精品性| 亚洲国产成人精品女人久久久| 一本色道久久综合亚洲精品不| 日韩视频久久| 免费亚洲一区二区| 亚洲国产精品一区制服丝袜| 久久尤物电影视频在线观看| 欧美电影在线免费观看网站| 亚洲欧洲另类| 国产精品激情| 亚洲午夜精品网| 久久字幕精品一区| 一本色道久久综合狠狠躁篇的优点 | 中文精品视频一区二区在线观看| 一本色道久久| 国产一区二区三区成人欧美日韩在线观看| 久久国产主播精品| 一本综合精品| 国产亚洲综合在线| 欧美激情一区二区三区在线视频 | 一区二区福利| 蜜臀久久久99精品久久久久久| 欧美激情一区二区| 亚洲在线免费| 在线日韩视频| 欧美系列亚洲系列| 久热爱精品视频线路一| aaa亚洲精品一二三区| 久久性色av| 久久精品导航| 亚洲欧洲av一区二区| 一区二区三区四区五区精品视频| 一色屋精品视频免费看| 国产欧美精品在线播放| 欧美日韩国产精品专区| 亚洲欧美一区二区三区极速播放 | 午夜精品三级视频福利| 99精品视频免费| 亚洲精品乱码久久久久久蜜桃91| 亚洲国产福利在线| 亚洲激情自拍| 99精品国产福利在线观看免费 | 欧美激情精品久久久久久免费印度 | 国产欧美一区二区三区在线老狼| 欧美日韩精品一区二区| 欧美日韩一区二区在线视频| 欧美体内she精视频| 亚洲精品国产精品国自产观看| 欧美一区二区精美| 欧美一区二区三区免费视| 亚洲欧美美女| 午夜在线a亚洲v天堂网2018| 欧美在线视频网站| 欧美福利一区二区三区| 一本久道综合久久精品| 午夜精品电影| 女人色偷偷aa久久天堂| 国产精品日韩二区| 亚洲黄色影院| 亚洲一区二区在线免费观看视频| 香港成人在线视频| 欧美暴力喷水在线| 一本久久a久久免费精品不卡| 久久爱www久久做| 欧美成人中文| 亚洲国产另类久久精品| 久久精品国产精品亚洲综合| 欧美大片在线看免费观看| 午夜精品久久久久久久白皮肤| 欧美激情视频在线播放| 在线成人av网站| 久久亚洲春色中文字幕久久久| 亚洲无线视频| 国产精品一区二区在线| 亚洲自拍16p| 一个色综合av| 欧美日韩成人综合天天影院| 欧美日韩不卡合集视频| 国产精品免费看久久久香蕉| 国产在线精品一区二区夜色| 1000精品久久久久久久久 | 亚洲欧美日韩系列| 国产精品亚洲综合色区韩国| 亚洲一区黄色| 欧美一区2区三区4区公司二百| 国产日韩精品视频一区二区三区| 亚洲精品少妇| 亚洲伊人一本大道中文字幕| 亚洲黄页视频免费观看| 亚洲激情视频在线| 欧美日韩国产综合久久| 亚洲伊人久久综合| 久久成人18免费网站| 国产日韩精品视频一区二区三区| 久久精品av麻豆的观看方式 | 午夜亚洲一区| 欧美区亚洲区| 99视频在线精品国自产拍免费观看 | 一本色道久久| 免费看成人av| 欧美成人综合在线| 一本色道精品久久一区二区三区 | 欧美91大片| 黑人一区二区三区四区五区| 欧美在线免费观看视频| 性刺激综合网| 一本一本a久久| 99热精品在线观看| 亚洲大胆人体在线| 一区二区三区精品| 在线综合亚洲| 欧美freesex交免费视频| 欧美高清hd18日本| 一区二区av| 亚洲一区二区三区乱码aⅴ| 亚洲欧美日韩另类| 亚洲欧洲三级电影| 欧美α欧美αv大片| 亚洲国产欧美久久| 亚洲国产一二三| 美国十次成人| 欧美成人精品在线播放| 91久久综合亚洲鲁鲁五月天| 久久一区二区三区四区| 免费久久99精品国产自| 91久久国产精品91久久性色| 久久精品一二三区| 翔田千里一区二区| 久久精品在线|