如何在Winform上绘制而无需访问System.Windows.Forms.PaintEventArgs命名空间?

时间:2011-10-18 13:06:58

标签: .net winforms drawing delphi-prism paintevent

在我的程序中构建到目前为止所做的事情,似乎在winform上绘制任何内容的唯一方法是通过System.Windows.Forms.PaintEventArgs。如果您无法访问这些参数或此命名空间并且只能访问winform,那么如何在winform上绘制(比如矩形形状)。

提前致谢。

3 个答案:

答案 0 :(得分:2)

PaintEventArgs is a class中的

System.Windows.Forms namespace。如果您正在使用表单,这意味着您可以访问命名空间和类,但您可能无法访问您尝试绘制的表单代码...

即使您无权访问Form的源代码,Paint事件也是公共的,您可以从Form外部的代码注册处理程序。 (我猜这是你的问题。)

请参阅这个简单的示例类,该类具有对Form的引用,向paint处理程序注册,然后执行一些任意绘制。

using System;
using System.Drawing;
using System.Windows.Forms;

namespace WindowsFormsApplication1 {
    class Painter {
        public Painter(Form form) {
            form.Paint += new PaintEventHandler(form_Paint);
        }

        void form_Paint(object sender, PaintEventArgs e) {
            e.Graphics.DrawLine(Pens.Black, 0, 0, 20, 20);
        }
    }
}

这个片段中的重要概念是,如果你有一个表单(或任何Control派生对象)的引用,你可以注册paint事件,当需要重新绘制控件时,它会被自动调用(并且你可以绘制你想控制的任何东西。)

在代码片段中,我在构造函数中传递了Form,并在那里注册了paint事件,但这只是一个简单的例子。你的代码的结构会有所不同,但是......你将有一个Form,然后会有一个初始化步骤,你注册这个事件,然后创建一个绘制你的绘画的方法。

您可以通过创建和处理自己的Graphics对象来绘制其他方法,但这不是更好的方法。首先,当你需要重新绘制窗口并且需要创建其他重绘机制(例如一个非常简单和丑陋的例子)时,你不会得到通知,你必须自己管理Graphics对象。 p>

答案 1 :(得分:1)

您通过订阅Control.Paint事件获取访问权限,并在您订阅的事件处理程序中执行所有绘图。这将与相关的PaintEventArgs

一起提供

答案 2 :(得分:1)

如果要在Paint事件之外的表单(或任何其他控件)上绘图,则必须获取该控件的Graphics对象。然后你可以画出你心中的内容。但请注意,下次出现绘制消息时,您绘制的内容可能会被删除。

在表格上绘图:

using (Graphics g = this.CreateGraphics())
{
    // do all your drawing here
}