请大虾指导:
小弟要做一个程序,开始的时候先最小化,然后得到键盘指令后就最大化,这个程序不需要任务栏所有FormBorderStyle设为None:
因此做的时候
1.开始:Form size调为(0,0),位置设为(-100,-100)//隐藏
2.指令:检查Screen大小,把位置调为(0,0),size调整为(ScreenHeight,ScreenWidth)程序都能运行,但是苦恼的是程序每次开始都会闪烁一下,然后才最小化,然后最大化的时候也明显闪烁一下,好像在左上方的位置闪一下才最大化,不知道这个问题怎么解决,多谢。所有size和location的调整,或者隐藏的方法都是写在OnPaint()时间里面,由Refresh()方法促发。

解决方案 »

  1.   


    WindowState = FormWindowState.Maximized;
                WindowState = FormWindowState.Minimized;
      

  2.   

    所有size和location的调整,或者隐藏的方法都是写在OnPaint()时间里面,由Refresh()方法促发。 不要写到 OnPaint 里面 , 初始化时候 调用 最小化时间 ,添加相应按键事件,最大化写到 按键事件中,
     最小化,最大化 不要通过改变Size 来实现
      

  3.   

    构造函数里写上:
    SetStyle(ControlStyles.OptimizedDoubleBuffer, true);最小化时
    this.SuspendLayout();
    this.WindowState = FormWindowState.Minimized;
    this.ResumeLayout(false);最大化时
    this.SuspendLayout();
    this.WindowState = FormWindowState.Maximized;
    this.ResumeLayout(false);
      

  4.   

    SetStyle(ControlStyles.OptimizedDoubleBuffer| ControlStyles.ResizeRedraw| ControlStyles.AllPaintingInWmPaint, true);
      

  5.   

    但是我忘了说了,程序除了最大最小,也有需要改变Size的
      

  6.   

    谢谢。
    SetStyle(ControlStyles.OptimizedDoubleBuffer| ControlStyles.ResizeRedraw| ControlStyles.AllPaintingInWmPaint, true);
    关于DoubleBuffer的优化以前也考虑过,但是如果用了这个参数,以前做的渐变(100MS改变Size一次)动画效果就没有了。
      

  7.   

    Size改变时,如果窗口原有内容不需要变化就不要Refresh。如果一定要Refresh就要设法提高绘制的速度了。
      

  8.   

    Paint方法只做绘图的工作,其它的计算全部都不要出现在paint里面。在SizeChange的时候可以去invalidate窗体来实现重绘
      

  9.   

    多谢大家。项目比较大,我需要点时间修改蛮多地方才行,不过相信问题能部分解决。
    个人感觉这些地方都是很有用的,以后如果大家遇上闪烁的问题可以参考,请指正:
    1. DoubleBuffer : SetStyle(ControlStyles.OptimizedDoubleBuffer, true); 
    2. Size的变化由onsizechange来捕捉,重画可以放Onpaint里面
    3. 最大最小化时候可以加上this.SuspendLayout(); this.WindowState = formWindowState.Maximized; this.ResumeLayout(false)。