C# 如何绘制简单的图形
我想在C#程序中绘制加载的表单。以下代码是否必须在C# 如何绘制简单的图形,c#,graphics,drawing,C#,Graphics,Drawing,我想在C#程序中绘制加载的表单。以下代码是否必须在paint()方法中?InitializeComponent()的具体功能是什么?我要问的是,InitializeComponent()方法到底做了什么。基本上,我不确定是否必须对OnPaint()方法进行重写,或者我是否可以在任何我想在表单上绘制内容的地方绘制代码。loadForm调用将在窗体上绘制的DrawIt()。但是绘制的代码不在任何特定的OnPaint()或paint()方法中 public partial class Form
paint()
方法中?InitializeComponent()
的具体功能是什么?我要问的是,InitializeComponent()
方法到底做了什么。基本上,我不确定是否必须对OnPaint()
方法进行重写,或者我是否可以在任何我想在表单上绘制内容的地方绘制代码。loadForm调用将在窗体上绘制的DrawIt()
。但是绘制的代码不在任何特定的OnPaint()
或paint()
方法中
public partial class Form3 : Form
{
public Form3()
{
InitializeComponent();
}
private void DrawIt()
{
System.Drawing.Graphics graphics = this.CreateGraphics();
System.Drawing.Rectangle rectangle = new System.Drawing.Rectangle(
50, 50, 150, 150);
graphics.DrawEllipse(System.Drawing.Pens.Black, rectangle);
graphics.DrawRectangle(System.Drawing.Pens.Red, rectangle);
}
private void Form3_Load(object sender, EventArgs e)
{
DrawIt();
}
}
初始化组件方法: 创建表单时,VS创建两个包含一个类的文件(只需查看部分类): 1) Form.cs是您放置代码的地方 2) Form.Designer.cs,它是自动生成的分部类。当您在设计视图中的窗体上放置某个组件时,VS将生成所需的代码,以便在此类中运行时构建该组件
InitializeComponent
是Form.Designer.cs中自动生成的方法,用于初始化您在表单上删除的组件。当您从构造函数调用它时,您只是告诉它在构造表单对象时进行初始化
OnPaint方法:
您应该将图形代码放入
OnPaint
方法中。每当需要时,.Net就会调用此方法。例如,如果您的窗口位于另一个窗口的后面,然后又位于前面,则图形将被清除!因此,再次调用此方法以重新绘制图形。是的,您应该在绘制事件中调用代码。为什么一定要这么做?我认为当需要更新表单时,windows会自动调用paint事件。如果在form_load事件中调用代码,它只调用一次,然后当窗体显示时,窗体再次绘制,并且它在form_load中覆盖了您的效果,因此您无法看到结果。
因此,您可以在Form_paint()事件中调用代码,也可以重写OnPaint函数,它们是相同的,如下所示:
private void DrawIt()
{
System.Drawing.Graphics graphics = this.CreateGraphics();
System.Drawing.Rectangle rectangle = new System.Drawing.Rectangle(
50, 50, 150, 150);
graphics.DrawEllipse(System.Drawing.Pens.Black, rectangle);
graphics.DrawRectangle(System.Drawing.Pens.Red, rectangle);
this.Update();
}
protected override void OnPaint(PaintEventArgs e)
{
DrawIt();
base.OnPaint(e);
}
private void MainWindow_Paint(object sender, PaintEventArgs e)
{
//DrawIt();
}
我的测试结果如下:
为自己准备一本关于Winforms编程的入门书。您的基本知识非常错误,很难猜测,直觉并不是最好的指南。受保护的覆盖是否覆盖void OnPaint(PaintEventArgs e){DrawIt();base.OnPaint(e);}OnPaint应该重新绘制表单或需要重新绘制表单时,只需重新绘制表单。当您想从中重新绘制时,是否可以调用onPaint()。为什么上面的示例不会导致infinte循环,因为base.onPaint()您会认为它会在递归调用中不断调用自己。在我的测试应用程序中,它运行良好,不会导致无限循环,您的应用程序中有什么问题?在Java中,它们是调用paint()和其他两个绘制方法的repaint()。在VB.NET中,这可以在paint()中完成,如果我想重新绘制自定义组件,该怎么办。我应该重画整个表单吗?1)实际上绘画是一个事件,而不是一种方法。OnPaint是在引发绘制事件时触发的方法。可以重写OnPaint方法,也可以将自己的方法附加到Paint事件。2) Form类继承了Control类中的Paint和OnPaint,因此您可以使用所需的任何控件执行此操作。3) 请注意,无论如何,控件和表单都会重新绘制!您只是将自定义代码添加到重画过程中。是否必须如上所述覆盖它从控件继承有点麻烦(例如,在设计视图中使用拖放)!我认为最好将您自己的方法附加到控件的Paint事件,如下所示:
this.MyControl.Paint+=new PaintEventHandler(this.MyControl\u Paint)
能否将其作为一个完整的子文件显示和示例。我想我明白您的意思,但是这个.MyControl.Paint必须已经存在于同一个文件或另一个文件中,对吗。