编程语言
首页 > 编程语言> > C# WinForm MDI闪屏问题解决方案

C# WinForm MDI闪屏问题解决方案

作者:互联网

using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace MDIFlash
{
    public partial class FormMain : Form
    {
        Dictionary<int, Form> dicForm = new Dictionary<int, Form>();
        int FormCount = 0;

        public FormMain()
        {
            InitializeComponent();

            this.IsMdiContainer = true;
        }

        // 解决MDI闪屏

        // 方案1
        //protected override CreateParams CreateParams
        //{
        //    get
        //    {
        //        CreateParams cp = base.CreateParams;
        //        cp.ExStyle |= 0x02000000;
        //        return cp;
        //    }
        //}
        // =======

        // 方案2
        [System.Security.SuppressUnmanagedCodeSecurity]
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        public static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);
        public const int WM_MDINEXT = 0x224;

        public new void ActivateMdiChild(Form childToActivate)
        {
            if (this.ActiveMdiChild != childToActivate)
            {
                MdiClient mdiClient = GetCurrentMdiControl();
                if (mdiClient == null)
                {
                    return;
                }
                int count = this.MdiChildren.Length;
                Control form;  // next or previous MDIChild form
                int pos = mdiClient.Controls.IndexOf(childToActivate);
                if (pos < 0)
                    throw new InvalidOperationException("MDIChild form not found");
                if (pos == 0 && count > 1)
                    form = mdiClient.Controls[1];  // get next and activate previous
                else
                    form = mdiClient.Controls[pos - 1];  // get previous and activate next


                // flag indicating whether to activate previous or next MDIChild
                IntPtr direction = new IntPtr(pos == 0 ? 1 : 0);

                // bada bing, bada boom
                SendMessage(mdiClient.Handle, WM_MDINEXT, form.Handle, direction);
            }
        }

        public MdiClient GetCurrentMdiControl()
        {
            foreach (var c in this.Controls)
            {
                if (c is MdiClient)
                {
                    return c as MdiClient;
                }
            }
            return null;
        }
        // =======

        private void button1_Click(object sender, EventArgs e)
        {
            Form1 frmTemp = new Form1();
            frmTemp.MdiParent = this;
            frmTemp.Text = "窗体0" + (FormCount++).ToString();
            frmTemp.Dock = DockStyle.Fill;
            frmTemp.SetLabel(frmTemp.Text); 
            dicForm.Add(FormCount, frmTemp);
            frmTemp.Show();
        }  

        int showIndex = 1;

        private void button2_Click(object sender, EventArgs e)
        { 
            if (showIndex > dicForm.Count) return;

            // 方案1使用
            //dicForm[showIndex].Show();
            //dicForm[showIndex].BringToFront(); showIndex++;

            // 方案2使用
            ActivateMdiChild(dicForm[showIndex++]);
        }
    }
}

  

标签:IntPtr,MDI,form,C#,mdiClient,闪屏,frmTemp,public,showIndex
来源: https://www.cnblogs.com/chen1880/p/15437755.html