如何绘制简单的图形

时间:2013-12-15 07:19:26

标签: c# graphics drawing

我想在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();
        }
    }

2 个答案:

答案 0 :(得分:1)

InitializeComponent方法:

创建表单时,VS会创建两个包含ONE类的文件(只需查看部分类):

1)Form.cs,这是你放置代码的地方。

2)Form.Designer.cs,它是自动生成的分部类。当您在设计视图中将某个组件放在表单上时,VS会生成所需的代码,以便在此类的运行时构建该组件。

InitializeComponent是Form.Designer.cs中自动生成的方法,它初始化您在表单上放置的组件。当你从构造函数中调用它时,你只是告诉它在构造表单对象时进行初始化。

OnPaint方法:

您应该将绘图代码放在OnPaint方法中。无论何时需要,都可以使用.Net调用此方法。例如,如果您的窗口落在另一个窗口后面然后再次到达前面,您的图纸就会被清除!因此,再次调用此方法重新绘制图纸。

答案 1 :(得分:1)

是的,你应该在paint事件中调用你的代码。为什么一定要这样做?我认为当需要更新表单时,窗口会自动调用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();
    }

我的测试结果是这样的: result of drawing