C# 如何绘制简单的图形

C# 如何绘制简单的图形,c#,graphics,drawing,C#,Graphics,Drawing,我想在C#程序中绘制加载的表单。以下代码是否必须在paint()方法中?InitializeComponent()的具体功能是什么?我要问的是,InitializeComponent()方法到底做了什么。基本上,我不确定是否必须对OnPaint()方法进行重写,或者我是否可以在任何我想在表单上绘制内容的地方绘制代码。loadForm调用将在窗体上绘制的DrawIt()。但是绘制的代码不在任何特定的OnPaint()或paint()方法中 public partial class Form

我想在C#程序中绘制加载的表单。以下代码是否必须在
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必须已经存在于同一个文件或另一个文件中,对吗。