繁体   English   中英

在固定绘图上绘制移动点

[英]Draw a moving point on a fixed draw

我正在尝试执行以下操作:

  1. 打开一个新表单并绘制几条线和弧(这很好用)。
  2. 当一个事件发生时,会计算一个新坐标 (x1,y1),并在该坐标处绘制一个小圆圈。
  3. 当下一个事件发生时,应该在 (x2,y2) 处绘制一个小圆,第一个圆应该消失,同时保留在步骤 1 中绘制的线和弧。

如何删除第一个圆圈同时保留所有其他圆圈? 谢谢

一旦绘制了一个圆,就无法删除它。 因此,您需要使用背景颜色清除整个画布并重新绘制所有内容。

所以,你需要:

  1. 想出一堆“形状”类来表示每条线、每条方舟和每一个圆。 它们可能都派生自一些通用的基本“Shape”类,该类提供所有形状通用的方法,例如,在画布上绘制形状的方法。

  2. 从这些类中实例化对象以表示应该在屏幕上绘制的形状,并在应用程序的整个生命周期中将这些对象保存在列表中。

  3. 当事件发生时,您对形状进行任何更改(在您的情况下,删除一个圆并添加另一个圆,或者更有可能更改现有圆的坐标而不将其删除并将其重新插入列表中, ),然后您需要使您可能用于绘画的画布控件无效(搜索“无效”以获取文档),以便使画布自行重新绘制。

  4. 您覆盖画布控件的绘制方法以进行绘画:首先将控件清除为其背景颜色,然后遍历您的形状列表,调用每个形状在画布上绘制自身。

当然这会造成闪烁; 如果这是不可接受的,那么您将需要阅读如何实现“双缓冲”(查找)以消除闪烁。

消除闪烁的另一种方法是仅擦除并重新绘制已更改的区域。 在您的情况下,这将是包含旧位置的圆和新位置的圆的最小矩形。 因此,不是使整个画布无效,而是仅使该矩形无效。 这种方法的问题在于,穿过无效区域的其他形状可能看起来有些不准确。 这可能是不可接受的,也可能是可以接受的,除非你尝试过,否则你不会知道。

你不能按照你想象的方式工作,因为图形的工作方式像 MSPaint(一个二维像素阵列,当它被绘制时,它被绘制)而不是 Adob​​e Photoshop(可以独立移动的图层或对象)

最简单的方法是自己实现类似 photoshop 的功能,并保留一个你想要绘制的所有东西的列表,从列表中绘制(列表包括一个圆圈),然后从列表中删除该圆圈,添加另一个并重新绘制列表中的整个画布

我知道这看起来很浪费,并且您可能会在绘制第一个圆圈时进入保存绘制的像素并恢复它们以擦除圆圈的机制,但这比仅仅放弃所有内容并每次重新开始要复杂得多

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM