mfc透明

1、透明:包括关键色透明和alpha透明,关键色透明就是选择一种颜色作为透明色,一般选取背景色。
alpha透明就是和背景融合,一般范围是0~255,数值越小背景越明显,0表示完全透明,255表示不透明
公式
dstred   =   srcred   *   (alpha   /   255.0)   +   dstred   *   (1.0   -   alpha   /   255.0);
dstred   =   srcred   *   (alpha   /   255.0)   +   dstred   *   (1.0   -   alpha   /   255.0);
dstred   =   srcred   *   (alpha   /   255.0)   +   dstred   *   (1.0   -   alpha   /   255.0);

2、窗口透明
2.1、如果系统是2000以上可以设置窗口的透明属性如下:

//至少需要Windows   2000系统
ModifyStyleEx(0,WS_EX_LAYERED);   //修改Window的风格
//如果不设置属性,窗口就看不到
//SetLayeredWindowAttributes(GetSysColor(COLOR_BTNFACE),0,LWA_COLORKEY);   //透明色是按钮背景颜色   这个就可以实现不规则窗口
SetLayeredWindowAttributes(0,0,LWA_ALPHA);   //半透明
//SetLayeredWindowAttributes(GetSysColor(COLOR_BTNFACE),128,LWA_COLORKEY   |   LWA_ALPHA);   //两个混合

注意要设置_WIN32_WINNT的值   0x500

可以建立一个对话框工程,然后再OnInitDialog里面添加上述代码
2.2、
如果是2000以下的系统,可以设置窗口的Region来达到关键色透明效果
void   MyWnd::SetRegion(COLORREF   clrTrans)
{
m_bmp.LoadBitmap(IDB_BITMAP1);   //读取位图资源
BITMAP   bm;
CSize   sz;
m_bmp.GetBitmap(&bm);
sz.cx   =   bm.bmWidth;
sz.cy   =   bm.bmHeight;
unsigned   char   *pBuffer   =   new   unsigned   char[sz.cx   *   sz.cy   *   (bm.bmBitsPixel   > >   3)];
m_bmp.GetBitmapBits(sz.cx   *   sz.cy   *   (bm.bmBitsPixel   > >   3),pBuffer);
unsigned   char   *pOriBuffer   =   pBuffer;

CRgn   rgn,rgn2;
rgn.CreateRectRgn(0,0,sz.cx,sz.cy);
rgn2.CreateRectRgn(0,0,1,1);

int   off   =   (bm.bmBitsPixel   > >   3);
for(int   y   =   0;   y   <   sz.cy;   y++)
{
for(int   x   =   0;   x   <   sz.cx;   x++)
{
if(((*pBuffer)   ==   255)   &&   ((*(pBuffer   +   1))   ==   0)   &&   ((*(pBuffer   +   2))   ==   255))
{
rgn2.SetRectRgn(x,y,x   +   1,y   +   1);
rgn.CombineRgn(&rgn,&rgn2,RGN_DIFF);
}
pBuffer   +=   off;
}
}

delete   []pOriBuffer;
SetWindowRgn((HRGN)rgn.GetSafeHandle(),TRUE);
}
3、绘图
使用Gdi函数来实现,TransparentBlt,AlphaBlend
3.1、TransparentBlt   关键色透明
//绘制关键色透明位图
void   DrawTransparentBitmap(CDC   *pDC,CRect&   r,CBitmap&   bmp,COLORREF   clrKey)
{
CDC   memdc;
memdc.CreateCompatibleDC(pDC);
CBitmap   *pOldBitmap;
CSize   sz   =   bmp.GetBitmapDimension();
BITMAP   bm;
bmp.GetBitmap(&bm);
sz.SetSize(bm.bmWidth,bm.bmHeight);
pOldBitmap   =   memdc.SelectObject(&bmp);
pDC-> TransparentBlt(r.left,r.top,sz.cx,sz.cy,&memdc,0,0,sz.cx,sz.cy,clrKey);
memdc.SelectObject(pOldBitmap);
}

