在c#面板中维护背景图像上的图形线

时间:2013-01-18 19:16:29

标签: c# graphics scaling lines

我在c#面板中的背景图像上绘制线条。面板锚定到窗体,以便窗体调整面板大小调整大小。背景图像设置为拉伸,因此您在调整窗体大小时看到的只是背景图像。

我最初的问题: 面板上绘制的线条(通过OnPaint事件)保留在图像调整大小时最初绘制的位置。

我目前的解决方案: 记录线的位置,并通过缩放X和Y坐标重新绘制在新位图上(工作正常)。

我的新问题: 当您不断调整窗口大小并绘制线条时,您无法从任何时间点计算缩放因子并将其应用于所有线条,因为线条源自不同尺寸的图像。

我认为我有两个选择: 重绘线后,遍历我的数组行并更新坐标信息,使其现在与当前比例匹配。 要么 除了存储线的坐标信息外,还存储了面板绘制时的尺寸信息,因此我总是可以根据绘制的时间和新的面板尺寸计算每条线的比例。

我希望: 如果您对这两种方法中的任何一种都有所了解,那将会非常感激....更好的方法是指向一个更好的方法来实现这一点(我对c#中的图形处理相当新)。 / p>

1 个答案:

答案 0 :(得分:0)

不能像我想的那样写评论。你有几个选择:

  • 直接在原始位图上绘制线条。根据任务的不同,这可能不是您的选择。

  • 正如你现在所做的那样,跟踪线条的坐标,在调整大小时更新它们,并在Paint上重绘它们 - 如果你使用它,你将能够移动和删除它们,也

  • 或者通过引入您在每次调整大小时更新的“比例因子”(float)来实现,并在您的Paint事件处理程序中使用该比例因子绘制所有内容。在创建直线时,使用比例因子BACK TO统一坐标系(比例因子1)计算其坐标,然后根本不需要修改坐标。由于统一的坐标系统,这可能很容易调试。这是我建议的,但它又取决于你的任务。

  • 绘制与原始图像大小相同的完全透明位图,使用与上一选项相同的比例因子。在创建一条线时,在统一坐标系中计算它的坐标,在Bitmap上绘制它,然后在每个Paint上,将整个Bitmap绘制在原始的Bitmap上。如果您需要删除或移动线条,或者如果内存紧张,或者在扩展时不希望线条模糊,这可能不是一个选项,但不知何故很多像这样的人因为它就像是“Photoshop中的一层”。 :)