MDI窗体及涉及到的相关问题
MDI窗体是个什么东东尼?多文档窗体唠,相对的还有个SDI,就是单文档窗体。一般情况下我们会将软件的主窗体设置为MDI窗体。那么在主窗体的菜单部分调出来的其他窗体就是主窗体的子窗体了。
(1)在主窗体中如何调用一个子窗体尼?贴代码啦,这段代码当然是写在主窗体里面的按钮或者菜单事件里面,很简单唠
private void 比赛科目ToolStripMenuItem_Click(object sender, EventArgs e)
{
Form childForm = new Form();
childForm.MdiParent = this;
childForm.Text = "窗口 " ;
childForm.WindowState = FormWindowState.Maximized;//子窗体在父窗体中最大化
childForm.Show();
}
(2)子窗体的排序,如果我们系统新建一个MDI父窗体,其实里面有代码示例的,不过还是贴出来吧,子窗体的排列有层叠、水平平铺、垂直平铺等等
private void CascadeToolStripMenuItem_Click(object sender, EventArgs e)
{
LayoutMdi(MdiLayout.Cascade);//层叠
} private void TileVerticalToolStripMenuItem_Click(object sender, EventArgs e)
{
LayoutMdi(MdiLayout.TileVertical);//垂直平铺
} private void TileHorizontalToolStripMenuItem_Click(object sender, EventArgs e)
{
LayoutMdi(MdiLayout.TileHorizontal);//水平平铺
}
//关闭所有子窗体
private void CloseAllToolStripMenuItem_Click(object sender, EventArgs e)
{
foreach (Form childForm in MdiChildren)
{
childForm.Close();
}
}
(3)还涉及到一个问题,就是同一个子窗体不能重复打开吧,嗯,这需要解决一下,代码上
/// <summary>
/// 检查打开的MDI窗口,是否有打开,如有打开,激活即可,不做重复打开
/// </summary>
/// <param name="Frmname"></param>
private bool CheckFrm(Form cForm)
{
foreach (Form sonfrm in this.MdiChildren)
{
if (sonfrm.Name == cForm.Name)
{
return false;
}
}
return true;
} private void ShowNewForm(object sender, EventArgs e)
{
Form childForm = new Form();
childForm.Text = "窗口 ";
childForm.Name = "StudentForm";
if (CheckFrm(childForm))
{
childForm.MdiParent = this;
childForm.Show();
childForm.Activate();
}
else
{
childForm.Activate();
childForm.WindowState = FormWindowState.Normal; } }
// 对于非MDI窗体同样可以使用如下方法检测
private bool CheckOpen(Form cForm) {
foreach (Form frm in Application.OpenForms) //遍历已打开窗口
{
if (frm.Name == cForm.Name) //如果此窗口已打开
{
frm.Activate() ; //激活当前窗体
if(frm.WindowState==FormWindowState.Minimized) //如果当前窗体已经最小化
{
frm.WindowState=FormWindowState.Normal; //还原窗体
}
return true;
}
}
return false; }
本人采用的方法,感觉还不错
在MDI父窗口中放一个splitContainer1进去,将MDI子窗体的父组件设置成splitContainer1的一个panel,这种适合左侧有快捷菜单的。先上个图

