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

KISS(Keep It Simple, Standard)

  C++博客 :: 首頁 :: 聯系 :: 聚合  :: 管理
  10 Posts :: 0 Stories :: 24 Comments :: 0 Trackbacks

常用鏈接

留言簿(10)

我參與的團隊

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

包含透明色的位圖的繪制方法有多種,最簡單的方法是調用現成的函數: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

TransparentBltU是Christian 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 2007-08-30 16:52 QUIRE-0216 閱讀(937) 評論(1)  編輯 收藏 引用 所屬分類: MFC

Feedback

# re: 透明位圖的顯示(轉) 2007-09-02 13:42 螞蟻終結者
不錯,記得前不久還遇到過處理透明位圖的問題。不過當時還不知道
TransparentBlt,是自己另做的掩碼位圖  回復  更多評論
  

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲黄色影片| 国产精品美女一区二区在线观看| 亚洲欧洲精品一区二区三区不卡 | 久久久久se| 国产欧美日本一区视频| 欧美一区二区三区精品| 久久夜色精品国产欧美乱| 欧美中日韩免费视频| 永久91嫩草亚洲精品人人| 另类尿喷潮videofree| 久久久www成人免费精品| 91久久视频| 亚洲美女黄色片| 亚洲国产精品综合| 国产日韩一区二区| 午夜精品久久久久久久99热浪潮 | 久久午夜视频| 欧美性猛片xxxx免费看久爱| 麻豆精品传媒视频| 欧美三级网址| 一本综合精品| 一本久道久久综合婷婷鲸鱼| 亚洲欧美一区二区原创| 亚洲国产精品一区二区尤物区| 日韩午夜激情av| 亚洲人成网站色ww在线| 性欧美video另类hd性玩具| 亚洲视频axxx| 欧美三区视频| 在线精品亚洲| 欧美在线观看一区二区| 亚洲一区二区三区四区在线观看| 久久久蜜桃一区二区人| 久久一综合视频| 在线免费高清一区二区三区| 亚洲欧美国产精品桃花| 亚洲欧美美女| 久久久久综合一区二区三区| 欧美视频你懂的| 一本色道久久综合亚洲精品不 | 亚洲午夜电影在线观看| 新67194成人永久网站| 久久影院亚洲| 欧美激情一区二区三区在线 | 国产精品久久久久久久久免费樱桃 | 免费av成人在线| 影音国产精品| 国产乱理伦片在线观看夜一区| 亚洲综合首页| 在线视频一区二区| 影音欧美亚洲| 国产精品av免费在线观看| 亚洲欧美不卡| 亚洲一区二区成人| 久久频这里精品99香蕉| 91久久视频| 国产精品亚洲美女av网站| 99精品欧美一区二区蜜桃免费| 中文精品99久久国产香蕉| 亚洲欧洲一区二区三区| 亚洲私人黄色宅男| 亚洲国产成人高清精品| 性欧美精品高清| 日韩一区二区免费高清| 欧美黄色免费| 亚洲福利视频在线| 亚洲国产精品一区二区久| 久久精品久久99精品久久| 亚洲综合色丁香婷婷六月图片| 国产一区二区精品久久| 国内视频一区| 国产嫩草一区二区三区在线观看| 欧美成人影音| 欧美精品七区| 欧美激情中文字幕乱码免费| 久久精彩免费视频| 一区二区三区福利| 久久精品国产亚洲5555| 亚洲国产精品美女| 久久精视频免费在线久久完整在线看| 欧美一区国产一区| 另类综合日韩欧美亚洲| 91久久香蕉国产日韩欧美9色| 久久一区二区视频| 亚洲欧美日韩国产综合| 亚洲欧美激情一区| 欧美国产日韩二区| 亚洲一区二区精品在线| 性色av一区二区三区在线观看| 久久人体大胆视频| 国产欧美日韩激情| 亚洲欧洲精品一区二区精品久久久| 亚洲伦理一区| 日韩一级在线观看| 亚洲一区二区精品在线| 久久精品国内一区二区三区| 欧美专区一区二区三区| 国产精品欧美在线| 亚洲精品123区| 久久久久国色av免费看影院| 老色鬼精品视频在线观看播放| 亚洲高清视频中文字幕| 久久国产综合精品| 一区二区三区国产在线| 欧美肉体xxxx裸体137大胆| 国产精品久久婷婷六月丁香| 亚洲视频axxx| 久久先锋影音av| 老司机成人网| 亚洲午夜精品久久久久久app| 亚洲一区日韩| 亚洲欧美日韩精品在线| 欧美日韩另类字幕中文| 欧美高清在线视频观看不卡| 中文精品在线| 欧美ab在线视频| 亚洲一区在线观看视频| 在线观看一区| 国产乱码精品1区2区3区| 亚洲级视频在线观看免费1级| 亚洲另类自拍| 免费成人在线观看视频| 午夜国产精品影院在线观看| 亚洲日本精品国产第一区| 国产日本亚洲高清| 亚洲理论在线| 久久精品二区亚洲w码| 日韩亚洲国产精品| 免费日韩精品中文字幕视频在线| 亚洲一区二区黄| 日韩视频在线观看国产| 伊人狠狠色j香婷婷综合| 国产精品美女久久久久aⅴ国产馆| 女主播福利一区| 久久亚洲风情| 久久国产精品99久久久久久老狼| 亚洲一级黄色片| 一本色道久久99精品综合 | 欧美xxx在线观看| 性欧美videos另类喷潮| 国产精品拍天天在线| 国产精品久久久久久久久免费樱桃| 欧美激情精品久久久久久蜜臀| 久久嫩草精品久久久精品| 欧美一区二区三区在线播放| 亚洲在线视频网站| 亚洲曰本av电影| 亚洲综合色丁香婷婷六月图片| 亚洲桃色在线一区| 亚洲午夜久久久久久久久电影网| 一区二区国产在线观看| 亚洲社区在线观看| 一本到高清视频免费精品| 亚洲免费福利视频| 99精品视频免费观看| 中文欧美日韩| 亚洲欧美成人一区二区在线电影| 亚洲激情视频网站| 久久精品99无色码中文字幕 | 先锋亚洲精品| 性欧美videos另类喷潮| 久久精品电影| 美日韩精品免费观看视频| 嫩草成人www欧美| 欧美精品在线一区| 欧美日韩日本视频| 久久精品国产清高在天天线| 久久精彩免费视频| 新狼窝色av性久久久久久| 一区二区三区视频在线播放| 亚洲精品久久嫩草网站秘色| 欧美视频精品在线观看| 欧美日韩国产探花| 欧美成人精品福利| 欧美精品网站| 在线一区二区三区四区| 欧美激情第二页| 久久九九电影| 欧美激情在线有限公司| 欧美一区二视频| 巨乳诱惑日韩免费av| 久久久久国产精品www| 久久精品成人一区二区三区| 亚洲经典自拍| 久久精品一区蜜桃臀影院| 美女国产一区| 欧美日韩亚洲精品内裤| 久久综合九色99| 久久久亚洲人| 久久久久久久久久久久久女国产乱 | 国产精品美女www爽爽爽视频| 欧美日韩一区二区三区在线视频| 日韩亚洲欧美在线观看| 亚洲欧美一级二级三级| 久久综合色综合88| 中日韩美女免费视频网址在线观看 | 亚洲自拍16p| 男人的天堂亚洲| 国产综合欧美| 亚洲专区国产精品|