Как нарисовать прозрачный участок в непрозрачной области - PullRequest
3 голосов
/ 13 июля 2011

Как бы вы могли вырезать прозрачную дыру на фоне окна wxpython?

Нужно ли рисовать непрозрачную область вручную, оставляя дыру, вместо того, чтобы использовать цвет фона?

1 Ответ

2 голосов
/ 13 июля 2011

Адаптирую мой ответ к вашему предыдущему вопросу, хотя я не уверен, что это на 100% соответствует вашим потребностям. Дайте мне знать?

По сути, мы оставляем предыдущее содержимое экрана без изменений, не стирая фон. Затем мы обрабатываем события рисования и рисуем только определенные части экрана.

Вы можете вернуться к использованию 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()
...