介绍
windows的规则方框GUI应用是最普遍的形式,而有时你可能需要实现一个非规则的窗体,比如类似桌面宠物,瑞星小狮子之类,而恰好你打算用python来实现该应用,那这篇文章可以帮到你。
插曲
想要在桌面上实现一个非规则卡通宠物的形象,最简单直观的形式是用screenDC直接绘图,确实这样能把图片显示上桌面,但问题是:你擦不掉!擦不掉的后果是你没办法受控地切换到下一帧。win32API InvalidateRect+UpdateWindow?只是post了一个消息,属于异步操作,当你调用完UpdateWindow桌面实际上并未立即更新,desktop窗体什么时候刷新是不受控的,总之,这条路走不通,你必须得实现一个非规则窗体。
思路
- 准备UI原材料,带alpha透明度通道图片,可以通过photoshop抠图,我就是这么做的,当然你也可以通过wx.Image.SetAlpha或者PIL库等等手段去自己设置alpha通道 。
- 指定wx.Frame的style为 wx.FRAME_SHAPED,允许非规则窗体。
- 加载图片位图,调用wx.Image.ConvertAlphaToMask根据alpha值映射成掩码,即划定透明区域,可以指定alpha阈值。(只可用于明确边缘的窗体,因为掩码非0即1,如果是带类似光晕效果的非明确边缘,即0-255的alpha透明度度,不可用,后续文字会介绍非明确边缘的非规则窗体)
- wx.Region从位图生成region,再调用SetShape()设置窗体shape,最后dc.DrawBitmap(self.bg,0,0,useMask=True),搞定。
源码
废话不多说,上源码。
#-*- coding:utf-8 -*-
import wx
cartoon_size = (cartoon_width,cartoon_high) = (200,124)
class MyFrame(wx.Frame):
def __init__(self):
[Display_width,Display_high