pythoncustomfluentfluent-designfluentuiguimodernpyqt5pyqt6pyside2pyside6qtqt5qt6softwareuiwidgetswin11winuiwinui3
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
49 lines
2.1 KiB
49 lines
2.1 KiB
import sys |
|
|
|
if sys.platform != "win32" or sys.getwindowsversion().build < 22000: |
|
from qframelesswindow import FramelessWindow |
|
else: |
|
from ctypes.wintypes import MSG |
|
|
|
import win32con |
|
from PyQt5.QtCore import QPoint, QEvent, Qt |
|
from PyQt5.QtGui import QCursor, QMouseEvent |
|
from PyQt5.QtWidgets import QApplication |
|
|
|
from qframelesswindow import AcrylicWindow as Window |
|
from qframelesswindow.titlebar.title_bar_buttons import TitleBarButtonState |
|
|
|
|
|
class FramelessWindow(Window): |
|
""" Frameless window """ |
|
|
|
def __init__(self, parent=None): |
|
super().__init__(parent) |
|
self.windowEffect.setMicaEffect(self.winId()) |
|
|
|
def nativeEvent(self, eventType, message): |
|
""" Handle the Windows message """ |
|
msg = MSG.from_address(message.__int__()) |
|
if not msg.hWnd: |
|
return super().nativeEvent(eventType, message) |
|
|
|
if msg.message == win32con.WM_NCHITTEST and self._isResizeEnabled: |
|
if self._isHoverMaxBtn(): |
|
self.titleBar.maxBtn.setState(TitleBarButtonState.HOVER) |
|
return True, win32con.HTMAXBUTTON |
|
|
|
elif msg.message in [0x2A2, win32con.WM_MOUSELEAVE]: |
|
self.titleBar.maxBtn.setState(TitleBarButtonState.NORMAL) |
|
elif msg.message in [win32con.WM_NCLBUTTONDOWN, win32con.WM_NCLBUTTONDBLCLK] and self._isHoverMaxBtn(): |
|
e = QMouseEvent(QEvent.MouseButtonPress, QPoint(), Qt.LeftButton, Qt.LeftButton, Qt.NoModifier) |
|
QApplication.sendEvent(self.titleBar.maxBtn, e) |
|
return True, 0 |
|
elif msg.message in [win32con.WM_NCLBUTTONUP, win32con.WM_NCRBUTTONUP] and self._isHoverMaxBtn(): |
|
e = QMouseEvent(QEvent.MouseButtonRelease, QPoint(), Qt.LeftButton, Qt.LeftButton, Qt.NoModifier) |
|
QApplication.sendEvent(self.titleBar.maxBtn, e) |
|
|
|
return super().nativeEvent(eventType, message) |
|
|
|
def _isHoverMaxBtn(self): |
|
pos = QCursor.pos() - self.geometry().topLeft() - self.titleBar.pos() |
|
return self.titleBar.childAt(pos) is self.titleBar.maxBtn |