繁体   English   中英

C#创建绘图对象

[英]C# create drawing object

以下代码是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方法的名称吗? 我的意思是它有“Paint”后缀吗? .net何时调用此方法? 框架如何知道调用哪种方法以便绘制图像?

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

我很抱歉这些愚蠢的问题,但我主要来自函数式编程,我对使用框架很困惑,因为看起来他们正在调用自己的方法。 有人可以像6岁那样解释一下吗?

根据注释, Form1_PaintPaint事件的事件处理程序。

参数不是魔术,它们是此事件所必需的 - 即如果要绑定到此事件,则处理程序方法实现必须匹配它所需的事件参数。 PaintEventHandler定义为:

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

默认情况下,在设计器中添加处理程序时(例如,通过双击UI控件或“闪电”选项卡下的“ 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文件中以编程方式创建的.designer.cs内容。 事件也被创建。 当您创建一个新事件(例如Paint事件)时,Visual Studio将进入.designer.cs文件并将事件处理程序附加到该控件的事件。 然后,它会在.cs文件中创建一个方法存根,并将该方法存根附加到.designer.cs文件中的事件中。 只要不更改方法的参数,您就可以自由地将名称更改为您想要的任何名称。 你在你的方法的名称.CS文件必须在你的名称相匹配.designer.cs文件,所以您需要在两个地方改名字。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM