自定义WndProc不会停止调整大小

时间:2019-09-01 14:46:41

标签: c# winforms resize wndproc

我制作了一个处理WM_CREATE,WM_ACTIVATE,WM_NCCALCSIZE和WM_NCHITTEST的表格。它还会覆盖绘画方法。

问题是当我调整表单大小时,它不会停止调整大小。我试图将消息与工作窗口进行比较,但spy ++不断崩溃。 这是我的WndProc代码:

protected override void WndProc(ref Message m)
{
    IntPtr result = IntPtr.Zero;

    bool callDWP = !Win32Interop.DwmDefWindowProc(m.HWnd, m.Msg, m.WParam, m.LParam, out result);

    switch (m.Msg)
    {
        case Win32Messages.WM_CREATE:
        {
            int style = Win32Interop.GetWindowLong(m.HWnd, Win32Constants.GWL_STYLE);
            int styleEx = Win32Interop.GetWindowLong(m.HWnd, Win32Constants.GWL_EXSTYLE);
            Win32Interop.AdjustWindowRectEx(out RECT rc, style, false, styleEx);

        }
        break;

        case Win32Messages.WM_ACTIVATE:
        {
            MARGINS margins = new MARGINS
            {
                cxLeftWidth = Math.Abs(BorderLeft),
                cxRightWidth = Math.Abs(BorderRight),
                cyBottomHeight = Math.Abs(BorderBottom),
                cyTopHeight = Math.Abs(BorderTop)
            };

            int hr = Win32Interop.DwmExtendFrameIntoClientArea(m.HWnd, ref margins);

            result = IntPtr.Zero;
        }
        break;

        case Win32Messages.WM_NCCALCSIZE:
        {
            if (m.WParam != IntPtr.Zero)
            {
                result = IntPtr.Zero;
                callDWP = false;
            }
        }
        break;

        case Win32Messages.WM_NCHITTEST:
        {
            {
                int ht = DoHitTest(m);
                Console.WriteLine(ht);
                if (callDWP)
                {
                    callDWP = (ht == Win32Constants.HTNOWHERE);
                    result = new IntPtr(ht);
                }

            }

            break;
        }
        default:
        {
            base.WndProc(ref m);
            break;
        }
    }
    m.Result = result;
    if (callDWP)
    {
        base.WndProc(ref m);
    }
}

1 个答案:

答案 0 :(得分:0)

默认不拨打电话base.WndProc(ref m);