在用C#编写的地理软件中,PictureBox
用于显示在临时目录中保存为png
文件的GIS地图。我们需要在地图上绘制一些几何形状。我们使用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)
我更喜欢使用两个PictureBox
es并制作'层'的想法,我认为它不像其他想法那么不专业(我实际上是一个java开发人员,这是一个C#项目!),我认为那里应该像C#中的java JLayeredPane
一样调整这两个图片框的z顺序并省略黑屏bug,但是如果有一个解决方案在地图容器上绘制形状然后清除它们而不会丢失部分地图躺在他们身后我也很欣赏这个答案。
PS:如果我们从文件中加载地图图片并将其存储在Bitmap
或Image
私有字段中,并且当我们需要清除图纸时,请使用一段代码(例如{ {1}}(注意:picMapArea.Image = MapViewer.getInstance().getMapImage();
是单身类)绘制的形状将会消失,但由于性能不佳和滞后,显然不是“好主意”。
提前致谢。
答案 0 :(得分:2)
只需使用其他位图:
Bitmap original = LoadBitmap(...);
Bitmap copy = new Bitmap(original);
Graphics graph = Graphics.FromImage(copy);
// draw some extra
PictureBox1.Image = copy;
答案 1 :(得分:2)
只需在图片框Paint事件的事件处理程序中绘制形状。
要恢复视图,您只需调用picturebox Invalidate()
方法,重新绘制图像,而不是在Paint事件处理程序中绘制任何内容。