【问题标题】:What is the difference between CreateGraphics and a Paint event's Graphics object?CreateGraphics 和 Paint 事件的 Graphics 对象有什么区别?
【发布时间】:2014-10-07 17:34:57
【问题描述】:

有人可以解释作为pevent.Graphics 传递的Graphics 对象与调用this.CreateGraphics() 返回的对象之间的区别吗?

【问题讨论】:

    标签: c# winforms graphics gdi+


    【解决方案1】:

    每当引发Paint 事件时,都会给您一个Graphics 对象以供绘制。这是作为pevent.Graphics 传递的。绘制到这个 Graphics 对象中就是绘制元素的方式。

    CreateGraphics 基本上不应该被使用。它从窗口句柄即时创建一个新的Graphics 对象。您可以绘制到它返回的 Graphics 对象中,但是在下次引发 Paint 事件时,您绘制到其中的任何内容都将被删除。

    您可能想要使用CreateGraphics 的唯一情况是用于特殊效果,例如在拖动过程中显示实时反馈。您希望在下次重新绘制元素时将其删除,因此您可以继续使用 CreateGraphics 获取一个临时画布,以便在拖动事件进行时进行绘制。

    您将永远Paint 事件处理程序方法中使用CreateGraphics。没有意义——你已经得到了一个 Graphics 对象来绘制!

    【讨论】:

    • 听,听。 Paint 事件提供的 Graphics 对象将首先通过调用 CreateGraphics 创建,但您几乎没有理由自己调用它。不幸的是,为了简单起见,周围有很多懒惰的例子使用CreateGraphics,但没有向阅读它的初学者提及他们不应该自己这样做。
    • 从概念上讲,是的,但在实践中并不完全正确。当底层 Windows 操作系统向窗口发送WM_PAINT 消息时,将引发Paint 事件,并且与此消息一起出现要绘制的设备画布 (DC) 的句柄。由于 WinForms 使用 GDI+ 而不是 GDI,因此它将这个 DC 转换为 Graphics 对象并将其传递给 Paint 事件处理程序。
    • 据我所知,您需要调用CreateGraphics 的一种情况是在执行诸如命中检测之类的操作时调用测量函数。例如,如果您单击复选框,则需要调用 GetGlyphSize,这需要 Graphics,如果您是在鼠标事件中执行此操作,则您还没有。
    猜你喜欢
    • 1970-01-01
    • 2019-04-18
    • 1970-01-01
    • 1970-01-01
    • 2010-12-25
    • 1970-01-01
    • 1970-01-01
    • 2011-09-23
    相关资源
    最近更新 更多