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

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

// 为窗体添加 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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
libvlc 是一个流行的开源媒播放库,它提供了许多功能强大的接口来处理视频和音频播放。要在视频上叠加透明,我们可以利用 libvlc 提供的一些功能和方法。 首先,我们需要创建一个,并设置它的背景为透明。在的构造函数中,我们可以使用 SetStyle 方法将的样式设置为“Layered”,然后使用 SetLayeredWindowAttributes 方法将的背景设置为透明。 接下来,我们需要使用 libvlc 创建一个播放器实例。可以使用 libvlc_new 方法和 libvlc_media_player_new 方法来创建播放器实例。然后,使用 libvlc_media_player_set_hwnd 方法将播放器与关联,以便将视频渲染到上。 在播放视频之前,我们可以使用 libvlc_video_set_callbacks 和 libvlc_video_set_format 方法来指定渲染视频的回调函数和格式。在回调函数中,我们可以将视频渲染到的指定位置,并在该位置上叠加透明。 最后,使用 libvlc_media_player_play 方法来播放视频。此时,视频将被渲染到上,并且透明将叠加在视频上。 在播放完成后,可以使用 libvlc_media_player_stop 方法停止播放,并使用 libvlc_media_player_release 方法释放播放器实例。 总结来说,使用 libvlc 可以轻松地在视频上叠加透明。我们通过创建具有透明背景的,并使用 libvlc 将视频渲染到上,在指定位置上叠加透明。这样就能实现在视频上叠加透明的效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值