应该是没有调用base.OnPaint(pea);是背景颜色可能没有刷新,跟前端的颜色接近,所以看不到自画的文本,
试一下先调用g.FillRectange()清除背景,然后再。
g.DrawString("Hello,world forms",Font,Brushes.Black,0,0);

解决方案 »

  1.   

    不是说程序出错,
    当有base.OnPaint(pea)这句时,窗体显示"Hello from instatiate"和"Hello,world forms"
    当没有base.OnPaint(pea)这句时,窗体只显示"Hello,world forms",也就是说类Form2里的MyPaintEvent方法被类Helloworld的OnPaint覆盖了,
    我就很疑惑,base.OnPaint(pea)为什么会起到这个作用?
    谁能帮我解答,谢谢了!
      

  2.   

    因为类HelloWorld继承自Form;那么在HelloWorld中的Base自然指的就是Form;
    在你的Main函数中
    Form form=new Helloworld();
    ...
    form.Paint+=new PaintEventHandler(MyPaintEvent);
    ...
    而在HelloWorld类中声明有
    protected override void OnPaint(PaintEventArgs pea)
    其中的override关键字表示此函数将覆盖父类的该函数,也就是覆盖父类的OnPaint事件。
    所以如果不运行base.OnPaint(pea); 则
    static void MyPaintEvent(object o,PaintEventArgs pea)
    {
    Form form=(Form)o;
    Graphics g=pea.Graphics;
    g.DrawString("Hello from instatiate",form.Font,Brushes.Black,0,100);
    }
    不会被执行,所以也就不会出现“Hello from instatiate”了。
      

  3.   

    to:tomatosoft(Tomato)
    首先感谢你的关注,书里原文是这么解释的: 
    The OnPaint method in Control is responsible for calling the installed Paint event handlers.Because the Helloworld class overrides OnPaint,that job doesn't get done.
    我现在的理解是使用base.OnPaint(pea)就是让override后的OnPaint具有Form中OnPaint的功能,这样的理解对吗?请高手指点!
      

  4.   

    我认为可以这么理解。
    我想Windows的消息处理,你应该知道吧,当把一个消息拦截后,最后还
    是要写一句话,让Window来处理接下来的事情。
    所以,在这里第一句话写base.OnPaint(pea)就是首先让父类完成它自己的处理后再来处理
    自己的OnPaint事件。
      

  5.   

    Because the Helloworld class overrides OnPaint,that job doesn't get done.
    这句话也已经写得很清楚啦。
      

  6.   

    我也只是个C#的初学者,大家一起学习。
    QQ群:5030333 欢迎加入
      

  7.   

    protected override void OnPaint(PaintEventArgs pea)重写了基类System.Windows.Forms.Form的OnPaint方法!