c#创建绘图对象

本文关键字:对象 绘图 创建 | 更新日期: 2023-09-27 17:50:44

以下代码是来自MSDN的示例:

private void Form1_Paint(object sender, 
   System.Windows.Forms.PaintEventArgs pe) 
{
   // Declares the Graphics object and sets it to the Graphics object
   // supplied in the PaintEventArgs.
   Graphics g = pe.Graphics;
   // Insert code to paint the form here.
}

我有一些问题:

  • 我们可以更改Form1_Paint方法的名称吗?我是说一定要有"油漆"后缀吗?什么时候。net调用这个方法?框架如何知道调用哪个方法来绘制图像?

  • 我不明白为什么我们只是定义Form1_Paint方法可以接收2个参数,然后神奇地框架只是调用引用object和引用PaintEventArgs对象(pe)的方法。

我为愚蠢的问题感到抱歉,但我主要来自函数式编程,我对使用框架感到困惑,因为它们似乎在调用自己的方法。谁能像给六岁小孩解释一样?

c#创建绘图对象

根据评论,Form1_PaintPaint事件的事件处理程序。

参数不是魔法,它们是这个事件所需要的——也就是说,如果你想绑定到这个事件,你的处理程序方法实现必须匹配它所需要的事件参数。PaintEventHandler定义为:

public delegate void PaintEventHandler(object sender, PaintEventArgs e);

默认情况下,当您在设计器中添加处理程序时(例如,双击UI控件或"lightning flash"选项卡下的Events图标),将自动创建一个具有默认名称的事件处理程序:

{name of the control}_{name of event}

在您的示例中,当创建处理程序方法时,表单的名称为Form1

你可以重命名处理程序方法,但如果你这样做,你还需要在Form1.designer.cs中更改相应的事件绑定(即在下面的this.Form1_Paint中更改):

this.Name = "Form1";
this.Text = "Form1";
this.Paint += new System.Windows.Forms.PaintEventHandler(this.Form1_Paint);

(+=表示订阅事件-一旦订阅,当事件引发时,将调用所有订阅方法)

编辑

由于您来自FP背景,您可能对不需要显式命名的事件处理程序感兴趣,您还可以订阅类型合适的lambda:

this.Paint += (sender, pe) => 
{
   // Declares the Graphics object and sets it to the Graphics object
   // supplied in the PaintEventArgs.
   Graphics g = pe.Graphics;
   // Insert code to paint the form here.
};

其中senderpe的类型与之前完全相同。默认情况下,设计器不会这样做,所以您可以通过编程方式将上述订阅添加到Form1构造函数

Winforms是一种基于事件的技术,这意味着事件发生时,程序员的工作是决定当事件发生时该做什么(如果有的话)。为了实现c#使用的这种基于事件的编程模型,发生了一些神奇的事情。

每当你在Winforms项目中创建一个新表单时,一个相关的.designer.cs文件以及你的.cs文件都会被创建。.designer.cs是一个自动生成的文件。Visual Studio使用它来生成设计窗体时看到的设计器视图。

当你添加一个控件到你的表单,该控件是在.designer.cs文件中编程创建的,并给出一些默认值(如大小,名称和id)。该文件随后由Visual Studio设计器解析,设计器根据该.designer.cs文件呈现设计器视图。您可以打开.designer.cs文件,并看到您的窗体上的所有控件被编程创建。

现在控件的物理属性并不是唯一在.designer.cs文件中被编程创建的东西。事件也被创建。当您创建一个新事件,比如Paint事件时,visual studio所做的是进入.designer.cs文件,并将事件处理程序附加到该控件的事件。然后,它在.cs文件中创建一个方法存根,并将该方法存根附加到.designer.cs文件中的事件。只要不更改方法的参数,就可以随意更改名称。.CS文件中的方法名称必须与.designer.cs文件中的名称匹配,因此您需要在两个地方更改名称。