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)的方法。
我为愚蠢的问题感到抱歉,但我主要来自函数式编程,我对使用框架感到困惑,因为它们似乎在调用自己的方法。谁能像给六岁小孩解释一样?
根据评论,Form1_Paint
是Paint
事件的事件处理程序。
参数不是魔法,它们是这个事件所需要的——也就是说,如果你想绑定到这个事件,你的处理程序方法实现必须匹配它所需要的事件参数。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.
};
其中sender
和pe
的类型与之前完全相同。默认情况下,设计器不会这样做,所以您可以通过编程方式将上述订阅添加到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
文件中的名称匹配,因此您需要在两个地方更改名称。