1

在C#编写的地理软件中,aPictureBox用于显示GIS地图,该地图以png文件形式保存在临时目录中。我们需要在地图上绘制一些几何形状。我们使用System.Drawing方法来执行此操作。

有时我们需要更改这些形状的某些属性或删除它们,我们需要删除这些形状而不使它们下方变黑。再次绘制它们Color.Transparent显然不起作用,Graphics#Clear(Color.Transparent)由于同样的原因,使用也不起作用。

我们甚至尝试使用另一个具有透明背景的图片框,该图片框仅用于在其上绘制形状;这样当我们使用Graphics#Clear(Color.Transparent)地图容器时保持不变。起初听起来像是一个完美的想法,但因为我不知道它如何以及为什么它使地图容器PictureBox不可见并且地图查看器面板完全是黑色的,所以这个想法也失败了。

MapViewerForm
    |-- Toolbar
    |-- StatusBar
    |-- MapViewer Panel (Provides scrollbars)
            |-- MapContainer Pictutebox
            |-- Shapes drawing canvas PictureBbox (The same size and location as map container, only difference is z-order)

我更喜欢使用两个PictureBoxes 并制作“层”的想法,我认为它比另一个想法不专业(我实际上是一个 java 开发人员,这是一个 C# 项目!),我认为JLayeredPaneC# 中应该有类似 java 的东西调整这两个图片框的 z 顺序并省略黑屏错误,但是如果有一种解决方案可以在地图容器本身上绘制形状然后清除它们而不会丢失位于它们后面的地图部分,我也会很感激这个答案。

PS:如果我们从文件中加载地图图片并将其存储在一个BitmapImage私有字段中,当我们需要清除绘图时,使用一段代码从该字段加载图像picMapArea.Image = MapViewer.getInstance().getMapImage();(注意:MapViewer是一个单例类)绘制的形状将消失但这显然不是一个“好主意”,因为性能不佳和滞后。

提前致谢。

4

2 回答 2

2

只需在图片框 Paint 事件的事件处理程序中绘制形状。

要恢复视图,您所要做的就是调用图片框Invalidate()方法,因此它会重新绘制图像,而不是在您的 Paint 事件处理程序中绘制任何内容。

于 2013-09-16T12:29:32.627 回答
2

只需使用额外的位图:

Bitmap original = LoadBitmap(...);





Bitmap copy = new Bitmap(original);

Graphics graph = Graphics.FromImage(copy);

// draw some extra


PictureBox1.Image = copy;
于 2013-09-16T12:13:09.833 回答