非明确边缘的非规则窗体python wx实现

非明确边缘的非规则窗体python wx实现

介绍

继前文,非明确边缘非规则窗体的实现,所谓非明确边缘,即窗体的边缘不是非0即1,而是包含alpha通道的透明度边缘,最简单的例子就是光晕效果。wx.Image.ConvertAlphaToMask可以指定阈值来确定透明度低于该threshold时为0,但是光晕效果需要保留alpha信息,所以无法用该函数实现(ConvertAlphaToMask貌似还存在bug,边缘切割时好像会多切一个像素点),另外wx关于窗体透明度的支持并不是很完备(当然,也极有可能是我的方法不对),此时就需要借助win32gui来完善wx暂不完备的功能

win32api 库

win32gui ,win32con
pywin32貌似没找到类似wx那么详尽的文档,这里有一个链接,勉强能用:http://timgolden.me.uk/pywin32-docs/win32_modules.html

关键API的解释

1.GetWindowLong :获取窗体属性
2.SetWindowLong : 设置窗体属性,设置wx所不支持的属性(准确说,是不奏效的,wx透明度相关的api在某些机器上并不能真的奏效)
3.UpdateLayeredWindow : 核心的API,将memDC拷贝至窗体,并且指定透明度规则,一旦调用后,窗体的OnPaint函数将失效,窗体不再响应绘图事件,所有绘图行为均有UpdateLayeredWindow 实现。
函数原型:UpdateLayeredWindow(hwnd, hdcDst, ptDst, size, hdcSrc, ptSrc, Key, blend, Flags),前几个参数一看就明白,无需解释,重点说下最后三个参数
Key :Color key, generate using win32api::RGB;用于指定哪些颜色需要透明化
blend :blend=(0,0,255,0) : (int, int, int, int),具体详解如下(参数描述拷贝自官方文档):

paramdescription
BlendOpOnly defined value is AC_SRC_OVER (0)
BlendFlagsNone currently defined, must be 0
SourceConstantAlphaTransparency to be applied to entire source. (255 is opaque)
AlphaFormatOnly defined flag is AC_SRC_ALPHA, used when src bitmap contains per-pixel alpha

Flags:One of the win32con.ULW_* values. Use 0 if hdcSrc is None,类型的flag

参数说得云里雾里,直接讲应用场景,该函数主要有两个场景:

  1. 将指定的颜色透明化:此时的参数应该为(hwnd, hdcDst, ptDst, size, hdcSrc, ptSrc,RGB(xxx,
    xxx, xxx), (0, 0, 255, AC_SRC_ALPHA), ULW_COLORKEY)
  2. 按原始透明度绘制:此时的参数应该为(hwnd, hdcDst, ptDst, size, hdcSrc, ptSrc, 0, (0,
    0, 255, AC_SRC_ALPHA), ULW_ALPHA)
    对于之前光晕的例子,即原始图片是边缘透明度渐变图片,属于 场景2

代码

略…
(本地工程除了上述相关代码外,还有很多其他模块代码,没时间整理出干净的演示代码,如有需要可以直接联系我,邮箱微信见文末)

效果演示

带光晕效果的桌面麦克风应用,可扩展实现更复杂的桌面应用
光晕效果的麦克风图标

版权声明:本文为博主原创文章,欢迎转载,转载请说明出处,博主联系方式qq:944131033或者微信:lawer979011

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值