import threading
from pyextoverlay import *
# Локальные импорты
from winapi import *
# Создание QT-application'a, нужен для обработки событий окна (оверлея)
application = application_init()
overlay = Overlay(update_inverval_ms=5)
overlay.set_render_hint(RenderHints.antialiasing) # Все рисуемые примитивы будут сглаживаться
overlay.showFullScreen() # Отображаем оверлей
# Создаем примитивы для отрисовки оверлея
# line_size 0 - закрашенная фигура
# line_type - тип обводки, нагляднее тут: https://zetcode.com/gui/pyqt5/painting
# Прямоугольники
simple_rectange = {"type": "rect", "x": 30, "y": 30, "width": 50, "height": 50, "line_size": 0, "line_type": PenType.solid, "color": (255, 0, 0)}
transparent_rectangle = {"type": "rect", "x": 80, "y": 80, "width": 50, "height": 50, "line_size": 0, "line_type": PenType.solid, "color": (0, 0, 255, 100)} # 150 - прозрачность
not_filed_rectangle = {"type": "rect", "x": 80, "y": 30, "width": 50, "height": 50, "line_size": 3, "line_type": PenType.solid, "color": (255, 255, 0)}
dot_rectangle = {"type": "rect", "x": 30, "y": 80, "width": 50, "height": 50, "line_size": 2, "line_type": PenType.dot, "color": (0, 255, 0)}
# Круги
simple_ellipse = {"type": "ellipse", "x": 180, "y": 180, "width": 25, "height": 25, "line_size": 0, "line_type": PenType.solid, "color": (0, 255, 255)}
not_filed_ellipse = {"type": "ellipse", "x": 175, "y": 175, "width": 35, "height": 35, "line_size": 2, "line_type": PenType.dashdot, "color": (255, 255, 255)}
# Линии
line = {"type": "line", "x1": 150, "y1": 250, "x2": 250, "y2": 250, "line_size": 3, "line_type": PenType.solid, "color": (255, 69, 0)}
# Полигоны
polygon = {"type": "polygon", "points": [{"x": 2, "y": 2}, {"x": 80, "y": 2}, {"x": 2, "y": 80}], "line_size": 0, "line_type": PenType.solid, "color": (0, 250, 154, 100)}
# Текст
overlay_font = OverlayFont("Segoe UI", 32)
# ВАЖНО: текст рисуется на невидимом прямоугольнике, при недостаточном width и height он выйдет за границы
text = {"type": "text", "x": 300, "y": 150, "width": 400, "height": 64, "text": "Overlay text", "font": overlay_font, "align": Alignment.left, "color": (255, 255, 255)}
# Добавляем наши фигуры с лист отрисовки
overlay.draw_list = [simple_rectange, transparent_rectangle, not_filed_rectangle, dot_rectangle, simple_ellipse, not_filed_ellipse, line, polygon, text]
# Если нужно, чтобы оверлей был привязан к положению определенного окна: делаем это:
def set_overlay_geometry() -> None:
while True:
overlay.geometry_list = [*get_window_geometry("новый 1 - Notepad++")]
kernel32.Sleep(5)
# Запуск потока изменения положения
threading.Thread(target=set_overlay_geometry).start()
# Запуск application'а (блокирующая ф-ия)
application_start(application)