我试图通过使用桌面 Canvas 并直接在其上绘画来绘制整个屏幕。问题是我无法清除桌面 Canvas 。我尝试将 canvas.pen.style 设置为 psNotXOR 并在旧图像上绘制,但不幸的是,这不够可靠,并且在某些情况下仍然存在一些剩余图像。
我的需要是当鼠标悬停在窗口/控件上时在其周围绘制一个选择矩形。
最佳答案
清除后,您不会在哪个操作系统上写下您对文物有问题。
至少在激活桌面合成的情况下,直接绘制到桌面并进行异或绘画是一个非常糟糕的主意(请参阅 this blog post 中的“绘制到屏幕并从屏幕读取 - Baaaad!”)。除了负面的性能影响之外,您无法确定同时发生的其他绘画以及哪些效果和动画会改变显示的内容,因此简单的异或可能不足以完全删除所有内容。
实现它的一种可能方法是桌面大小的透明覆盖窗口,并在其上绘制橡皮筋选择器。如果大小发生变化,则使整个窗口失效就足够了,无需删除旧的选择线。如果移除覆盖层,该线也会消失。桌面构图将确保不发生闪烁。但是,在选择区域时切换应用程序会出现问题,您需要捕获这一点并立即取消选择。
编辑:
我刚刚使用 Delphi 2009 和以下测试应用程序对其进行了测试:
FormStyle
设置为fsStayOnTop
且AlphaBlend
设置为True
的表单- 使用重写的
CreateParams()
方法来添加WS_EX_TRANSPARENT
扩展样式标志
我可以将所有鼠标点击传递到底层窗口,同时能够绘制到它们之上的窗口中。这应该可以帮助您入门。
关于delphi - 用Delphi绘制和清除桌面 Canvas ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1662147/