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

KISS(Keep It Simple, Standard)

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

常用鏈接

留言簿(10)

我參與的團(tuán)隊(duì)

搜索

  •  

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

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

一、TransparentBlt 函數(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)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)康模阂詁k.bmp為背景,將football.bmp繪制到背景中,形成如下的最終效果圖。

 



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

2.1.1 生成足球的單色掩碼位圖,透明區(qū)域?yàn)榘咨ㄈ?),非透明區(qū)域?yàn)楹谏ㄈ?)
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)楹谏?此時(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

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

Feedback

# re: 透明位圖的顯示(轉(zhuǎn)) 2007-09-02 13:42 螞蟻終結(jié)者
不錯(cuò),記得前不久還遇到過處理透明位圖的問題。不過當(dāng)時(shí)還不知道
TransparentBlt,是自己另做的掩碼位圖  回復(fù)  更多評(píng)論
  

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲男人的天堂在线aⅴ视频| 亚洲欧美日韩一区二区三区在线| 麻豆freexxxx性91精品| 欧美一级午夜免费电影| 欧美自拍偷拍| 久久狠狠婷婷| 免费人成精品欧美精品| 欧美精品国产一区二区| 国产精品国产精品| 国产自产高清不卡| 亚洲国产精品热久久| 亚洲人妖在线| 一区二区三区精密机械公司| 亚洲欧美综合网| 久久米奇亚洲| 最新日韩欧美| 亚洲一区二区三区四区中文| 欧美一区二区观看视频| 欧美刺激性大交免费视频| 欧美视频一区二区在线观看| 国产揄拍国内精品对白| 亚洲另类一区二区| 欧美一区二区三区四区在线| 亚洲第一区在线| 午夜国产精品视频免费体验区| 蜜臀99久久精品久久久久久软件 | 亚洲日本激情| 亚洲欧美日韩国产另类专区| 亚洲精品一区二区三区四区高清| 亚洲综合首页| 麻豆久久婷婷| 国产老肥熟一区二区三区| 亚洲国产精品va在线看黑人动漫 | 欧美色精品在线视频| 国产综合色产在线精品| 国产精品99久久久久久白浆小说| 狂野欧美一区| 午夜一区二区三区在线观看| 欧美日韩免费在线观看| 亚洲国产精品久久久久| 久久久噜噜噜| 亚洲自拍偷拍视频| 欧美日韩高清区| 亚洲韩日在线| 麻豆国产精品777777在线 | 嫩草伊人久久精品少妇av杨幂| 国产精品入口麻豆原神| 9l国产精品久久久久麻豆| 老司机午夜精品视频| 亚洲欧美一区二区激情| 国产精品成人观看视频国产奇米| 亚洲三级电影全部在线观看高清| 久久久五月天| 久久精品视频播放| 狠狠色丁香婷婷综合| 久久精品欧美| 欧美亚洲综合久久| 国产精品视频一区二区高潮| 亚洲影院色在线观看免费| 日韩视频免费观看高清完整版| 欧美成人午夜激情在线| 亚洲大片在线| 亚洲第一成人在线| 免费成人黄色片| 最新成人在线| 亚洲精品日韩在线| 欧美日本韩国一区| 亚洲视频免费在线| 在线性视频日韩欧美| 欧美午夜www高清视频| 亚洲欧美日韩国产中文在线| 亚洲综合日韩中文字幕v在线| 国产伦精品一区二区三区视频黑人 | 一区二区三欧美| 亚洲九九爱视频| 欧美日韩伦理在线免费| 亚洲影院在线观看| 亚洲欧美国产一区二区三区| 国产真实久久| 亚洲国产国产亚洲一二三| 欧美日韩国产一区二区| 妖精成人www高清在线观看| 国产日韩综合| 久久精品夜色噜噜亚洲a∨| 久久久精品免费视频| 亚洲欧洲精品一区二区三区波多野1战4| 亚洲国产欧美一区二区三区同亚洲 | 老牛嫩草一区二区三区日本| 最新成人av网站| 一区二区三区不卡视频在线观看| 国产精品夜夜嗨| 欧美第十八页| 国产精品日韩久久久久| 欧美高清免费| 国产精品美女久久| 欧美成人国产va精品日本一级| 欧美日韩亚洲一区二区三区| 欧美中文字幕在线播放| 欧美a级一区| 性久久久久久| 欧美激情第五页| 久久久青草青青国产亚洲免观| 欧美精品一区二| 久久久水蜜桃av免费网站| 欧美国产一区二区| 久久精品中文字幕一区| 欧美理论视频| 欧美18av| 国产日韩综合一区二区性色av| 亚洲人成7777| 亚洲二区免费| 欧美一区二区性| 亚洲免费在线电影| 欧美成人黄色小视频| 久久久久国产精品午夜一区| 欧美日韩综合另类| 亚洲黄色在线看| 国内精品一区二区三区| 在线亚洲伦理| 一区二区电影免费观看| 老司机aⅴ在线精品导航| 久久av在线| 国产精品你懂的在线| 日韩视频在线永久播放| 亚洲欧洲综合另类在线| 久久蜜桃av一区精品变态类天堂| 欧美一区二区三区免费视频| 欧美日韩综合久久| 亚洲七七久久综合桃花剧情介绍| 精品999成人| 久久成人人人人精品欧| 久久精品在线观看| 国产欧美综合在线| 亚洲在线1234| 欧美诱惑福利视频| 国产精品视频一区二区高潮| 亚洲视频在线观看视频| 亚洲综合色噜噜狠狠| 国产精品久久久久一区二区三区| 一本色道久久综合亚洲精品不卡 | 日韩五码在线| 久久国产加勒比精品无码| 欧美日韩一区二区欧美激情 | 国产日韩欧美中文在线播放| 中日韩视频在线观看| 亚洲男人av电影| 国产精品福利网站| 亚洲视频播放| 久久不射电影网| 国内欧美视频一区二区| 久久久之久亚州精品露出| 欧美大香线蕉线伊人久久国产精品| 亚洲第一在线| 欧美日产在线观看| 亚洲视频电影在线| 欧美专区日韩视频| 在线观看一区二区视频| 欧美大色视频| 中日韩美女免费视频网址在线观看| 亚洲欧洲99久久| 一区二区自拍| 欧美黄色一区| 亚洲色图在线视频| 久久美女性网| 99国产麻豆精品| 国产精品影院在线观看| 久久男人av资源网站| 亚洲精品久久久久久久久| 亚洲综合欧美| 亚洲国产成人久久综合| 欧美日韩综合| 久久久久99| 9国产精品视频| 久久综合色婷婷| 一本色道久久综合精品竹菊| 国产精品自拍视频| 欧美大胆成人| 午夜一级在线看亚洲| 亚洲国产欧美日韩另类综合| 午夜欧美视频| 亚洲精品中文字| 国产亚洲一级高清| 欧美日韩福利在线观看| 久久久久久亚洲精品杨幂换脸| 亚洲麻豆av| 欧美福利在线| 久久爱www.| 一区二区三区高清不卡| 在线观看不卡av| 国产精品一区二区三区久久久| 免费观看亚洲视频大全| 午夜精品福利视频| 日韩一区二区电影网| 免费亚洲视频| 久久超碰97人人做人人爱| 日韩一级免费| 亚洲国产婷婷香蕉久久久久久99| 国产日韩欧美亚洲| 国产精品视频网址| 欧美日韩国产精品一卡|