【发布时间】:2014-10-07 17:34:57
【问题描述】:
有人可以解释作为pevent.Graphics 传递的Graphics 对象与调用this.CreateGraphics() 返回的对象之间的区别吗?
【问题讨论】:
有人可以解释作为pevent.Graphics 传递的Graphics 对象与调用this.CreateGraphics() 返回的对象之间的区别吗?
【问题讨论】:
每当引发Paint 事件时,都会给您一个Graphics 对象以供绘制。这是作为pevent.Graphics 传递的。绘制到这个 Graphics 对象中就是绘制元素的方式。
CreateGraphics 基本上不应该被使用。它从窗口句柄即时创建一个新的Graphics 对象。您可以绘制到它返回的 Graphics 对象中,但是在下次引发 Paint 事件时,您绘制到其中的任何内容都将被删除。
您可能想要使用CreateGraphics 的唯一情况是用于特殊效果,例如在拖动过程中显示实时反馈。您希望在下次重新绘制元素时将其删除,因此您可以继续使用 CreateGraphics 获取一个临时画布,以便在拖动事件进行时进行绘制。
您将永远在Paint 事件处理程序方法中使用CreateGraphics。没有意义——你已经得到了一个 Graphics 对象来绘制!
【讨论】:
Paint 事件提供的 Graphics 对象将首先通过调用 CreateGraphics 创建,但您几乎没有理由自己调用它。不幸的是,为了简单起见,周围有很多懒惰的例子使用CreateGraphics,但没有向阅读它的初学者提及他们不应该自己这样做。
WM_PAINT 消息时,将引发Paint 事件,并且与此消息一起出现要绘制的设备画布 (DC) 的句柄。由于 WinForms 使用 GDI+ 而不是 GDI,因此它将这个 DC 转换为 Graphics 对象并将其传递给 Paint 事件处理程序。
CreateGraphics 的一种情况是在执行诸如命中检测之类的操作时调用测量函数。例如,如果您单击复选框,则需要调用 GetGlyphSize,这需要 Graphics,如果您是在鼠标事件中执行此操作,则您还没有。