我的窗体中有很多控件,并且都设置了Anchor为Top、Left和Right或者Dock为Top或Fill,这样窗体在放大、缩小或者最大化后会按照窗体比例进行缩放。虽然美观,但是也带来不便,当窗体放大、缩小或者最大化时,窗体不停地闪烁,要近30秒时间在不停闪烁,这让用户受不了。有没有什么设置或者好的方法使窗体控件既可按照比例缩放,又不会闪烁。谢谢大家指教!急用!!

解决方案 »

  1.   

    当控件拥有BackGroundImage属性时,尽可能不使用Paint来绘制,而是使用内存图双缓冲的方法.
    如果没有自绘界面而出现的闪烁,这与显卡的性能有直接的关系.
      

  2.   

    什么是自绘界面?我的控件是一个个从工具栏中拖到窗体上,并在属性窗口中设置了Anchor或者Dock的
      

  3.   

    在ResizeBegin事件中,SuspendLayout,在ResizeEnd事件中,ResumeLayout,不知道如何。
      

  4.   

    由于Dock属性在窗体调整大小的同时就会自我设定,故没有特殊原因,不要使用DOCK.
    可以通过代码来调整它,总之让Dock不再认为窗体始终在变化.
    比如,在ResizeEnd过程中,手动调整目标控件大小,起到"Dock"效果.
    由于只会在ReSizeEnd时发生,所以在窗体调整时不会"闪".
    当然,如果想要更好的效果,您不妨参考一下我的思路:
    1 定义一个Point变量,用来存储窗体大小
    2 在窗体的Mouse_Up时判断当前窗体大小是否等于该Point,以判断是否被调整了
    3 如果调整,则"手动调整,仿Dock延伸",否则,不作调整.
      

  5.   

    还有一种办法,只是陈述,不作为推荐给您的方案,您可以阅读一次即可.
    使用UpDateLayeredWindow()这个API来将您的窗体合成到屏幕上,这是不会有闪烁的,但缺点是无法显示窗体上的控件,除非您通过代码来将控件"画"到窗体图片上.在您尝试上楼的方法时,您可以即时反馈您试验的效果,以使我们能更好地去分析并帮助您解决.
      

  6.   

    那如果不要Dock,而用Anchor,并设置为Top、Left和Right、Bottom呢?我先试下看看吧。
      

  7.   

    this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);//以下三行消除主界面闪烁
                this.SetStyle(ControlStyles.DoubleBuffer, true);
                this.SetStyle(ControlStyles.UserPaint, true);
      

  8.   

    以上三行代码放在什么地方?是FromSize中还是其他地方?
      

  9.   

    窗体控件确实设置了透明背景,因为控件用了Donetbar控件,窗体背景进行了设置,但是如果不设置控件透明,而采用默认的,窗体就变得非常难看。
      

  10.   

    我把透明背景去掉了,并且设置了背景颜色,然后在窗体加载时使用了12楼的代码:
    this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);//以下三行消除主界面闪烁
                this.SetStyle(ControlStyles.DoubleBuffer, true);
                this.SetStyle(ControlStyles.UserPaint, true);
    闪烁减轻了些,但还是有闪烁,而且在我的机器上闪烁比较少,但是到客户的机器上还是比较厉害,不知为何(客户的机器配置和我机器的配置一样)。