C# WinForm MDI闪屏问题解决方案
2021/10/22 11:09:44
本文主要是介绍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++]); } } }
这篇关于C# WinForm MDI闪屏问题解决方案的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2022-03-01沐雪多租宝商城源码从.NetCore3.1升级到.Net6的步骤
- 2024-05-08首个适配Visual Studio平台的国产智能编程助手CodeGeeX正式上线!C#程序员必备效率神器!
- 2024-03-30C#设计模式之十六迭代器模式(Iterator Pattern)【行为型】
- 2024-03-29c# datetime tryparse
- 2024-02-21list find index c#
- 2024-01-24convert toint32 c#
- 2024-01-24Advanced .Net Debugging 1:你必须知道的调试工具
- 2024-01-24.NET集成IdGenerator生成分布式全局唯一ID
- 2024-01-23用CI/CD工具Vela部署Elasticsearch + C# 如何使用
- 2024-01-23.NET开源的简单、快速、强大的前后端分离后台权限管理系统