1

形成我到目前为止在我的程序中所做的事情,似乎在 winform 上绘制任何东西的唯一方法是通过 System.Windows.Forms.PaintEventArgs。如果您无权访问这些参数或此命名空间,而您只能访问 winform,您将如何在 winform 上绘制(比如矩形之类的形状)。

提前致谢。

4

3 回答 3

2

PaintEventArgs 是System.Windows.Forms 命名空间中的一个类。如果您正在使用表单,则意味着您确实可以访问命名空间和类,但是您可能无法访问您尝试使用的表单代码......

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

请参阅这个简单的示例类,该类引用了一个 Form,注册到绘图处理程序,然后进行一些任意绘图。

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);
        }
    }
}

此代码段中的重要概念是,如果您有对表单(或任何控件派生对象)的引用,您可以注册绘制事件,该事件在需要重新绘制控件时自动调用(并且您可以绘制任何您想要的在那个控件上。)

在片段中,我在构造函数中传递了 Form 并在那里注册了绘制事件,但这只是一个简单的示例。您的代码结构将有所不同,但是...您将拥有一个表单,并且将有一个初始化步骤,您可以在其中注册事件,然后创建一个进行绘画的方法。

您可以通过创建和处理自己的 Graphics 对象来绘制其他方式,但这不是优选的方法。一方面,当您需要重绘窗口时不会收到通知,并且需要创建其他重绘机制,例如计时器(作为一个非常简单且丑陋的示例),并且您必须自己管理 Graphics 对象。

于 2011-10-18T13:10:55.233 回答
1

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

在表格上绘图:

using (Graphics g = this.CreateGraphics())
{
    // do all your drawing here
}
于 2011-10-18T19:26:29.617 回答
1

可以通过订阅事件来访问它们Control.Paint,并在您订阅的事件处理程序中执行所有绘图。那将提供相关的PaintEventArgs.

于 2011-10-18T13:09:30.030 回答