class NoBorderFrame(wx.Frame):
    def __init__(self, *args, **kw):
        # 创建无边框窗口
        super(NoBorderFrame, self).__init__(*args, **kw, style=wx.NO_BORDER)

        # 设置窗口初始大小和背景颜色
        self.SetSize((400, 300))

        # 初始化变量
        self.dragging = False
        self.resizing = False
        self.edge = None

        # 绑定事件
        self.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown)
        self.Bind(wx.EVT_LEFT_UP, self.OnLeftUp)
        self.Bind(wx.EVT_MOTION, self.OnMotion)

    def OnLeftDown(self, event):
        # 鼠标左键按下时,开始拖动或缩放
        if self.edge is None:
            self.dragging = True
            self.old_pos = event.GetPosition()
            self.CaptureMouse()
        else:
            self.resizing = True
            self.old_screen_pos = wx.GetMousePosition()  # 记录鼠标的屏幕绝对坐标
            self.old_size = self.GetSize()
            self.CaptureMouse()
        event.Skip()

    def OnLeftUp(self, event):
        # 鼠标左键释放时,停止拖动或缩放
        if self.dragging:
            self.dragging = False
            self.ReleaseMouse()
        elif self.resizing:
            self.old_screen_pos = self.GetPosition()
            self.resizing = False
            self.ReleaseMouse()
        event.Skip()

    def OnMotion(self, event):
        # 鼠标移动时,处理拖动或缩放
        if self.dragging:
            # 拖动窗口
            new_pos = event.GetPosition()  # 相对窗口的坐标
            delta = new_pos - self.old_pos
            self.Move(self.GetPosition() + delta)
        elif self.resizing:
            # 获取鼠标的屏幕绝对坐标
            new_screen_pos = wx.GetMousePosition()
            delta_screen = new_screen_pos - self.old_screen_pos  # 屏幕上的位移

            # 获取窗口原始位置和尺寸
            og_left, og_top = self.GetPosition()
            og_width, og_height = self.old_size

            if self.edge == 'left':
                # 调整窗口的左边和宽度
                new_left = self.old_screen_pos.x + delta_screen.x
                new_width = max(100, og_width - delta_screen.x)
                self.SetPosition((new_left, og_top))  # 更新窗口位置
                self.SetSize((new_width, og_height))  # 更新窗口尺寸
            elif self.edge == 'right':
                # 调整窗口的宽度,位置不变
                new_width = max(100, og_width + delta_screen.x)
                self.SetSize((new_width, og_height))
            elif self.edge == 'top':
                # 调整窗口的顶边和高度
                new_top = self.old_screen_pos.y + delta_screen.y
                new_height = max(80, og_height - delta_screen.y)
                self.SetPosition((og_left, new_top))  # 更新窗口位置
                self.SetSize((og_width, new_height))  # 更新窗口尺寸
            elif self.edge == 'bottom':
                # 调整窗口的高度,位置不变
                new_height = max(80, og_height + delta_screen.y)
                self.SetSize((og_width, new_height))
            elif self.edge == 'top_left':
                # 调整窗口的左上角和尺寸
                new_left = self.old_screen_pos.x + delta_screen.x
                new_top = self.old_screen_pos.y + delta_screen.y
                new_width = max(100, og_width - delta_screen.x)
                new_height = max(80, og_height - delta_screen.y)
                self.SetPosition((new_left, new_top))  # 更新窗口位置
                self.SetSize((new_width, new_height))  # 更新窗口尺寸
            elif self.edge == 'top_right':
                # 调整窗口的右上角和尺寸
                new_top = self.old_screen_pos.y + delta_screen.y
                new_width = max(100, og_width + delta_screen.x)
                new_height = max(80, og_height - delta_screen.y)
                self.SetPosition((og_left, new_top))  # 更新窗口位置
                self.SetSize((new_width, new_height))  # 更新窗口尺寸
            elif self.edge == 'bottom_left':
                # 调整窗口的左下角和尺寸
                new_left = self.old_screen_pos.x + delta_screen.x
                new_width = max(100, og_width - delta_screen.x)
                new_height = max(80, og_height + delta_screen.y)
                self.SetPosition((new_left, og_top))  # 更新窗口位置
                self.SetSize((new_width, new_height))  # 更新窗口尺寸
            elif self.edge == 'bottom_right':
                # 调整窗口的右下角和尺寸
                new_width = max(100, og_width + delta_screen.x)
                new_height = max(80, og_height + delta_screen.y)
                self.SetSize((new_width, new_height))

            self.Refresh()  # 刷新窗口以绘制边
        else:
            # 更新光标形状
            self.UpdateCursor(event.GetPosition())
        event.Skip()

    def UpdateCursor(self, pos):
        # 根据鼠标位置更新光标形状
        rect = self.GetClientRect()
        border = 5

        if pos.x < border and pos.y < border:
            self.edge = 'top_left'
            self.SetCursor(wx.Cursor(wx.CURSOR_SIZENWSE))
        elif pos.x >= rect.width - border and pos.y < border:
            self.edge = 'top_right'
            self.SetCursor(wx.Cursor(wx.CURSOR_SIZENESW))
        elif pos.x < border and pos.y >= rect.height - border:
            self.edge = 'bottom_left'
            self.SetCursor(wx.Cursor(wx.CURSOR_SIZENESW))
        elif pos.x >= rect.width - border and pos.y >= rect.height - border:
            self.edge = 'bottom_right'
            self.SetCursor(wx.Cursor(wx.CURSOR_SIZENWSE))
        elif pos.x < border:
            self.edge = 'left'
            self.SetCursor(wx.Cursor(wx.CURSOR_SIZEWE))
        elif pos.x >= rect.width - border:
            self.edge = 'right'
            self.SetCursor(wx.Cursor(wx.CURSOR_SIZEWE))
        elif pos.y < border:
            self.edge = 'top'
            self.SetCursor(wx.Cursor(wx.CURSOR_SIZENS))
        elif pos.y >= rect.height - border:
            self.edge = 'bottom'
            self.SetCursor(wx.Cursor(wx.CURSOR_SIZENS))
        else:
            self.edge = None
            self.SetCursor(wx.Cursor(wx.CURSOR_ARROW))