delphi - 用Delphi绘制和清除桌面 Canvas

标签 delphi graphics canvas desktop

我试图通过使用桌面 Canvas 并直接在其上绘画来绘制整个屏幕。问题是我无法清除桌面 Canvas 。我尝试将 canvas.pen.style 设置为 psNotXOR 并在旧图像上绘制,但不幸的是,这不够可靠,并且在某些情况下仍然存在一些剩余图像。

我的需要是当鼠标悬停在窗口/控件上时在其周围绘制一个选择矩形。

最佳答案

清除后,您不会在哪个操作系统上写下您对文物有问题。

至少在激活桌面合成的情况下,直接绘制到桌面并进行异或绘画是一个非常糟糕的主意(请参阅 this blog post 中的“绘制到屏幕并从屏幕读取 - Baaaad!”)。除了负面的性能影响之外,您无法确定同时发生的其他绘画以及哪些效果和动画会改变显示的内容,因此简单的异或可能不足以完全删除所有内容。

实现它的一种可能方法是桌面大小的透明覆盖窗口,并在其上绘制橡皮筋选择器。如果大小发生变化,则使整个窗口失效就足够了,无需删除旧的选择线。如果移除覆盖层,该线也会消失。桌面构图将确保不发生闪烁。但是,在选择区域时切换应用程序会出现问题,您需要捕获这一点并立即取消选择。

编辑:

我刚刚使用 Delphi 2009 和以下测试应用程序对其进行了测试:

  • FormStyle 设置为 fsStayOnTopAlphaBlend 设置为 True 的表单
  • 使用重写的 CreateParams() 方法来添加 WS_EX_TRANSPARENT 扩展样式标志

我可以将所有鼠标点击传递到底层窗口,同时能够绘制到它们之上的窗口中。这应该可以帮助您入门。

关于delphi - 用Delphi绘制和清除桌面 Canvas ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1662147/

相关文章:

CSS 仅在一个方向上模糊(运动模糊)

javascript - Jquery - 从 url 加载图像并将其绘制在 Canvas 上

algorithm - 在 Delphi 中解决 TSP 的蛮力算法

Delphi - 从 DBGrid 获取所选行的所有列名

cocoa - 是否可以比较2个sqlite文件并更新

Java变换矩阵运算

security - Delphi 中的缓冲区溢出漏洞

c++ - 不完整的多线程 RayTracer 花费的时间是预期的两倍

android - 如何在不剪裁阴影的情况下剪裁 canvas.drawCircle()?

javascript - 如何在 Canvas 中制作选择框以选择它接触的任何对象而不仅仅是它所包含的对象?