应该是没有调用base.OnPaint(pea);是背景颜色可能没有刷新,跟前端的颜色接近,所以看不到自画的文本,
试一下先调用g.FillRectange()清除背景,然后再。
g.DrawString("Hello,world forms",Font,Brushes.Black,0,0);
试一下先调用g.FillRectange()清除背景,然后再。
g.DrawString("Hello,world forms",Font,Brushes.Black,0,0);
当有base.OnPaint(pea)这句时,窗体显示"Hello from instatiate"和"Hello,world forms"
当没有base.OnPaint(pea)这句时,窗体只显示"Hello,world forms",也就是说类Form2里的MyPaintEvent方法被类Helloworld的OnPaint覆盖了,
我就很疑惑,base.OnPaint(pea)为什么会起到这个作用?
谁能帮我解答,谢谢了!
在你的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”了。
首先感谢你的关注,书里原文是这么解释的:
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的功能,这样的理解对吗?请高手指点!
我想Windows的消息处理,你应该知道吧,当把一个消息拦截后,最后还
是要写一句话,让Window来处理接下来的事情。
所以,在这里第一句话写base.OnPaint(pea)就是首先让父类完成它自己的处理后再来处理
自己的OnPaint事件。
这句话也已经写得很清楚啦。
QQ群:5030333 欢迎加入