【问题标题】:How to make the child form flickers?如何让子窗体闪烁?
【发布时间】:2019-02-06 07:18:52
【问题描述】:

我正在开发一个自定义表单,它提供了更多选项来自定义表单的外观。我在父表单中有一个按钮,通过单击该按钮,我通过以下代码显示了另一个表单。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {

        CustomForm form = new CustomForm();
        form.ShowDialog();
    }
}

我通过以下代码处理了 On_Wm_NcActivate。我认为我没有正确处理 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);
    }
}

我通过以下代码处理了 On_Wm_NcPaint 来自定义覆盖表单的标题栏和边框和背景。

private void On_Wm_NcPaint(ref Message m)
        {
            var rect = new NativePaint.RECT();
            NativeMethods.GetWindowRect(m.HWnd, ref rect);
            var deviceContext = NativeMethods.GetWindowDC(m.HWnd);
            if (deviceContext != IntPtr.Zero)
            {
                var bufferDeviceContext = NativeMethods.CreateCompatibleDC(deviceContext);
                if (bufferDeviceContext != IntPtr.Zero)
                {
                    IntPtr bmp = NativeMethods.CreateCompatibleBitmap(deviceContext, rect.Width, rect.Height);

                    if (bmp != IntPtr.Zero)
                    {
                        if (style == null)
                        {
                            return;
                        }

                        int borderThickness = 1;
                        var oldBmp = NativeMethods.SelectObject(bufferDeviceContext, bmp);
                        using (Graphics graphics = Graphics.FromHdc(bufferDeviceContext))
                        {
                            //To clip the client area from painting based on the border thickness and title bar height.
                            var top = GetCaptionBarHeight() + (int)borderThickness + 5;
                            var left = (int)borderThickness;
                            var right = rect.Width - (int)borderThickness;
                            var bottom = rect.Height - (int)borderThickness;
                            if (FormBorderStyle != FormBorderStyle.None)
                                DrawFrame(graphics, rect);

                            if (FormBorderStyle == FormBorderStyle.None)
                            {
                                top = 0;
                                left = 0;
                                right = Width;
                                bottom = Height;
                            }

                            //Clip the client region from the window rectangle.
                            if (this.WindowState != FormWindowState.Minimized)
                                NativeMethods.ExcludeClipRect(deviceContext, left + 1, top, right - 1, bottom - 1);

                            NativeMethods.BitBlt(deviceContext, 0, 0, rect.Width, rect.Height, bufferDeviceContext, 0, 0, WindowMessages.SRCCOPY);
                            NativeMethods.SelectObject(bufferDeviceContext, oldBmp);
                            NativeMethods.DeleteObject(bmp);
                            NativeMethods.DeleteObject(oldBmp);
                            NativeMethods.DeleteDC(deviceContext);
                            NativeMethods.DeleteObject(bufferDeviceContext);
                        }
                    }
                }
            }
        }

问题是当我点击父窗体时,子窗体不闪烁。 我不知道如何解决这个问题。谁能给出这个问题的解决方案。

注意:任务栏图标闪烁,但自定义表单不闪烁

【问题讨论】:

  • 嗨 Reza Aghaei,我想我按照你说的做了更正,我发现我没有正确处理 On_Wm_NcActivate。我想我在处理时遗漏了一些东西。
  • 这是一个很奇怪的问题。为什么要为方法使用 MFC 消息映射名称?您是在转换一个旧项目吗?您不能只使用FlashWindowEx 来制作您的表单flash 吗? flicker 就是这个意思吗?
  • 实际上我已经通过覆盖 wndproc(ref message m) 来处理消息,我只是通过覆盖 wndproc() 方法来自定义 msdn 表单。对不起,我不知道 FlashWindowEx。虽然我们使用showdailog() 显示表单,如果您用鼠标单击表单的父窗口,则子表单将不允许并且子表单闪烁。我希望闪烁...
  • 请注意 OP 已为 WM_NCPAINT 编写了消息处理程序,但拒绝共享该代码。他犯的最明显的错误是他画的东西不是基于窗口是否被激活,所以总是以相同的颜色显示。

标签: c# winforms


【解决方案1】:

我没有说清楚,

但是你可以使用MDI(多文档界面)来做主子表单

【讨论】:

  • 嗨 Elango S,实际上问题是我通过 CustomForm.ShowDailog() 显示了我的自定义表单。单击父表单时,我的自定义表单应该闪烁......但我的自定义表单没有闪烁。在Mdsn表单中出现闪烁。它不是mdiform。我已经编辑了代码,请参考示例代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-10
  • 2012-08-20
  • 1970-01-01
  • 2011-11-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多