`
isiqi
  • 浏览: 16004309 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

三个实现透明效果的方法(我还没有试过,不保证质量)

F# 
阅读更多
方法一:

void CChessBoard::FillMarkedChess(CDC *pDC,CRect rect, COLORREF color)
{
//color为半透明的底色
COLORREF bkcolor;
int R1,G1,B1,R2,G2,B2;
R1=color&255;
G1=(color>>8)&255;
B1=(color>>16)&255;
//标记块的左边与右边各多显示一点
for(int x=rect.left-1;x<=rect.right;x++)
{
for(int y=rect.top-1;y<=rect.bottom;y++)
{
//nRatio为透光率
bkcolor=pDC->GetPixel(x,y);
R2=bkcolor&255;
G2=(bkcolor>>8)&255;
B2=(bkcolor>>16)&255;
R2=R1+(R2-R1)*m_nRatio/100;
G2=G1+(G2-G1)*m_nRatio/100;
B2=B1+(B2-B1)*m_nRatio/100;
pDC->SetPixel(x,y,RGB(R2,G2,B2));
}
}
}

方法二:

/*
这是一个用来填充透明位图的函数
CDC *pDC 需要画位图的CDC指针
HBITMAP hBitmap 位图's m_hObject
CRect &rect 指定位图在pDC中的位置
COLORREF rgbMask 位图的透明色
*/
void FillTransparentHBitmap(CDC *pDC, HBITMAP hBitmap,CRect &rect, COLORREF rgbMask)
{
CDC ImageDC,MaskDC;
CBitmap Image,*pOldImage=NULL;
CBrush *oldBrush=NULL;
CBitmap maskBitmap,*pOldMaskDCBitmap ;

//Image.LoadBitmap(IDImage);
Image.Attach(hBitmap);

ImageDC.CreateCompatibleDC(pDC);
//CBrush br(&Image);
pOldImage=ImageDC.SelectObject(&Image);
//ImageDC.FillRect(rect,&br);
BITMAP bm;
Image.GetBitmap(&bm);

MaskDC.CreateCompatibleDC(pDC);
maskBitmap.CreateBitmap( rect.Width(), rect.Height(), 1, 1, NULL );
pOldMaskDCBitmap = MaskDC.SelectObject( &maskBitmap );

ImageDC.SetBkColor(rgbMask);
int ix=0,iy=0;
for(iy=0;iy<rect.Height();iy+=bm.bmHeight)
{
for(ix=0;ix<rect.Width();ix+=bm.bmWidth)
{
MaskDC.BitBlt( ix, iy, bm.bmWidth, bm.bmHeight, &ImageDC, 0, 0, SRCCOPY );
}
}

ImageDC.SetBkColor(RGB(0,0,0));
ImageDC.SetTextColor(RGB(255,255,255));
ImageDC.BitBlt(0, 0, rect.Width(), rect.Height(), &MaskDC, 0, 0, SRCAND);

pDC->BitBlt(rect.left,rect.top,rect.Width(), rect.Height(), &MaskDC, 0, 0, SRCAND);
for(iy=rect.top;iy<rect.Height();iy+=bm.bmHeight)
{
for(ix=rect.left;ix<rect.Width();ix+=bm.bmWidth)
{
//MaskDC.BitBlt( ix, iy, bm.bmWidth, bm.bmHeight, &ImageDC, 0, 0, SRCCOPY );
pDC->BitBlt(ix,iy,bm.bmWidth, bm.bmHeight, &ImageDC, 0, 0,SRCPAINT);
}
}
//pDC->BitBlt(rect.left,rect.top,rect.Width(), rect.Height(), &ImageDC, 0, 0,SRCPAINT);

MaskDC.SelectObject(pOldMaskDCBitmap);
ImageDC.SelectObject(pOldImage);
//ImageDC.SelectObject(oldBrush);

Image.Detach();
}


方法三:

BOOL BitBlt_HT(
HDC hdc,//目標DC
RECT rect,//目標區域
COLORREF maskColor,//半透明前景
UINT maskRatio//半透明前景比重 ( 0 - 100 )
)
{
int x,y;
COLORREF bColor;
BYTE b_R,b_G,b_B,f_R,f_G,f_B;

maskRatio = maskRatio % 100;
f_R = GetRvalues(maskColor);f_G = GetGvalues(maskColor);f_B = GetBvalues(maskColor);

HDC hMemDC = ::CreateCompatibleDC(hdc);
if (hMemDC == NULL) return 0;
HBITMAP hOldBmp,hNewBmp = ::CreateCompatibleBitmap(hdc,rect.right - rect.left ,rect.bottom - rect.top );
if (hNewBmp == NULL)
{
::DeleteDC (hMemDC);
return 0;
}
hOldBmp = (HBITMAP)::SelectObject(hMemDC,hNewBmp);
::BitBlt (hMemDC,0,0 ,rect.right-rect.left ,rect.bottom - rect.top ,hdc,rect.left ,rect.top,SRCCOPY);

for (y = 0 ; y <rect.bottom - rect.top ; y ++)
{
for (x = 0 ; x <= rect.right - rect.top; x++)
{
bColor = GetPixel(hMemDC,x,y);
b_R = GetRvalues(bColor);b_G = GetGvalues(bColor);b_B = GetBvalues(bColor);
bColor = RGB(f_R*maskRatio/100+b_R*(100-maskRatio)/100,f_G*maskRatio/100+b_G*(100-maskRatio)/100,f_B*maskRatio/100+b_B*(100-maskRatio)/100);
SetPixel(hMemDC,x,y,bColor);
}
}
::BitBlt (hdc,rect.left ,rect.top ,rect.right-rect.left ,rect.bottom - rect.top ,hMemDC,0,0,SRCCOPY);
::SelectObject(hMemDC,hOldBmp);
::DeleteObject (hNewBmp);
::DeleteDC (hMemDC);
return 1;
}
分享到:
评论

相关推荐

    java源码包---java 源码 大量 实例

     QQ客户端登录界面,中部有三个JPanel,有一个叫选项卡窗口管理。还可以更新好友列表,响应用户双击的事件,并得到好友的编号,把聊天界面加入到管理类,设置密码保护等。 Java编写的网页版魔方游戏 内容索引:JAVA...

    java源码包2

     QQ客户端登录界面,中部有三个JPanel,有一个叫选项卡窗口管理。还可以更新好友列表,响应用户双击的事件,并得到好友的编号,把聊天界面加入到管理类,设置密码保护等。 Java编写的网页版魔方游戏 内容索引:JAVA...

    java源码包3

     QQ客户端登录界面,中部有三个JPanel,有一个叫选项卡窗口管理。还可以更新好友列表,响应用户双击的事件,并得到好友的编号,把聊天界面加入到管理类,设置密码保护等。 Java编写的网页版魔方游戏 内容索引:JAVA...

    java源码包4

     QQ客户端登录界面,中部有三个JPanel,有一个叫选项卡窗口管理。还可以更新好友列表,响应用户双击的事件,并得到好友的编号,把聊天界面加入到管理类,设置密码保护等。 Java编写的网页版魔方游戏 内容索引:JAVA...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    QQ客户端登录界面,中部有三个JPanel,有一个叫选项卡窗口管理。还可以更新好友列表,响应用户双击的事件,并得到好友的编号,把聊天界面加入到管理类,设置密码保护等。 Java编写的网页版魔方游戏 内容索引:JAVA...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    QQ客户端登录界面,中部有三个JPanel,有一个叫选项卡窗口管理。还可以更新好友列表,响应用户双击的事件,并得到好友的编号,把聊天界面加入到管理类,设置密码保护等。 Java编写的网页版魔方游戏 内容索引:JAVA...

    JAVA上百实例源码以及开源项目

     QQ客户端登录界面,中部有三个JPanel,有一个叫选项卡窗口管理。还可以更新好友列表,响应用户双击的事件,并得到好友的编号,把聊天界面加入到管理类,设置密码保护等。 Java编写的网页版魔方游戏 内容索引:JAVA...

    JAVA上百实例源码以及开源项目源代码

     QQ客户端登录界面,中部有三个JPanel,有一个叫选项卡窗口管理。还可以更新好友列表,响应用户双击的事件,并得到好友的编号,把聊天界面加入到管理类,设置密码保护等。 Java编写的网页版魔方游戏 内容索引:JAVA...

    皮肤控件研究文档,破解后的库文件,皮肤设计工具使用教程

    没有下载到试验版的SkinBuilder,我联系的skn++的客服人员,只提供了一个视频教程和一个文档Skin++BuilderHelp.chm 视频教程链接地址:http://www.uipower.com/bbs/forum-56-1.html 皮肤设计工具(SkinBuilder)使用...

    工程硕士学位论文 基于Android+HTML5的移动Web项目高效开发探究

    尽我所知,除了文中特别加以标注和致谢的地方外,论文中不包含其他人已经发表或撰写过的研究成果,也不包含为获得东南大学或其它教育机构的学位或证书而使用过的材料。与我一同工作的同志对本研究所做的任何贡献均已...

    电子采购系统设计.docx

    该种模式会在适当的范围内,最大限度地激发供应商的竞争热情,从而引发供应商的群体降价行为,在保证质量、交期的前提下,使采购方获得尽可能低的采购成本。 电子采购系统设计全文共4页,当前为第1页。采购商会先...

    iSee视频监控 v5.2

    本系统工作主机供电电压为220V_10%,如果在电压不稳或者干扰大 的场合,请您选用优质稳压电源(即UPS),保证系统正常良好的工作状态。 本系统在安装、拆卸视频采集卡时,必须将主机处于完全断电状态, 否则主板上...

    基于AT89S52 单片的频率计

    ②不需并行编程器仅需用P15,P16 和P17,这三个IO 仅仅是下载程序的时 候使用,并不影响程序的使用。 ③结合上位机软件免费就可实现PC 对其编程硬件电路连接简单如图3.3 所 示。 104 C3 1K R1 S1 VCC D1 1N4007 ...

    在线考试系统文献综述

    系统开发经历了系统分析、系统设计和系统实施三个阶段。从设计方案的提出,经过详细的调查,分析了方案的可行性和必要性,通过详细的系统设计,力图提高系统的集成性和快捷性;并在系统实施阶段收集了大量的实验数据...

    软件设计方案(整理).doc

    9 第三章、编程规范总则 10 1、排版 10 2、注释 11 3、标识符命名 12 4、可读性 13 5、变量与结构 13 6、函数与过程 14 7、可测性 15 8、程序效率 16 9、质量保证 17 10、代码编辑、编译与审查 18 11、代码测试与...

Global site tag (gtag.js) - Google Analytics