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

时间:2019-02-01 04:42:06

标签: c# winforms wndproc

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

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

我已经处理了必需的窗口消息(WM_NCPAINTWM_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);
            }
       }

我不知道哪里出问题了,所以请给我建议

1 个答案:

答案 0 :(得分:0)

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