我不是一个专家,我试图在屏幕上显示一个矩形,这个矩形从一个固定的起点跟随鼠标移动,就像你在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)
正如你所看到的,代码将画出矩形,但之前的矩形将保持到屏幕更新。
我想到的唯一解决办法是,在将像素值设置为黑色之前,先将它们画出来,然后每次都重画,但这使我的代码很慢。有什么简单的方法可以更快地更新屏幕以防止这种情况吗?
Edited with solution.
正如@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是一样的。
这只有在你保持在初始位置的下方和右侧时才会起作用,但这正是我需要的。要改进它以接受任何次要位置并不困难。