600 likes | 925 Views
第十章 WinForm 高级编程. 技能目标. 了解 MDI 应用程序和 SDI 应用程序 了解菜单和掌握菜单控件的使用 掌握 ImageList 控件 掌握 ToolBar 控件和 StatusBar 控件 掌握 Timer 控件 掌握 TreeView 控件 掌握 ListView 控件 了解用于打印的各种类 了解 WinForms 中的打印过程. 单文档和多文档 2-1. 这是 Ann 的一个测试. 如已有一个文本文件打开,在同一记事本应用程序中,不允许创建第二个文本文件. 新建一个记事本实例来打开第二个文本文件.
E N D
技能目标 • 了解 MDI 应用程序和 SDI 应用程序 • 了解菜单和掌握菜单控件的使用 • 掌握 ImageList 控件 • 掌握 ToolBar 控件和 StatusBar 控件 • 掌握Timer 控件 • 掌握 TreeView 控件 • 掌握 ListView 控件 • 了解用于打印的各种类 • 了解WinForms 中的打印过程
单文档和多文档 2-1 这是 Ann 的一个测试 如已有一个文本文件打开,在同一记事本应用程序中,不允许创建第二个文本文件 新建一个记事本实例来打开第二个文本文件 在SDI应用程序中一次只能打开一个文件
单文档和多文档 2-2 应用程序窗口 在 MDI 应用程序中可以同时打开多个文件 文档窗口
主窗体和子窗体 3-1 父窗体 子窗体 子窗体的菜单并入父窗体中
主窗体和子窗体 3-2 主窗体的特点: • 启动一个 MDI 应用程序时,首先显示父窗体 • 它是应用程序中所有其他窗口的容器 • 每个应用程序界面都只能有一个 MDI 父窗体 • 在任何指定的时间都可以打开多个子窗体 • 任何 MDI 子窗体都不能移出 MDI 框架区域 • 关闭 MDI 父窗体则自动关闭所有打开的 MDI 子窗体
主窗体和子窗体 3-3 MDI 应用程序的属性、方法和事件 如果窗体为 MDI 父窗体,则在触发 MDI 父窗体的 Closing 事件之前,将触发所有 MDI 子窗体的 Closing 事件。另外,在触发 MDI 父窗体的 Closed 事件之前,将触发所有 MDI 子窗体的 Closed 事件
创建 MDI 窗体 创建 MDI 窗体步骤: • 将 IsMdiContainer 属性设置为 True Closing 事件的调用顺序: • 选择“项目”“添加 Windows 窗体” • 添加给定的代码,将 TestForm 设置为子窗体 TestForm objChild = new TestForm(); objChild.MdiParent = this; objChild.Show(); MDI 子窗体 MDI 父窗体
激活和去激活窗口 显示活动窗口 激活窗口 活动窗口 this.ActivateMdiChild(frmChild); 显示活动窗口的名称 MessageBox.Show(Convert.ToString(this.ActiveMdiChild));
排列子窗口 MDILayout 枚举的成员
菜单和菜单组件 菜单是程序中显示一个选项列表的图形元素 菜单提供了将命令分组的一致方法 用户易于访问 一个菜单可以带有若干子菜单 支持使用访问键启用键盘快捷方式
菜单类型 3-1 MainMenu的属性和方法 上下文菜单 在设计阶段将 MainMenu 组件添加到窗体上 Menu 类位于 System.Windows.Forms 命名空间 MainMenu 控件包含多个 MenuItem 控件
菜单类型 3-2 MenuItem 的属性、方法和事件
菜单类型 3-3 MainMenu mnuMainMenu1 = new MainMenu(); this.Menu = mnuMainMenu1; mnuMainMenu1.MenuItems.Add ("文件") 标准前缀 创建一个菜单项,并将它添加到主菜单上 创建 MenuItem 的实例 MenuItem mnuFileOpen; mnuFileOpen = new MenuItem("打开"); this.mnuMainMenu1.MenuItems.Add(mnuFileOpen);
菜单类型 3-4 ContextMenu 的属性、方法和事件 上下文菜单 快捷菜单:单击鼠标右键时显示的快捷菜单;菜单会因用户右键单击位置的不同而不同 在运行时创建上下文菜单: ContextMenu mnuContextMenu1 = new ContextMenu(); this.ContextMenu = mnuContextMenu1;
在运行时添加/移除菜单项 2-1 添加菜单项 MainMenu mnuMainMenu1 = new MainMenu(); MenuItemmnuAddItem = new MenuItem(); MenuItemmnuRemoveItem = new MenuItem(); mnuAddItem.Text = “添加(&A)"; mnuRemoveItem.Text = “移除(&R)"; mnuMainMenu1.MenuItems.Add(mnuAddItem); mnuMainMenu1.MenuItems.Add(mnuRemoveItem); this.Menu = mnuMainMenu1; DialogResult preference = new DialogResult(); preference = MessageBox.Show(“是否要添加新菜单项?”,“添加", MessageBoxButtons.YesNo); 添加键盘快捷方式助记符 添加菜单项
在运行时添加/移除菜单项 2-2 if(Convert.ToString(preference) == “是") { mnuMainMenu1.MenuItems.Add(“新菜单"); DialogResult preference1 = new DialogResult(); preference1 = MessageBox.Show(“是否要移除新菜单项?”, “移除",MessageBoxButtons.YesNo); if(Convert.ToString(preference1) == “是") { mnuMainMenu1.MenuItems.RemoveAt(2); } } 添加菜单项 移除第三个位置上的菜单项
ImageList 控件 位于 Systems.Windows.Forms 命名空间内 在 ImageList 控件中添加图像的代码 ImageList 控件的属性和方法 imgImageList1.Images.Add (Image.FromFile("picture.gif")); this.picMyPicture.Image = this.imgImageList1.Images[0]; Image 类的 FromFile() 方法用于手动将图像文件添加到 ImageList 控件中
ToolBar 控件 ToolBar 类的属性和事件 ToolBarButton 类的属性和事件 两个类 ToolBar ToolBarButton
工具栏 – 示例 添加了三个按钮 输出屏幕 • 创建名为 Example 1 的 Windows 应用程序。 • 将 Form1.cs 更改为 frmToolBarExample.cs。 • 将 ToolBar控件拖动到窗体上,并将它命名为 tbrToolBar。 • 选择 Buttons 属性,并单击按钮以显示“ToolBarButton集合编辑器”窗口。 • 添加三个按钮。 处理 ButtonClick 事件的代码 private void tbrToolBar_ButtonClick(object sender, System.Windows.Forms.ToolBarButtonClickEventArgs e) { if(e.Button == this.tbrToolBar.Buttons[0]) { MessageBox.Show(“已单击 “打开”按钮"); } }
StatusBar 控件 StatusBarPanel 类的属性 两个类 在状态栏 的第二个面板上显示当前日期的代码 StatusBar StatusBarPanel ……… sbrStatusBar1.Panels[1].Text=Convert.ToString(DateTime.Today); ………. StatusBar 类的属性
应用程序示例 4-1 由菜单、工具栏和状态栏组成的应用程序 • 创建名为 BookManagement的 Windows 应用程序。 • 将名称 Form1.cs 更改为 frmMdiApplication.cs。 • 将 Menu、StatusBar 、ToolBar和ImageList 控件拖动到窗体上。 演示:创建 Windows 应用程序示例的步骤
应用程序示例 4-2 设置窗体上控件的属性
应用程序示例 4-3 • 选择 ToolBar 控件,单击 ToolBar 控件的 Buttons 属性,此时会出现“ToolBarButton 集合编辑器”窗口,向其中添加3个按钮,并分别命名为 trbNewBooks 、trbBookSearch和trbExit。分别在Text属性处输入入库、查询和退出 单击“确定”以继续
应用程序示例 4-4 在 mnuEnginerrBook菜单项的 Click 事件中添加代码 将以下代码添加到 mnuConManage “菜单管理”的 Click 事件中 将以下代码添加到 frmMdiForm 的 Load 事件中 • 选择 StatusBar控件,并将 ShowPanels属性设置为 True • 选择 Panels 属性,并添加两个面板,命名为 sbrTimeBar和sbrNameBar private void frmMdiForm_Load(object sender, System.EventArgs e) { this.sbrBookStatus.Panels[0].Text = DateTime.Now.ToShortDateString(); } private void mnuConManage_Click(object sender, System.EventArgs e) { ContextMenu mnuContextMenu = new ContextMenu(); this.ContextMenu = mnuContextMenu; mnuContextMenu.MenuItems.Add("新书入库"); mnuContextMenu.MenuItems.Add("查询书目"); mnuContextMenu.MenuItems.Add("退出系统"); } private void mnuEnginerrBook_Click(object sender, System.EventArgs e) { frmNewBooks newBooks=new frmNewBooks(); newBooks.MdiParent=this; newBooks.WindowState=FormWindowState.Maximized; newBooks.Show(); this.sbrBookStatus.Panels[1].Text=this.ActiveMdiChild. Text.ToString(); } 单击“确定”以继续 创建新窗体,命名为frmNewBooks.cs,当鼠标单击“工程类图书”菜单选项时弹出此窗体
应用程序示例 4-5 将以下代码添加到 mnuExit 菜单项的 Click 事件中 将以下代码添加到 tbrBookBar工具栏按钮的 ButtonClick 事件中 private void tbrBookBar_ButtonClick(object sender, System.Windows.Forms.ToolBarButtonClickEventArgs e) { if(e.Button == this.tbrBookBar.Buttons[0]) { this.mnuEnginerrBook_Click(sender,e); } else if(e.Button == this.tbrBookBar.Buttons[1]) { MessageBox.Show("书籍查询系统正在建设中……"); } else if(e.Button==this.tbrBookBar.Buttons[2]) { this.mnuExit_Click(sender,e); } } private void mnuExit_Click(object sender, System.EventArgs e) { this.Close(); }
Timer 控件简介 3-1 03:15:04 在应用程序中显示实际时间 WinForms的Timer控件 按指定的时间长度显示图像 需要一种可在程序运行时操控时间的机制
Timer 控件简介 3-3 对特定的时刻响应 Timer 类包含在 System.Windows.Forms 命名空间中 按照某个周期触发事件 与用户无关,可以通过编程,在规定的时刻执行相应动作 组件与其他控件不同,它不向用户提供用户界面,因此没有必要显示在 WinForms 设计器的界面上
Timer 控件的必要性 Timer 控件为开发人员提供了一种在经过指定的时间间隔或到达指定的绝对时间时根据代码进行响应的方式
Timer 控件的属性、方法和事件 Timer 控件名的前缀是 "tmr“ 例如:tmrTicker, tmrTickTimer
Timer 控件应用程序示例 4-1 要求显示计算机运行的时间长度和应用程序运行的时间长度
Timer 控件应用程序示例 4-2 public class frmTickCounter : System.Windows.Forms.Form { private int compuTime; ………………….. 为窗体声明一个私有整型变量 private void frmTickCounter_Load(object sender, System.EventArgs e) { compuTime = Environment.TickCount; } frmTickCounter 窗体的 Load 事件
Timer 控件应用程序示例 4-3 private void tmrTickTimer_Tick(object sender, System.EventArgs e) { long curTickValue = Environment.TickCount; long difference = curTickValue - compuTime; long computerHours, computerMinutes, computerSeconds; long applicationHours, applicationMinutes, applicationSeconds; //将毫秒转换成小时、分钟和秒 computerHours = (curTickValue / (3600 * 999)) % 24; computerHours = (curTickValue / (3600 * 999)) % 24; computerMinutes = (curTickValue / (60 * 999)) % 60; computerSeconds = (curTickValue / 999) % 60; applicationHours = (difference / (3600 * 999)) % 24; applicationMinutes = (difference / (60 * 999)) % 60; applicationSeconds = (difference / 999) % 60; 应用程序中使用的局部变量 将毫秒转换成小时、分钟和秒
Timer 控件应用程序示例 4-4 显示每个标签的输出结果 • this.lblComputer.Text = String.Format(“这台计算机已经开机 {0} 小 • 时, {1}分钟 {2} 秒",computerHours.ToString(),computerMinutes. • ToString(),computerSeconds.ToString()); • this.lblApplication.Text = String.Format(“这个程序已经运行了 {0} 小 • 时, {1} 分钟 {2} 秒", applicationHours.ToString(), • applicationMinutes.ToString(),applicationSeconds.ToString()); • } private void btnClose_Click(object sender,System.EventArgs e) { this.Close(); } 关闭应用程序
ListView 控件 2-1 选择列出项目的视图类型 可折叠的 TreeView ListView
ListView 控件 2-2 创建与 Windows 资源管理器的右窗口相似的用户界面 可用于以特定样式或视图类型显示列表项 四种视图模式,即大图标、小图标、列表和详细资料
ListView 控件的属性和方法 ListView 控件名的前缀是 “lvw“ 如:lvwList, lvwListItems
Column 集合和 Column 对象 • ListView 控件的 Columns 属性表示控件中出现的所有列标题的集合 • 列标题是 ListView 控件中包含标题文本的一个项 • ColumnHeader 对象定义在控件的 View 属性设置为“Details”值时,作为 ListView 控件的一部分显示的那些列 • 如果 ListView 控件没有没有任何列标题,并且 View 属性设置为 Details,则 ListView 控件不显示任何项
添加列标题 • 方法一: • ColumnHeaderobjHeader=new ColumnHeader(); • objHeader.Text="姓名"; • objHeader.TextAlign=HorizontalAlignment.Center ; • objHeader.Width=100; • lvPerson.Columns.Add(objHeader); 方法二: lvPerson.Columns.Add ( "姓名" , 60 , HorizontalAlignment.Right ) ; 添加多个列应该 如何做?
项集合和项对象 • ListView 控件的 Items 属性表示包含控件中所有项的集合 • 该属性返回 ListView.ListViewItemCollection,可以用于 ListView 中添加新项、删除项或计算可用项数
添加记录 实例化一个ListViewItem 设置各列的数值 ListViewItem lstItem = new ListViewItem ( ) ; lstItem.SubItems.Clear ( ) ; lstItem.SubItems[0].Text = reader["name"].ToString ( ) ; //第0列 lstItem.SubItems.Add ( reader["HomePhone"].ToString ( ) ) ; //第1列 。。。。。 lstItem.SubItems.Add ( reader["Email"].ToString ( ) ) ; //第n列 lvPerson.Items.Add(lstItem) 将定义好的数值添加到ListView里面 添加多行数据怎么办?
TreeView 控件 2-2 用于以节点形式显示文本或数据,这些节点按层次结构顺序排列 在 TreeView 控件中,复选框和图标可以和文本一起显示 Windows 资源管理器中左窗格所包含的目录和文件是以树型视图样式排列的
节点集和节点对象 • TreeView 控件的 Nodes 属性表示为 TreeView 控件指定的树节点集 • 树节点集中的每个树节点对象可包括它本身的树节点集 • 树节点集中 Add()、Remove() 和 RemoveAt() 方法使开发人员可添加和移动集中的单个树节点
添加、修改和删除节点 3-1 • TreeView 控件以层次结构方式显示节点 • 在将新节点添加到现有 TreeView 时,重要的是注意新节点所添加到的父节点 • 可用设计器模式或用户界面在 TreeView 上添加或删除节点
添加、修改和删除节点 3-2 在窗体上选择已存在的 TreeView 控件或在窗体上添加一个新控件 要使用树节点编辑器删除节点,请重复步骤 1 和 2。调用树节点编辑器,然后选择要删除的节点,单击“删除” 在“属性”窗口中单击节点属性旁的省略号 (…) 按钮,调用树节点编辑器 添加到树的第一个节点是根节点, 其他节点可添加到存在根节点的树上 通过选择根节点或任何其他节点, 然后单击“添加子级”按钮,可为树添加子节点
添加、修改和删除节点 3-3 可通过编程方式向 TreeView 添加节点 ………… TreeNodechNode = new TreeNode("Text for new node"); tvwTree1.currNode.Nodes.Add (chNode); ………… 可通过编程方式从 TreeView 删除节点 …………. tvwTree1.Nodes.Remove(tvwTree1.currNode); // 清除所有节点 tvwTree1.Nodes.Clear(); …………… 如果没有选定要删除的节点,则会删除根节点
TreeView 控件的事件 TreeView 控件名的前缀是 "tvw" 如:tvwTree, tvwList
程序实例——需求 对TreeView的控制 显示节点的属性 列出文件夹的TreeView