这样可以将子窗体放到pannel2里面了。上代码
/// <summary>
/// 菜单运动员信息
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void 运动员信息ToolStripMenuItem_Click(object sender, EventArgs e)
{
ShowMemberInfoFrm();
} /// <summary>
/// 展示运动员信息管理窗口
/// </summary>
private void ShowMemberInfoFrm()
{
this.splitContainer1.Panel2.Controls.Clear();//这个地方直接把当前显示的子窗体干掉,然后显示新窗体
MemberInfoFrm frm = new MemberInfoFrm();
frm.MdiParent = this;
frm.Parent = splitContainer1.Panel2;
frm.Show();
frm.Dock = DockStyle.Fill;//这个很有用,就是子窗体全部充满整个右侧的pannel,并随着pannel的大小跟随变化
}
这里有一个问题,不管是MDI窗体还是本人采用的pannel,都可以采用窗体重复打开检测,即(3)中的方法进行检查,然后激活即可。但是试验证明激活不了,覆盖掉的窗体不会显示到最前面来,有朋友说用TopMost或TopLevel属性,本人试了,还是不行。如果朋友们有好的办法,请贴上代码,谢谢。
MDI窗体及涉及到的相关问题的更多相关文章
- 小菜学习Winform(四)MDI窗体(附示例)
前言 在做winfrom项目的时候我们可能会用到嵌套窗体,就是说一个容器中有多个窗体,可以分别管理和应用这些窗体,.net中提供了一种机制就是MDI,可能大家都会用,这边就简单的介绍下. 简单应用 w ...
- 机房收费系统之【只允许一个MDI窗体 错误:426】 标签: vb 2014-08-15 10:36 1149人阅读 评论(23)
机房收费系统的主窗体是MDI窗体,为了在这个窗体上添加控件,所以我们在窗体上添加了picture控件,在MDI窗体中,子窗体实际上位于MDIClient里,即子窗体的父窗体就是MDIClient,而放 ...
- MDI窗体容器--2016年12月15日
MDI窗体容器 多文档界面(Multiple-Document Interface)简称MDI窗体.MDI窗体用于同时显示多个文档,每个文档显示在各自的窗口中.MDI窗体中通常有包含子菜单的窗口菜单, ...
- Winform MDI窗体容器、权限、简单通讯
MDI窗体容器: 一般来说,窗体是顶级容器,不允许放在其他任何容器内,但是如果将某个窗体的IsMdiContainer属性设置为True,那此窗体就会成为窗体容器,可以在其中放入其他窗体 在内部的窗体 ...
- Winform MDI窗体容器,权限以及简单通讯
MDI窗体容器: 一般来说,窗体是顶级容器,不允许放在其他任何容器内,但是如果将某个窗体的IsMdiContainer属性设置为True,那此窗体就会成为窗体容器,可以在其中放入其他窗体 在内部的窗体 ...
- Winform MDI窗体容器 权限 简单通讯
MDI窗体容器 权限 using System; using System.Collections.Generic; using System.ComponentModel; using Syste ...
- MDI窗体容器、权限设置
一.MDI窗体容器: 1.功能: 它可以让其它窗体在它的内部打开,无法超出它的范围 将某个窗体的属性:IsMdiContainer设置为true - 窗口样式 2.问题: (1)如何将其它窗体在它的内 ...
- C# Winform学习---MDI窗体的设计,PictureBox控件(图片上一页下一页),Timer控件,MenuStrip控件
一.MDI窗体的设计 1.MDI简介 MDI(Multiple Document Interface)就是所谓的多文档界面,与此对应就有单文档界面 (SDI), 它是微软公司从Windows 2.0下 ...
- MDI窗体容器 权限设置
MDI窗体容器:它可以让其它窗体在它的内部打开,无法超出它的范围将某个窗体的属性:IsMdiContainer设置为true - 窗口样式如何将其它窗体在它的内部打开?窗体对象名.MdiParent ...
随机推荐
- Flask系列之源码分析(二)
应用技术点 python之__setattr__ python之threading.local python之偏函数 flask源码上下文管理 1.综述过程 将请求对象压入栈 1.请求进入 __cal ...
- RabittMQ实践(二): RabbitMQ 与spring、springmvc框架集成
一.RabbitMQ简介 1.1.rabbitMQ的优点(适用范围)1. 基于erlang语言开发具有高可用高并发的优点,适合集群服务器.2. 健壮.稳定.易用.跨平台.支持多种语言.文档齐全.3. ...
- VS2010/MFC编程入门之八(对话框:创建对话框类和添加控件变量)
前两讲中鸡啄米为大家讲解了如何创建对话框资源.创建好对话框资源后要做的就是生成对话框类了.鸡啄米再声明下,生成对话框类主要包括新建对话框类.添加控件变量和控件的消息处理函数等. 因为鸡啄米给大家的例程 ...
- Educational Codeforces Round 57 Solution
A. Find Divisible 签到. #include <bits/stdc++.h> using namespace std; int t, l, r; int main() { ...
- c++第十九天
p109~p110: C风格字符串 特点: 1.不方便,不安全,尽量不使用. 2.必须以 '\0'结束.(只有这样才能使用C风格字符串函数) 3.一般利用指针操作这些字符. 4.可以用字符串字面值来初 ...
- Linux的crontab
如果要让unix系统重复,定期做一件事,我们就会用到crontab. 实质上真正去执行每一个重复任务的是cron,cron是的unix家族的一个后台常驻程序,cron是由cron文件来驱动的,cron ...
- 【日志过滤】Nginx日志过滤 使用ngx_log_if不记录特定日志
ngx_log_if是Nginx的一个第三方模块.它在Github上的描述是这样介绍的:ngx_log_if是一个独立的模块,允许您控制不要写的访问日志,类似于Apache的"CustomL ...
- 使用属性动画 — Property Animation
属性动画,就是通过控制对象中的属性值产生的动画.属性动画是目前最高级的2D动画系统. 在API Level 11中添加.Property Animation号称能控制一切对象的动画,包括可见的和不可见 ...
- 用 Rprof 进行性能分析
R 提供了内置函数 Rprof( ) 对代码的性能进行分析.在分析过程中,会有一个抽样程序,并且是和后续代码一起运行的,直到分析结束.默认情况下,抽样程序基本上每隔20 毫秒就会记录一下当前 R 在运 ...
- bzoj 3730 震波 (动态点分治)
大意: 给定n节点树, 每个节点有权值, 边权全为1. 给定m个操作: 操作1: (0,x,k) 表示询问到节点x距离不超过k的节点权值和 操作2: (1,x,y) 表示将节点x的权值修改为y 对于所 ...