【发布时间】:2014-12-17 01:48:39
【问题描述】:
我正在阅读很多关于 C# 绘图和使用图形处理程序阅读 GDI+ 上的 MSDN 教程。
我希望能够绘制一个图表,我在列表中有哪些节点但我不能使用自动放置,我需要节点位于指定的位置并具有特定的外观等等,转换时间,这就是我停止寻找图形库的原因。
第一次绘制时效果很好,但是当我想要在代码中发生其他事情之后(而不是单击控件之后)绘制一些东西时,我不能这样做。例如:
if (somethingHappens) {
// repaint the panel adding some things
}
我得到的只是没有新的事情发生,或者我之前的画消失了。
我发现了一些关于 OnPaint 覆盖和最小化时图纸消失的示例。当我需要在应用程序中发生某些事情时需要绘制额外的东西时,我是否必须覆盖它或者它是否完全不同?
【问题讨论】:
-
如果你想在面板上绘制任何东西(持久性),你只能(读我的嘴唇:only)在 Paint 事件中或从那里调用的方法中进行(您将 e.Graphics 参数交给它)。其他的都是错误! - 无论您绘制什么,都必须首先将其放入(可能)存储在(可能)类级别的一系列绘制动作中,然后您可以在 Paint 事件中进行绘制。 - 每当您想绘制更多内容时,您必须将更多这些绘制动作添加到您拥有的集合中,然后致电
yourPanel.Invalidate();! - 所以,你学会了如何让它看起来不错,现在用它来做正确的事! -
要获得更具体的建议,请考虑发布一些关于您目前绘制的内容和方式的代码..!
-
顺便说一句:还有另一种选择:您也可以将放入 PictureBox 中显示的图像,然后依次添加更多内容。看可以回答here for a short example! - 主要区别在于这种累积绘制的方式不会让你改变你以前做过的事情。
-
换句话说,每次调用 Paint() 事件时,都会绘制“绘图集合”中的所有内容。要添加新内容或更改某些内容,您可以以某种方式添加或修改集合,然后再次绘制所有内容,向您显示新的“状态”。
-
如果有些东西是有条件地绘制的,我需要把所有的代码放在那里并有一些标志吗?不。如果有条件地绘制了一些东西,你将它添加到绘制动作集合中在这些条件下。绘制动作通常是一个类,其中包含点、画笔等数据以及线条、矩形椭圆等动作类型。 - 在 apint 事件中,您将有一些类似
foreach (drawaction da in drawactions) if (da.type==..) e.Graphics.DrawLines(..)..如果您只在节点之间绘制线条,您可能没有一类平局动作就可以逃脱,就像彼得的回答一样..