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))
LZ's Blog
旅途愉快,我的朋友
wxpython无边框窗口支持8向伸缩
lz·2025-02-11·4 次阅读
Comments | NOTHING