none
在看《Microsoft C# Windows程序设计》时想到的代码,请高手分析! RRS feed

  • 问题

  • using System.Windows.Forms;
    using System.Drawing;
    
    class HelloWorld:Form
    {
      public HelloWorld()
      {
        Text="Hello World!";
        BackColor=Color.White;
      }
    }
    
    class Sample
    {
      static void Main()
      {
       HelloWorld form=new HelloWorld();
       Graphics graphics=form.CreateGraphics();
       graphics.DrawString("这个能绘制出来吗",form.Font,Brushes.Black,0,0);
       Application.Run(form);
      }
    }

    因为反复看了几遍Paint事件和OnPaint方法,发现绘制都在Paint事件的处理程序中完成,如果不存在Paint事件处理程序,就像上面的代码,为什么绘制不出来?
    另外还有两个问题:
        1,书上说“OnPaint方法实际上负责调用所有已经安装的Paint处理程序”,请问怎么理解?
        2,如果存在重写,则程序会先执行最下面的派生类的实例对象的OnPaint方法,若其中有base.OnPaint(PaintEventArgs e);则继续向上一层父类执行其中的OnPaint方法,是这样吗?
    2010年3月1日 10:12

答案

  • 你好!
         实际上是绘制了的,但是窗体显示出来之后会重绘,这次重绘把你绘制的东西覆盖了!
    周雪峰
    • 已建议为答案 付亚奇 2010年3月2日 3:14
    • 已标记为答案 柠檬布丁 2010年3月2日 11:43
    2010年3月1日 12:35
    版主

全部回复

  • 你好!
         实际上是绘制了的,但是窗体显示出来之后会重绘,这次重绘把你绘制的东西覆盖了!
    周雪峰
    • 已建议为答案 付亚奇 2010年3月2日 3:14
    • 已标记为答案 柠檬布丁 2010年3月2日 11:43
    2010年3月1日 12:35
    版主
  • 每次当窗口有变化的时候会触发 invalidate ,通知 重绘,,重绘的时候就将您以前的graphics.DrawString("这个能绘制出来吗",form.Font,Brushes.Black,0,0);
    这句给覆盖了,,其实是绘制了,但是被覆盖了,,

    onpaint 是 事件  在 invalidate后会触发 paint函数(也就是重绘函数),重绘函数里写了化什么,在重绘的时候就会给画上,
    不是base.onpaint  而是  base.paint,,如果是 override的话,,则是给从写了,,然后再从写中调用base的paint绘制基类的paint

    2010年3月1日 12:41