如何在不透明区域内绘制透明部分
你想知道怎么在wxpython窗口的背景上切一个透明的洞吗?
我是不是需要手动画出不透明的部分,留出一个洞,而不能直接用背景颜色呢?
1 个回答
2
我根据你之前的问题调整了我的回答,不过我不确定这是否完全符合你的需求。如果有问题请告诉我。
简单来说,我们通过不擦除背景来保持之前屏幕上的内容不变。然后我们处理绘图事件,只在屏幕的某些部分进行绘制。
如果你需要绘制的部分是半透明的,而不是不透明的,你可以切换回使用 SetTransparent
。
import wx
class Frame(wx.Frame):
def __init__(self):
super(Frame, self).__init__(None)
self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground)
self.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown)
self.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown)
self.Bind(wx.EVT_PAINT, self.OnPaint)
def OnEraseBackground(self, event):
pass # do nothing
def OnLeftDown(self, event):
print event.GetPosition()
def OnKeyDown(self, event):
if event.GetKeyCode() == wx.WXK_ESCAPE:
self.Close()
else:
event.Skip()
def OnPaint(self, event):
w, h = self.GetSize()
dc = wx.PaintDC(self)
region = wx.RegionFromPoints([(0, 0), (w, 0), (w, h), (0, h)])
box = wx.RegionFromPoints([(100, 100), (500, 100), (500, 500), (100, 500)])
region.SubtractRegion(box)
dc.SetClippingRegionAsRegion(region)
dc.DrawRectangle(0, 0, w, h)
if __name__ == '__main__':
app = wx.PySimpleApp()
frame = Frame()
frame.ShowFullScreen(True)
app.MainLoop()