这样调用
DrawTransparentBitmap(pDC,CRect(10,10,300,200),bmp,RGB(255,0,255));
3.2、AlphaBlend   Alpha透明

//绘制可以透明的矩形
void   DrawAlphaRect(CDC   *pDC,CRect&   r,COLORREF   clr,unsigned   char   alpha)
{
CDC   memdc;
memdc.CreateCompatibleDC(pDC);
CBitmap   bmp,*pOldBitmap;
bmp.CreateCompatibleBitmap(pDC,r.Width(),r.Height());
pOldBitmap   =   memdc.SelectObject(&bmp);
memdc.FillSolidRect(0,0,r.Width(),r.Height(),clr);
BLENDFUNCTION   bf;
bf.BlendOp   =   AC_SRC_OVER;
bf.BlendFlags   =   0;
bf.SourceConstantAlpha   =   alpha;
bf.AlphaFormat   =   0;
pDC-> AlphaBlend(r.left,r.top,r.Width(),r.Height(),&memdc,0,0,r.Width(),r.Height(),bf);
memdc.SelectObject(pOldBitmap);
}

//绘制可以透明的位图
void   DrawAlphaBitmap(CDC   *pDC,CRect&   r,CBitmap&   bmp,unsigned   char   alpha)
{
CDC   memdc;
memdc.CreateCompatibleDC(pDC);
CBitmap   *pOldBitmap;
CSize   sz   =   bmp.GetBitmapDimension();
BITMAP   bm;
bmp.GetBitmap(&bm);
sz.SetSize(bm.bmWidth,bm.bmHeight);
pOldBitmap   =   memdc.SelectObject(&bmp);
BLENDFUNCTION   bf;
bf.BlendOp   =   AC_SRC_OVER;
bf.BlendFlags   =   0;
bf.SourceConstantAlpha   =   alpha;
bf.AlphaFormat   =   0;
pDC-> AlphaBlend(r.left,r.top,r.Width(),r.Height(),&memdc,0,0,sz.cx,sz.cy,bf);
memdc.SelectObject(pOldBitmap);
}

这样调用
COLORREF   clr   =   RGB(141,173,223);
DrawAlphaRect(pDC,CRect(10,50,500,400),clr,192);

DrawAlphaBitmap(pDC,CRect(10,10,300,200),bmp,128);

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
MFC透明窗口及穿透是指在使用Microsoft Foundation Classes(MFC)进行窗口界面设计时,实现窗口的透明效果和穿透效果。 透明窗口是指窗口的背景部分可以显示出后面的内容。MFC提供了一些API和功能来实现窗口的透明效果。可以通过设置窗口的样式和扩展样式来启用窗口的透明效果。可以调用SetLayeredWindowAttributes函数来设置窗口的透明度,通过设置透明度值来控制窗口的显示效果。使用这些功能和方法,可以实现不同程度的透明窗口效果。 穿透是指窗口在透明或半透明状态下,鼠标点击事件不会被该窗口拦截,而是会传递给后面的窗口。MFC提供了一些功能和方法来实现窗口的穿透效果。可以通过设置窗口的样式和扩展样式来启用窗口的穿透效果。通过设置窗口的透明度和穿透属性,可以使鼠标点击事件透过窗口传递给后面的窗口,实现穿透效果。 需要注意的是,实现透明窗口和穿透效果会涉及到系统级的API和函数调用,需要对MFC框架和Windows操作系统有一定的了解和掌握。同时,由于Windows操作系统的版本和系统设置的差异,透明窗口和穿透效果在不同环境下的表现可能会有所不同。 总之,MFC透明窗口及穿透是一种在Windows系统中实现窗口透明和穿透效果的方法,可以通过使用MFC提供的API和函数来控制窗口的透明度和穿透属性,以实现不同程度的透明窗口效果和让鼠标点击事件透过窗口传递给后面的窗口的穿透效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小涵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值