Я не эксперт, и я пытаюсь показать на экране прямоугольник, который следует за движениями мыши из исходной точки, точно так же, как когда вы выбираете что-то в Word или Paint. Я пришел с этим кодом:
import win32gui
m=win32gui.GetCursorPos()
while True:
n=win32gui.GetCursorPos()
for i in range(n[0]-m[0]):
win32gui.SetPixel(dc, m[0]+i, m[1], 0)
win32gui.SetPixel(dc, m[0]+i, n[1], 0)
for i in range(n[1]-m[1]):
win32gui.SetPixel(dc, m[0], m[1]+i, 0)
win32gui.SetPixel(dc, n[0], m[1]+i, 0)
Как видите, код нарисует прямоугольник, а предыдущие останутся до обновления экрана.
Единственное решение, с которым я пришел, - это взять значения пикселей, которые я буду рисовать, прежде чем установить их в черный цвет, и перерисовывать их каждый раз, но это делает мой код довольно медленным. Есть ли простой способ обновить экран быстрее, чтобы предотвратить это?
...
Отредактировано с решением.
Как было предложено @Torxed, использование win32gui.InvalidateRect решило проблему обновления. Однако я обнаружил, что установка только цвета точек, которые мне нужно установить, дешевле, чем просить прямоугольник. Первое решение рендерится довольно чисто, а второе остается немного глючным. В конце концов, код, который работал лучше всего для меня:
import win32gui
m=win32gui.GetCursorPos()
dc = win32gui.GetDC(0)
while True:
n=win32gui.GetCursorPos()
win32gui.InvalidateRect(hwnd, (m[0], m[1], GetSystemMetrics(0), GetSystemMetrics(1)), True)
back=[]
for i in range((n[0]-m[0])//4):
win32gui.SetPixel(dc, m[0]+4*i, m[1], 0)
win32gui.SetPixel(dc, m[0]+4*i, n[1], 0)
for i in range((n[1]-m[1])//4):
win32gui.SetPixel(dc, m[0], m[1]+4*i, 0)
win32gui.SetPixel(dc, n[0], m[1]+4*i, 0)
Деление и умножение на четыре необходимы, чтобы избежать мерцания, но визуально они аналогичны использованию DrawFocusRect.
Это сработает только в том случае, если вы останетесь ниже и правее своего исходного положения, но это как раз то, что мне было нужно. Не сложно улучшить его, чтобы принять любую второстепенную позицию.