去除MDI子窗体最大化后在MainMenuStrip上自动产生的图标和最大化、最小化等按钮(转)
2010-06-02 18:04
597 查看
场景描述:
程序有一个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风格的子窗体。
收工!
转自:/article/7082040.html
程序有一个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风格的子窗体。
收工!
转自:/article/7082040.html
相关文章推荐
- 去除MDI子窗体最大化后在MainMenuStrip上自动产生的图标和最大化、最小化等按钮
- 去除MDI子窗体最大化后在MainMenuStrip上自动产生的图标和最大化、最小化等按钮(转)
- 去除MDI子窗体最大化后在MainMenuStrip上自动产生的最大化等按钮
- 去除MDI子窗体最大化时的默认图标
- 解决winform中mdi子窗体加载时显示最大化最小化按钮的方法
- 设计一个如下图所示窗体:该窗体自动位于屏幕中央;大小不可调;最小化、最大化按钮不可用;窗体标题为“烟台大学”。在该窗体上,放置一个按钮、一个标签。单击按钮时,在标签上显示当前系统时间。
- 去掉窗体上的最大化、最小化图标
- WPF窗体去掉最大化,最小化按钮。
- [Winfrom] 捕获窗体最大化、最小化和关闭按钮的事件
- winform窗体的最大化最小化按钮不显示
- C# Winform实现捕获窗体最小化、最大化、关闭按钮事件的方法
- c#捕获窗体的最大化最小化按钮的事件
- winform 窗体关闭按钮禁用、不显示最大化、最小化、关闭按钮 分类: WinForm 2014-12-22 16:09 82人阅读 评论(0) 收藏
- SilverLight程序之:SilverLight桌面程序的窗体调整及最大化、最小化和关闭按钮
- 怎么屏蔽鼠标所有左键消息在标题栏上(鼠标双击/单击系统图标,双击标题栏,最小化,最大化,关闭按钮)
- swing 自定义最小化按钮后,实现点击任务栏图标,使窗体重新显示
- VC# 2005中MDI子窗体最大化图标显示问题
- delphi窗体去掉最大化,最小化,关闭按钮
- C#窗体的最大化、最小化按钮事件
- WPF中让窗体不显示最大化,最小化,关闭按钮