300 likes | 478 Views
MDI 窗体及菜单控件. 《.Net 三层应用结构开发 》 第十一章. 目标. 了解 MDI 应用程序和 SDI 应用程序 了解菜单和掌握菜单控件的使用 了解为什么需要窗体传值 掌握窗体间如何传值 了解单例窗体的概念 掌握代码编写单例窗体 ContextMenuStrip 控件编程 演示应用程序示例. 单文档和多文档 2-1. 这是 Ann 的一个测试. 如已有一个文本文件打开,在同一记事本应用程序中,不允许创建第二个文本文件. 新建一个记事本实例来打开第二个文本文件. 在 SDI 应用程序中一次只能打开一个文件. 单文档和多文档 2-2.
E N D
MDI窗体及菜单控件 《.Net三层应用结构开发》第十一章
目标 • 了解 MDI 应用程序和 SDI 应用程序 • 了解菜单和掌握菜单控件的使用 • 了解为什么需要窗体传值 • 掌握窗体间如何传值 • 了解单例窗体的概念 • 掌握代码编写单例窗体 • ContextMenuStrip控件编程 • 演示应用程序示例
单文档和多文档 2-1 这是 Ann 的一个测试 如已有一个文本文件打开,在同一记事本应用程序中,不允许创建第二个文本文件 新建一个记事本实例来打开第二个文本文件 在SDI应用程序中一次只能打开一个文件
单文档和多文档 2-2 应用程序窗口 在 MDI 应用程序中可以同时打开多个文件 文档窗口
主窗体和子窗体 3-2 主窗体的特点: • 启动一个 MDI 应用程序时,首先显示父窗体 • 它是应用程序中所有其他窗口的容器 • 每个应用程序界面都只能有一个 MDI 父窗体 • 在任何指定的时间都可以打开多个子窗体 • 任何 MDI 子窗体都不能移出 MDI 框架区域 • 关闭 MDI 父窗体则自动关闭所有打开的 MDI 子窗体
创建 MDI 窗体 创建 MDI 窗体步骤: • 将 IsMdiContainer属性设置为 True • 选择“项目”“添加 Windows 窗体” • 添加给定的代码,将 TestForm设置为子窗体 TestForm objChild = new TestForm(); objChild.MdiParent = this; objChild.Show();
主窗体和子窗体 3-3 MDI 应用程序的属性、方法和事件
主窗体和子窗体 3-3 MDI 应用程序的属性、方法和事件 如果窗体为 MDI 父窗体,则在触发 MDI 父窗体的 Closing 事件之前,将触发所有 MDI 子窗体的 Closing 事件。另外,在触发 MDI 父窗体的 Closed 事件之前,将触发所有 MDI 子窗体的 Closed 事件
主窗体和子窗体 3-3 Closing 事件的调用顺序: MDI 子窗体 MDI 父窗体
激活和去激活窗口 显示活动窗口 激活窗口 活动窗口 this.ActivateMdiChild(frmChild); 显示活动窗口的名称 MessageBox.Show(Convert.ToString(this.ActiveMdiChild));
排列子窗口 MDILayout枚举的成员
菜单和菜单组件 菜单是程序中显示一个选项列表的图形元素 菜单提供了将命令分组的一致方法 用户易于访问 支持使用访问键启用键盘快捷方式 一个菜单可以带有若干子菜单
菜单类型 3-1 上下文菜单 在设计阶段将 MainMenu组件添加到窗体上 Menu 类位于 System.Windows.Forms命名空间 MainMenu控件包含多个 MenuItem 控件
主要属性 Items集合
代码添加 //菜单项 ToolStripMenuItem toolstrip=new ToolStripMenuItem("菜单一"); //添加到菜单 this.menuStrip1.Items.Add(toolstrip); //添加子项 toolstrip.DropDownItems.Add("子菜单");
双向传值 • 解决方案:使用静态变量 这个最简单,只要把变量描述成static就可以了,在Form2中直接引用Form1的变量,代码如下: 在Form1中定义一个static变量public static int i = 9 ; Form2中取得Form1的i值如下: Form1.i.ToString(); 假如Form1取得Form2值,则在Form2中定义public static变量,Form2.变量取得Form2变量值
窗体一传值给窗体二 • 解决方案:用构造函数 Form1创建Form2,同时传值: Form2 temp = new Form2( 9 ); temp.Show(); Form2 的构造函数这样写: public Form2( int i ) { InitializeComponent(); textBox1.Text = i.ToString(); }
窗体二传值给窗体一 • 解决方案:利用委托 Form2中先定义一个delegate public delegate void returnvalue( int i ); public returnvalue ReturnValue; Form2 中的button按钮代码如下: private void button1_Click(object sender, System.EventArgs e) { if ( ReturnValue != null ) ReturnValue( 8 ); //触发事件,传递8 }
窗体二传值给窗体一 • 解决方案:利用委托 Form2 temp = new Form2( ); temp.ReturnValue = new temp.Form2.returnvalue( showvalue ); temp.Show(); private void showvalue( int i ) { textBox1.Text = i.ToString(); } 点击form2的button,form1中的textbox中的值就会相应变化。
单例窗体 • 场景:用户登录窗体,除了在第一次登录时要用到,在每次切换用户时都要用到 • 普通窗体:每一次都要构造新的窗体实例,占用较多资源 • 单例窗体:确保系统中只能有一个此窗体的实例,每次都使用相同的窗体实例 • 作用: • 控制资源的使用
单例窗体代码(一) static SingletonForm login=null; publicstatic SingletonForm CreateForm() { if (login==null) login = new SingletonForm (); return login; } //私有构造函数,避免客户随意创建新的窗体实例 //客户只能通过CreateForm得到同一个窗体实例 private SingletonForm() { InitializeComponent(); }
单例窗体代码(二) //窗体关闭时释放资源 private void SingletonForm_Closing(object sender, System.ComponentModel.CancelEventArgs e) { login = null; } • 调用单例窗体 SingletonForm f = SingletonForm.CreateForm(); f.Show();
显示另一窗体 • 非模态窗体:允许用户在当前程序中切换到其他窗口 [被调用的窗体类] [窗体实例] = new [被调用的窗体类](); [窗体实例].Show(); private void cmdShow_Click(object sender, System.EventArgs e) { frmA A = new frmA(); A.Show(); }
显示另一窗体 • 模态窗体:用户不能在各个窗口间切换 [被调用的窗体类] [窗体实例] = new [被调用的窗体类](); [窗体实例].ShowDialog(); private void cmdShow_Click(object sender, System.EventArgs e) { frmA A = new frmA(); A.ShowDialog(); }
控件进阶——快捷菜单控件 • ContextMenuStrip :快捷菜单控件 • 为控件指定快捷菜单:ContextMenuStrip 属性 显示与控件关联的菜单
ContextMenuStrip属性和方法 • ContextMenuStrip 控件的主要属性和方法
总结 • 窗体传值有三种方式:静态变量、构造函数、委托 • 单例窗体:能且只能创建一个实例的窗体 • 单文档界面的某一时刻只能打开一个文档,多文档界面允许同时打开多个文档 • MDI应用程序由一个MDI父窗体和一个或多个子窗体构成 • 菜单是程序中显示一个选项列表的图型元素,它提供将命令分组的方法和用户对其访问的简单途径 • 上下文菜单用于使用户通过单击鼠标右键访问常用的命令