45fan.com - 路饭网
首页
路由器设置
无线路由器
路由器密码
网络频道
手机频道
电脑频道
图库频道
问答中心
搜索:
智能搜索
搜索标题
您的位置
:
主页
>
电脑频道
>
电脑教程
> 阅读资讯:怎么样画透明背景的位图?
怎么样画透明背景的位图?
2016-08-30 13:02:16 来源:www.45fan.com 【
大
中
小
】
怎么样画透明背景的位图?
//
该函数摘自MSDN.
void
DrawTransparentBitmap(HDChdc,HBITMAPhBitmap,
short
xStart,
short
yStart,COLORREFcTransparentColor)
...
{
BITMAPbm;
COLORREFcColor;
HBITMAPbmAndBack,bmAndObject,bmAndMem,bmSave;
HBITMAPbmBackOld,bmObjectOld,bmMemOld,bmSaveOld;
HDChdcMem,hdcBack,hdcObject,hdcTemp,hdcSave;
POINTptSize;
hdcTemp
=
CreateCompatibleDC(hdc);
SelectObject(hdcTemp,hBitmap);
//
Selectthebitmap
GetObject(hBitmap,
sizeof
(BITMAP),(LPSTR)
&
bm);
ptSize.x
=
bm.bmWidth;
//
Getwidthofbitmap
ptSize.y
=
bm.bmHeight;
//
Getheightofbitmap
DPtoLP(hdcTemp,
&
ptSize,
1
);
//
Convertfromdevice
//
tologicalpoints
//
CreatesomeDCstoholdtemporarydata.
hdcBack
=
CreateCompatibleDC(hdc);
hdcObject
=
CreateCompatibleDC(hdc);
hdcMem
=
CreateCompatibleDC(hdc);
hdcSave
=
CreateCompatibleDC(hdc);
//
CreateabitmapforeachDC.DCsarerequiredforanumberof
//
GDIfunctions.
//
MonochromeDC
bmAndBack
=
CreateBitmap(ptSize.x,ptSize.y,
1
,
1
,NULL);
//
MonochromeDC
bmAndObject
=
CreateBitmap(ptSize.x,ptSize.y,
1
,
1
,NULL);
bmAndMem
=
CreateCompatibleBitmap(hdc,ptSize.x,ptSize.y);
bmSave
=
CreateCompatibleBitmap(hdc,ptSize.x,ptSize.y);
//
EachDCmustselectabitmapobjecttostorepixeldata.
bmBackOld
=
(HBITMAP)::SelectObject(hdcBack,bmAndBack);
bmObjectOld
=
(HBITMAP)::SelectObject(hdcObject,bmAndObject);
bmMemOld
=
(HBITMAP)::SelectObject(hdcMem,bmAndMem);
bmSaveOld
=
(HBITMAP)::SelectObject(hdcSave,bmSave);
//
Setpropermappingmode.
SetMapMode(hdcTemp,GetMapMode(hdc));
//
Savethebitmapsenthere,becauseitwillbeoverwritten.
BitBlt(hdcSave,
0
,
0
,ptSize.x,ptSize.y,hdcTemp,
0
,
0
,SRCCOPY);
//
SetthebackgroundcolorofthesourceDCtothecolor.
//
containedinthepartsofthebitmapthatshouldbetransparent
cColor
=
SetBkColor(hdcTemp,cTransparentColor);
//
CreatetheobjectmaskforthebitmapbyperformingaBitBlt
//
fromthesourcebitmaptoamonochromebitmap.
BitBlt(hdcObject,
0
,
0
,ptSize.x,ptSize.y,hdcTemp,
0
,
0
,
SRCCOPY);
//
SetthebackgroundcolorofthesourceDCbacktotheoriginal
//
color.
SetBkColor(hdcTemp,cColor);
//
Createtheinverseoftheobjectmask.
BitBlt(hdcBack,
0
,
0
,ptSize.x,ptSize.y,hdcObject,
0
,
0
,
NOTSRCCOPY);
//
CopythebackgroundofthemainDCtothedestination.
BitBlt(hdcMem,
0
,
0
,ptSize.x,ptSize.y,hdc,xStart,yStart,
SRCCOPY);
//
Maskouttheplaceswherethebitmapwillbeplaced.
BitBlt(hdcMem,
0
,
0
,ptSize.x,ptSize.y,hdcObject,
0
,
0
,SRCAND);
//
Maskoutthetransparentcoloredpixelsonthebitmap.
BitBlt(hdcTemp,
0
,
0
,ptSize.x,ptSize.y,hdcBack,
0
,
0
,SRCAND);
//
XORthebitmapwiththebackgroundonthedestinationDC.
BitBlt(hdcMem,
0
,
0
,ptSize.x,ptSize.y,hdcTemp,
0
,
0
,SRCPAINT);
//
Copythedestinationtothescreen.
BitBlt(hdc,xStart,yStart,ptSize.x,ptSize.y,hdcMem,
0
,
0
,
SRCCOPY);
//
Placetheoriginalbitmapbackintothebitmapsenthere.
BitBlt(hdcTemp,
0
,
0
,ptSize.x,ptSize.y,hdcSave,
0
,
0
,SRCCOPY);
//
Deletethememorybitmaps.
DeleteObject(SelectObject(hdcBack,bmBackOld));
DeleteObject(SelectObject(hdcObject,bmObjectOld));
DeleteObject(SelectObject(hdcMem,bmMemOld));
DeleteObject(SelectObject(hdcSave,bmSaveOld));
//
DeletethememoryDCs.
DeleteDC(hdcMem);
DeleteDC(hdcBack);
DeleteDC(hdcObject);
DeleteDC(hdcSave);
DeleteDC(hdcTemp);
}
本文地址:
http://www.45fan.com/dnjc/69826.html
Tags:
一个
背景
透明
编辑:路饭网
上一篇:
使用.NET读取QQWry.Dat纯真版ip数据库格式数据源的方法
下一篇:
分类导航代码大全
相关文章列表
怎么样使用AI绘制立体logo效果标志?
怎么样使用AI绘制字母D穿插标志?
怎么样使用AI绘制漂亮蓝瘦蘑菇?
将FAT32格式磁盘无损转换成NTFSU盘的方法
下载音乐的步骤
在win7中修改欢迎登录界面背景的方法
如何在Win10中使用一个命令搞定按F8进Win
如何处理U盘装XP系统后提示"由于一个软
如何在PowerPoint2016中输入文字并添加一
怎么样在PS中将黑夜雨中行的女孩制作出璀
推广内容
推荐阅读
热门推荐
推荐文章
·
如何为Excel2010表格中的图表添加说明文
·
Win7系统看电影时,如果有QQ消息,电影声
·
WPS文字文档中,如何给指定的文字添加边
·
盘点制作PPT时常用的一些快捷键大全
·
分享一组Win8系统不太为人所知的小技巧
·
系统遇到特殊故障时,如何进入Win10系统
·
电脑系统损坏要如何修复?修复win10系统
·
想找回关闭的网页该怎么办?怎样查看360
·
实现电脑每天定时关机,借助Win7任务计划
·
什么是Telnet协议?Win7如何开启Telnet服
·
电脑时间出现差错时如何进行北京时间校准
·
电脑运行速度慢,C盘空间越来越小,如何
关于我们
|
联系我们
|
友情链接
|
网站地图
|
Sitemap
|
App
|
返回顶部