分层窗体,透明窗体(转)

原文:点击打开链接


效果1.窗体整体透明,支持子控件,支持OnPaint()
 
// 为窗体添加 WS_EX_LAYERED 属性 , 该属性使窗体支持透明
ModifyStyleEx (0,  WS_EX_LAYERED);
 
效果1.1 窗体整体透明,子控件也透明
 
// 设置 Alpha 值为 150
BYTE  byteAlpha=150;
SetLayeredWindowAttributes (0, byteAlpha , LWA_ALPHA );
 
效果1.2 窗体整体透明,子控件不透明
 
// OnCtlColor 中将窗体背景刷为某种单色,比如 RGB(255,0,0)
//在OnPaint中当然也可以
 
if ( nCtlColor = IDD )
return  m_brush; //m_brush.CreateSolidBrush(RGB(255,0,255));
 
// 设置窗体中所有单色区域都透明
SetLayeredWindowAttributes ( RGB (255,0,255),0, LWA_COLORKEY );
 
效果2.窗体部分透明,但该窗体不支持子控件,不支持OnPaint()
USES_CONVERSION ;
Image *  _pImage=
Image :: FromFile ( A2W ( "F:\\Desktop\\TestTransparentWnd\\test.png" ));
// 透明度由 PNG 图片的 Alpha 通道决定
 
// 如果加上 WS_EX_TRANSPARENT 属性,则鼠标会穿透此窗体
ModifyStyleEx (0,  WS_EX_LAYERED/*|WS_EX_TRANSPARENT*/);
 
CDC  *pDCDst=this->GetDC();
CDC  dcSrc;
dcSrc . CreateCompatibleDC ( pDCDst );
CBitmap  bmp;
bmp . CreateCompatibleBitmap ( pDCDst ,300,300);
dcSrc . SelectObject (& bmp );
 
// GDI+ 显示 PNG 图片
Graphics  _Graphics(dcSrc.m_hDC);
_Graphics . DrawImage ( _pImage ,0,0,300,300);
 
BLENDFUNCTION  _Blend;  
_Blend . BlendOp =0;
_Blend . BlendFlags =0;
_Blend . AlphaFormat =1;
_Blend . SourceConstantAlpha =255;
 
// 此时,鼠标会穿透窗体中 Alpha 值为 0 的区域
UpdateLayeredWindow ( pDCDst ,& CPoint (0,0),& CSize (300,300),
                    &dcSrc,&CPoint(0,0),
                    0,&_Blend,ULW_ALPHA);
 
bmp . DeleteObject ();
dcSrc . DeleteDC ();
_Graphics . ReleaseHDC ( dcSrc . m_hDC );
this -> ReleaseDC ( pDCDst );
 
3.既要窗体部分透明(鼠标能穿透窗体中Alpha值为0的区域),还要能显示控件
 
解决方案:
创建两个窗体,窗体 A 使用效果 2 的方法,作为背景窗体;窗体 B 使用效果 1.2 的方法,作为前景窗体,控件都放在窗体 B 上。在窗体 A OnMove 中,同步移动窗体 B

备注:
1. 以上代码只需在窗体初始化的时候 ( OnInitDialog) 执行一次即可
2.WS_EX_LAYERED 要求宏 _WIN32_WINNT  >= 0x0500
3. 以上程序需要 GDI+ 支持


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值