惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

WordPress大学
WordPress大学
大猫的无限游戏
大猫的无限游戏
B
Blog
阮一峰的网络日志
阮一峰的网络日志
IT之家
IT之家
Hugging Face - Blog
Hugging Face - Blog
博客园 - 【当耐特】
Jina AI
Jina AI
博客园 - 聂微东
T
The Blog of Author Tim Ferriss
宝玉的分享
宝玉的分享
L
LangChain Blog
M
MIT News - Artificial intelligence
Blog — PlanetScale
Blog — PlanetScale
腾讯CDC
酷 壳 – CoolShell
酷 壳 – CoolShell
Y
Y Combinator Blog
F
Fortinet All Blogs
H
Help Net Security
B
Blog RSS Feed
J
Java Code Geeks
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Apple Machine Learning Research
Apple Machine Learning Research
S
SegmentFault 最新的问题

博客园 - 青弦

WinForm打印之页边距 [转载]交换的概念和原理 [转载]交换机概述 [转载]笑傲江湖之三层交换篇 [转载]Window.Open()网页弹出窗口大全 [转载]详解HTML中的META标签 [转载]网页滚动条特效 VS2005中TableAdapter中实现动态查询并使用LIKE的方法整理 [转载]如何在MDI中使子窗体只保留一个实例(反射方法) 第一次认真画用例图,错误很多,请大家来指点 代码段,你用了吗? DIV的水平、垂直居中的最佳实现 Excel数字、文本混合列导入SQL Server出现的问题&解决办法 SQL Server 2000导入数据时遇到的问题 不逐流俗,独辟蹊径——另类又好用的软件推荐[不断更新……] Winform中全屏显示问题 [资源]在线工具测试网页载入速度 博客园blog模板CSS自定义美化 达摩克利斯之刃——.NET破解技术初探
去除MDI子窗体最大化后在MainMenuStrip上自动产生的最大化等按钮
青弦 · 2008-08-20 · via 博客园 - 青弦

场景描述:

  • 程序有一个MDI父窗体frmMain,内含一个MenuStrip控件mnMain
  • MDI子窗体名为frmTransfer
  • mnMain包含菜单项“运单管理”及其子菜单项“调件运单”

当点击“购件运单”菜单项时,要求自动以最大化的方式显示子窗体frmTransfer

编写代码如下: 

private void miShowTransfer_Click(object sender, EventArgs e)
{
    frmTransfer ft 
= new frmTransfer();
    ft.MdiParent 
= this;
    ft.WindowState 
= FormWindowState.Maximized;
    ft.Show();
}

运行后如下图: 

  

我们发现在菜单mnMain被自动添加了一个图标(最左侧)和三个窗体控制按钮(最右铡):最小化按钮,还原(最大化)按钮,关闭按钮。而这不是我们想要的,我们更希望它与我们常用的Windows软件保持一致的风格,另外最好能像Word那样只有一个“关闭”按钮。

ps:如果你不是一开始就让子窗体最大化而是手动最大化,那么这些自动的行为可能会让你更不舒服,因为菜单看起来在“动”,至少这让我感到混乱。

那么至少要除去左侧的图标(实际上是对应的System菜单),如果可能再去掉“最小化”和“还原”按钮。

思路A:首先想到的是对子窗体进行设计时设置,将ControlBox属性设置为False。可这样一来连“关闭”按钮也没了,还要在主菜单右侧自己添加一个ToolStripMenuItem,并判断当前活动窗口来实现关闭功能。虽然应该可行,但感觉有点剑走偏锋的意味。更何况别忘了还要控制这个人造“关闭”按钮的显隐逻辑:一开始没有子窗体时不能让它显示出来,打开子窗体后则要让它显示;而关闭子窗体后还要判断是不是最后一个子窗体,如果是要让它隐藏——这实在有点小麻烦,我是懒人,所以放弃了这个思路。

思路B:那么设置子窗体的MaximizedBox,MinimizeBox属性为False,ShowIcon属性也设为False呢?很遗憾,这在子窗体没有最大化时表现很好,可是一旦最大化后依然如上边图片所显示的那样。同样,将FormBorderStyle属性设为FixToolWindow也是如此,在最大化后一样糟糕。

思路C:既然是被自动添加的,那么我就在你添加的时候阻止你。

那么问题来了,什么时候是恰当的时候呢?

窗体的ResizeBegin事件在上述代码的情况下肯定不会被触发;而事实证明SizeChanged事件虽然会被触发,但此时那些“杂碎”还没有被添加到MenuStrip。

硬攻不行,我们就退而求其次——不要忘了MenuStrip提供了ItemAdded事件,此事件在ToolStripMenuItem已添加到MenuStrip的项的集合时发生。经过实验证明当自动添加那些“杂碎”后此事件会被触发。

虽然有一点点晚,但好在只晚一点点,早了还不认识。

好了,先把它们揪出来,看看都是谁。在子窗体中添加一个按钮button1,为button1的Click事件编写如下代码:  

private void button1_Click(object sender, EventArgs e)
{
    ToolStripItemCollection mn 
= this.MdiParent.MainMenuStrip.Items;
    
string s = "";
    
foreach (ToolStripMenuItem mi in mn)
    
{
        
if (mi.Text != "")
        
{
            s 
+= mi.Text;
        }

        
else
        
{
            s 
+= "";
        }


        s 
+= "\n";
    }

    MessageBox.Show(s);
}

 运行结果如下图:

这下都暴露出来了吧!其中要注意的是System菜单项对应的Text属性是空的。

接下来就好办了,在主菜单的ItemAdded事件编写如下代码: 

private void mnMain_ItemAdded(object sender, ToolStripItemEventArgs e)
{
    
if (e.Item.Text.Length==0 || e.Item.Text=="还原(&R)" || e.Item.Text=="最小化(&N)")
    
{
        e.Item.Visible 
= false;
    }

}

最后运行结果:

可以看到完全达到了我们的预期目标,实现了类Word风格的子窗体。

收工!