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++]); } } }