Layered Window(分层窗体,透明窗体)

Layered Window(分层窗体,透明窗体)  

2011-10-04 07:53:22|  分类: API&VC |字号 订阅

// 为窗体添加 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+支持
 
参考资料:
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值