C# 单击父窗口时,子窗体不闪烁

C# 单击父窗口时,子窗体不闪烁,c#,winforms,wndproc,C#,Winforms,Wndproc,我正在开发一个自定义表单,它提供了更多选项来自定义表单的外观 为此,我从System.Windows.Forms.Form类派生了该类,并重写了WndProc(ref Message m)方法 我已经处理了所需的窗口消息(WM_NCPAINT,WM_NCCALCSIZE等)以自定义表单 我已经通过以下代码显示了表单customform,以便通过单击按钮显示子表单 CustomForm form = new CustomForm(); form.ShowDialog(); 单击父窗体时,子窗体不

我正在开发一个自定义表单,它提供了更多选项来自定义表单的外观

为此,我从
System.Windows.Forms.Form
类派生了该类,并重写了
WndProc(ref Message m)
方法

我已经处理了所需的窗口消息(
WM_NCPAINT
WM_NCCALCSIZE
等)以自定义表单

我已经通过以下代码显示了表单customform,以便通过单击按钮显示子表单

CustomForm form = new CustomForm();
form.ShowDialog();
单击父窗体时,子窗体不会闪烁。但在microsoft窗体中,会发生闪烁

我已经处理了窗口消息WM_NCCALCSIZE,以指定表单的客户端区域大小,如下所示

void On_WM_NcCalcSize(ref Message m)
 {
    rect.Top += borderThickness + titleBarHeight;
    rect.Left += borderThickness;
    rect.Right -= borderThickness;
    rect.Bottom -= borderThickness;
    m.Result = IntPtr.Zero;
    Marshal.StructureToPtr(rect, m.LParam, true);
 }
我还处理了WM_NCPAINT绘制自定义标题栏和边框以及其他定制

我还通过以下代码处理了On_Wm_NcActivate

 private void On_Wm_NcActivate(ref Message m)
        {
            if (!this.IsMdiContainer)
                NativeMethods.LockWindowUpdate(this.Handle);
            base.WndProc(ref m);
            NativeMethods.LockWindowUpdate(IntPtr.Zero);
            if (Style != null)
            {
                var msg = new Message();
                msg.Msg = WindowMessages.WM_NCPAINT;
                msg.HWnd = m.HWnd;
                msg.WParam = (IntPtr)1;
                msg.LParam = (IntPtr)0;
                On_Wm_NcPaint(ref msg);
            }
       }

我不知道我哪里出错了。所以请给我一个建议

您应该将“表单”的父表单设置为父表单

Hi Goldli Zh我已经给出了我处理过的代码片段,请参考并给出您的关注点。我已经编写了一个自定义表单,带有覆盖WndProc,并在闪烁时输出m.Msg。有127个和134个。所以我不知道你的代码出了什么问题。我在wnd proc中处理了这三个部分,我发现主要的问题是因为以下代码。这就是我提供这些代码的原因。操作系统通过发送多个WM_NCACTIVATE消息,来回翻转WParam来闪烁窗口。你没有使用它。谢谢你,汉斯·帕桑,如果可能的话,请你给我代码好吗?嗨,汉斯·帕桑,我已经按照你说的做了尝试,但它没有闪烁。我可以从你那里得到小代码,以及闪烁没有发生的原因吗。。。