从顶部和左侧调整大小时闪烁

时间:2018-02-08 11:37:06

标签: c# winforms flicker

我从System.Windows.Forms.Form类派生了一个类来创建自定义表单。

我已覆盖方法WndProc(ref m)并处理WM_NCPAINT窗口消息以使用我自己的自定义绘制标题栏。

我在下面提供了我的实现的基本版本。

protected override void WndProc(ref Message m)
        {
            switch (m.Msg)
            {
                case WindowMessages.WM_NCPAINT: // TO draw the title bar text and buttons
                    On_Wm_NcPaint(ref m);
                    break;
                case WindowMessages.WM_NCCALCSIZE: //To define the client area size of the form.
                    On_Wm_NcCalcSize(ref m);
                    break;
           case WindowMessages.WM_WINDOWPOSCHANGED:
                    On_Wm_WindowPosChanged(ref m);
                    break;
           case WindowMessages.WM_NCLBUTTONUP: //For handling close,minimize and maximize operations.
                    On_Wm_NcLButtonUp(ref m);
                    break;
        default:
                    base.WndProc(ref m);
                    break;
         }
      }

    private void On_Wm_WindowPosChanged(ref Message m)
        {
            NativeMethods.WINDOWPOS wpos = (NativeMethods.WINDOWPOS)m.GetLParam(typeof(NativeMethods.WINDOWPOS));
            if ((wpos.flags & WindowMessages.SWP_NOSIZE) == 0)
            {

                var rect = new NativeMethods.RECT();
                NativeMethods.GetWindowRect(this.Handle, ref rect);
                var region = NativeMethods.CreateRectRgn(0, 0, rect.Width, rect.Height);
                if (region != IntPtr.Zero)
                    NativeMethods.SetWindowRgn(this.Handle, region, true);
                Invalidate();
                                return;
              }

            base.WndProc(ref m);
         }   

这适合我。

问题是,从表单的顶部和左侧调整大小时,表单会闪烁。

当我通过从左侧调整大小来增加表单大小时,似乎发生了以下情况。

  1. 首先,表单重新定位到左侧。
  2. 然后表格的宽度在右边增加。
  3. 这种情况发生得很慢,所以它看起来像闪烁。

    注意:表单中会出现闪烁。不在添加到表单中的控件中。

    我尝试了以下方法来解决闪烁问题。

    SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer
                    | ControlStyles.ResizeRedraw | ControlStyles.UserPaint, true);
    
    
    this.DoubleBuffered = true; 
    
     protected override CreateParams CreateParams
            {
                get
                {
                    CreateParams cp = base.CreateParams;
                    cp.ExStyle |= 0x02000000;
                    return cp;
                }
            }
    

    这些方法没有给出任何结果。

    这种闪烁不会发生在基本形式(System.Windows.Forms.Form)

    由于WindowMessage WM_WINDOWPOSCHANGED处理不正确,可能会发生这种情况。

    请分享您的想法,摆脱这种闪烁,并顺利调整大小。

    提前致谢

0 个答案:

没有答案