【问题标题】:Winforms remove control box items when mdi child is maximimazed当 mdi child 最大化时,Winforms 删除控制框项目
【发布时间】:2019-08-02 10:05:35
【问题描述】:

我的应用程序有 MenuStripToolStripisMdiContainer=true 的父表单。

我的Menu stripchild form menu strip items 合并。

当我打开子表单时,子表单中的控制框项目被显示出来。 在父Menu Strip 中显示子图标并显示控件。

我隐藏了所有,但在开始时再次显示。

我将 ControlBox、MinimizeBox、MaximizeBox、ShowIcon 设置为 false,FormBorderStyle 设置为 none。

 private void partneriToolStripMenuItem_Click(object sender, EventArgs e)
 {
      ChildForm newMDIChild = new ChildForm();

      newMDIChild.Show();

      newMDIChild.MdiParent = this;
      newMDIChild.tsChilds.Visible = false;
      newMDIChild.WindowState = FormWindowState.Maximized;
      newMDIChild.FormBorderStyle = FormBorderStyle.None;
      newMDIChild.ControlBox = false;
      newMDIChild.MinimizeBox = false;
      newMDIChild.MaximizeBox = false;
      newMDIChild.ShowIcon = false;

 } 

我不希望任何人完成我的工作,我只是想要解决方案。

【问题讨论】:

  • 您对在没有窗口控件的情况下使用 MDI 有什么期望?您是否有任何理由要这样做,而不仅仅是将非顶级窗口添加到父级容器中?你希望它如何表现?
  • @RezaAghaei 此链接包含我不尝试的东西?

标签: c# .net winforms


【解决方案1】:

当您最大化 MDI-Parent 上的 MDI-Childform 并将 MenuStrip 设置为父级的 MainMenuStrip Property 时,四个项目将添加到 MainMenuStrip。

  1. “系统菜单”
  2. “恢复按钮”
  3. “最小化按钮”
  4. “关闭按钮”

第一个是System.Windows.Forms.MdiControlStrip+SystemMenuItem 类型,其余三个是System.Windows.Forms.MdiControlStrip+ControlBoxMenuItem 类型。您可以通过订阅菜单的ItemAdded Event 来观察这一点。您还可以使用此事件将这些项目的 Visible 属性设置为 false。这些项目类型没有公开暴露,因此必须使用反射来获取类型信息。

以下示例代码通过能够切换项目的可见性的附加功能对此进行了演示。

using System;
using System.Drawing;
using System.Reflection;
using System.Windows.Forms;

namespace WindowsFormsApp4
{
    public partial class MdiParent : Form
    {
        private int childIndex;
        private Type MdiControlStrip_SystemMenuItem;
        private Type MdiControlStrip_ControlBoxMenuItem;
        private bool mdiChildControlBoxEnabled = true;

        public MdiParent()
        {
            InitializeControls();
            Assembly asm = this.GetType().BaseType.Assembly;
            MdiControlStrip_SystemMenuItem = asm.GetType("System.Windows.Forms.MdiControlStrip+SystemMenuItem");
            MdiControlStrip_ControlBoxMenuItem = asm.GetType("System.Windows.Forms.MdiControlStrip+ControlBoxMenuItem");
        }

        private void InitializeControls()
        {
            SuspendLayout();
            Size = new Size(800, 400);
            Text = "MDI Parent";
            IsMdiContainer = true;
            MenuStrip menu = new MenuStrip { Dock = DockStyle.Top };
            ToolStripMenuItem addChild = new ToolStripMenuItem { Text = "Add Child", AutoSize = true };
            addChild.Click += (s, e) => { AddChildForm(); };
            menu.Items.Add(addChild);

            ToolStripMenuItem restoreChild = new ToolStripMenuItem { Text = "restore ActiveMdiChild", AutoSize = true };
            restoreChild.Click += (s, e) => { if (ActiveMdiChild != null) ActiveMdiChild.WindowState = FormWindowState.Normal; };
            menu.Items.Add(restoreChild);

            ToolStripMenuItem showChildControlBox = new ToolStripMenuItem { Text = "Show Child ControlBox - " + mdiChildControlBoxEnabled.ToString(), AutoSize = true };
            showChildControlBox.Click += (s,e) => {
                mdiChildControlBoxEnabled = !mdiChildControlBoxEnabled;
                showChildControlBox.Text = "Show Child ControlBox - " + mdiChildControlBoxEnabled.ToString();
                SetMDIMenuItemVisiblity(mdiChildControlBoxEnabled);
            };
            menu.Items.Add(showChildControlBox);

            Controls.Add(menu);
            MainMenuStrip = menu;
            MainMenuStrip.ItemAdded += MainMenuStrip_ItemAdded;
            ResumeLayout(true);
        }

        private void MainMenuStrip_ItemAdded(object sender, ToolStripItemEventArgs e)
        {
            if (!mdiChildControlBoxEnabled)
            {
                Type itemType = e.Item.GetType();
                if (itemType == MdiControlStrip_SystemMenuItem || itemType == MdiControlStrip_ControlBoxMenuItem)
                {
                    e.Item.Visible = false;
                }
            }
        }

        private void SetMDIMenuItemVisiblity(bool visible)
        {
            foreach (ToolStripMenuItem item in MainMenuStrip.Items)
            {
                Type itemType = item.GetType();
                if (itemType == MdiControlStrip_SystemMenuItem || itemType == MdiControlStrip_ControlBoxMenuItem)
                {
                    item.Visible = visible;
                }
            }
        }

        private void AddChildForm()
        {
            childIndex += 1;
            ChildForm cf = new ChildForm();
            cf.Text += childIndex.ToString();
            cf.MdiParent = this;
            cf.Show();
        }

        private class ChildForm : Form
        {
            public ChildForm()
            {
                SuspendLayout();
                Size = new Size(300, 200);
                Text = "MDI Child #";
                BackColor = Color.Bisque;
                MenuStrip menu = new MenuStrip { Dock = DockStyle.Top };
                ToolStripMenuItem someItem = new ToolStripMenuItem { Text = "Child Menu Item", AutoSize = true };
                menu.Items.Add(someItem);
                menu.Visible = false;
                Controls.Add(menu);

                ResumeLayout(true);
            }
        }
    }
}

【讨论】:

    【解决方案2】:

    MDI 不支持修改窗口镶边,因此您不能真正做到这一点。您将需要手动处理相应的窗口消息(加载工作),或者伪造整个“窗口”的东西(例如,使用向其添加控件而不是 MDI 的面板)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-06
      • 2011-11-26
      • 1970-01-01
      • 2013-02-24
      相关资源
      最近更新 更多