非明确边缘的非规则窗体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),具体详解如下(参数描述拷贝自官方文档):
param | description |
---|---|
BlendOp | Only defined value is AC_SRC_OVER (0) |
BlendFlags | None currently defined, must be 0 |
SourceConstantAlpha | Transparency to be applied to entire source. (255 is opaque) |
AlphaFormat | Only 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
参数说得云里雾里,直接讲应用场景,该函数主要有两个场景:
- 将指定的颜色透明化:此时的参数应该为(hwnd, hdcDst, ptDst, size, hdcSrc, ptSrc,RGB(xxx,
xxx, xxx), (0, 0, 255, AC_SRC_ALPHA), ULW_COLORKEY) - 按原始透明度绘制:此时的参数应该为(hwnd, hdcDst, ptDst, size, hdcSrc, ptSrc, 0, (0,
0, 255, AC_SRC_ALPHA), ULW_ALPHA)
对于之前光晕的例子,即原始图片是边缘透明度渐变图片,属于 场景2
代码
略…
(本地工程除了上述相关代码外,还有很多其他模块代码,没时间整理出干净的演示代码,如有需要可以直接联系我,邮箱微信见文末)
效果演示
带光晕效果的桌面麦克风应用,可扩展实现更复杂的桌面应用
版权声明:本文为博主原创文章,欢迎转载,转载请说明出处,博主联系方式qq:944131033或者微信:lawer979011