【发布时间】:2020-06-12 09:11:17
【问题描述】:
我不是专家,我想在屏幕上显示一个矩形,它会跟随鼠标从一个固定的起点移动,就像您在文字或绘画中选择某些东西一样。我附带了这段代码:
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)
4 的除法和乘法是避免闪烁所必需的,但在视觉上与使用 DrawFocusRect 相同。
这只有在您从初始位置保持在下方和右侧时才有效,但这正是我所需要的。接受任何次要职位不难改进。
【问题讨论】:
-
另外,一个友好的提醒,如果您的问题解决了您的问题,您应该将它们标记为已解决。它使网站不会被“未解决”的问题弄得一团糟,并且将来在这里结束的用户也可能会更快地找到答案:)
标签: python drawing pywin32 updating win32gui