日期:2014-05-19  浏览次数:20680 次

继承Form后的奇怪问题
还望高手指点指点!!!先谢过了,我的环境是vs.net   2003
1   新建项目,拖了个picturebox控件(fill);然后拖了个timer控件进去,设定每秒触发一个绘图函数
2   加入一个新的窗体   然后把继承的System.Windows.Forms.Form改为Form1
3   编译后出现了奇怪的问题。程序和Form2的设计器同时开始了绘图,更奇怪的是关掉程序后,Form2的设计器还在不停的绘图。
各位可以花三四分钟在自己的环境下试下,讲讲原因来着,不甚感激。看到如此神奇的场景,我算是彻底见世面了。。。。

Form1的部分代码:

private   int   count   =   0   ;

protected   override   void   OnPaint(System.Windows.Forms.PaintEventArgs   e)
{
        Graphics   g   =   pictureBox1.CreateGraphics();
        Pen   pen   =   new   Pen(Color.Red,5);
        if   (   count   ==   10   )
        {
count   =   0;
g.Clear(BackColor);
        }
        else
        {
                  for   (int   i=0;i <count;i++)  
{
    g.DrawLine(pen,   20*i,20*i,50*i,20*i);
}
        }
}

private   void   timer1_Tick(object   sender,   System.EventArgs   e)
{
        count   ++;
        this.Invalidate();
}

------解决方案--------------------
private int count = 0 ;

protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
{
Graphics g = pictureBox1.CreateGraphics();
Pen pen = new Pen(Color.Red,5);
if ( count == 10 )
{
count = 0;
g.Clear(BackColor);
}
else
{
for (int i=0;i <count;i++)
{
g.DrawLine(pen, 20*i,20*i,50*i,20*i);
}
}
}

private void timer1_Tick(object sender, System.EventArgs e)
{
if(!this.DesignMode)
{
count ++;
this.Invalidate();
}
}

------解决方案--------------------
你的控制在设计时Timer是不运行的,可是放到一个窗体上这个控件就相当于运行时了.

你可以通过DesignMode来判断是不是设计时,但是这个DesignMode在继承后可能就不准了.
------解决方案--------------------
没试,不过这种现象不奇怪
既然Form2继承Form1,就会继承它的OnPaint行为,设计器里面会显示一个模拟的效果来给你看
第一次编译之前不会有,是因为设计器还不知道这个效果是什么样的

这件事情要理解应该比较简单,如果你现在添加一个button到form1,刚开始的时候,设计器上的form2是没反应的。如果你编译过,那么form2的设计器就会显示出这个button给你看
你所提到的现象,跟加一个button从继承的意义上来说,是一样的,只不过因为你重载了OnPaint,加计时器,做出了动态的效果