《第4章 菜单、工具栏和状态条(精品).ppt》由会员分享,可在线阅读,更多相关《第4章 菜单、工具栏和状态条(精品).ppt(39页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、 Windows程序设计程序设计(Visual C+版版)(Windows Programming Based on Visual C+)江苏大学计算机学院江苏大学计算机学院曹汉清曹汉清E_Mail:第四章第四章 菜单、工具栏和状态条菜单、工具栏和状态条内内 容容4.1菜单菜单4.2 工具栏工具栏4.3 状态栏状态栏一、通常的约定一、通常的约定4.1菜单菜单菜单设计的通俗约定:菜单设计的通俗约定:若选择菜单会弹出一对话框或窗口,若选择菜单会弹出一对话框或窗口,那么在该菜单项文本后应设计有那么在该菜单项文本后应设计有“”。若某项菜单有子菜单,那么在该菜若某项菜单有子菜单,那么在该菜单项文本后有单
2、项文本后有“”。若菜单项需要助记符,则用括号将若菜单项需要助记符,则用括号将带下划线的字母括起来。带下划线的字母括起来。若某项菜单有快捷键,则一般将其若某项菜单有快捷键,则一般将其列在相应菜单项文本之后。列在相应菜单项文本之后。若有图标,则在其文本左侧显示。若有图标,则在其文本左侧显示。二、菜单类和菜单事件二、菜单类和菜单事件(P153)4.1菜单菜单窗体的主菜单是使用窗体的主菜单是使用MenuStrip类来表示的,它从类来表示的,它从ToolStrip类派生。在新的类派生。在新的 Windows 窗体应用程序中可使用窗体应用程序中可使用 ToolStrip 及其及其相关的类来创建相关的类来创
3、建Strips界面(菜单、工具栏、状态栏等)。创建界面(菜单、工具栏、状态栏等)。创建的这些界面具有的这些界面具有 Windows XP、Office、Internet Explorer 或自定或自定义的外观和行为义的外观和行为。MenuStrip控件是窗体菜单结构的容器。操作时实际上是将控件是窗体菜单结构的容器。操作时实际上是将 ToolStripMenuItem 对象添加到表示菜单结构中各对象添加到表示菜单结构中各MenuStrip实实例中。每个例中。每个 ToolStripMenuItem 可以成为应用程序的命令或其他可以成为应用程序的命令或其他子菜单项的父菜单。子菜单项的父菜单。Men
4、uStrip 是是 ToolStripMenuItem、ToolStripComboBox、ToolStripSeparator 和和 ToolStripTextBox 等对象的容器。等对象的容器。一些菜单事件:一些菜单事件:(P153)三、用设计器编辑菜单三、用设计器编辑菜单使用菜单实例使用菜单实例(1)创建一个创建一个Windows窗体应用程序项目窗体应用程序项目Win_Menu。(2)将工具箱中的将工具箱中的MenuStrip组件拖放到窗体上,在窗体模组件拖放到窗体上,在窗体模版下将出现一个版下将出现一个menuStrip1图标,它是该窗体的一个主菜单。图标,它是该窗体的一个主菜单。(3
5、)在在“请在此处键入请在此处键入”框中输入框中输入“文件文件(&F)”,并在,并在“文文件件(&F)”菜单项的下方菜单项的下方“请在此处键入请在此处键入”框中输入框中输入“切换切换(&C)”,在该菜单项的属性窗口中,将快捷键属性,在该菜单项的属性窗口中,将快捷键属性ShortcutKeys选择为选择为Alt和和F2,即为,即为Alt+F2组合键。单击组合键。单击“切换切换(&C)”菜单项菜单项下的下的“请在此处键入请在此处键入”右边的箭头按钮,从中选择右边的箭头按钮,从中选择Separator,这将此处的菜单项变成一条水平分隔线。这将此处的菜单项变成一条水平分隔线。在水平分隔线下方添在水平分隔
6、线下方添加加“退出退出(&X)”。4.1菜单菜单(4)再将工具箱中的)再将工具箱中的MenuStrip组件拖放到窗体上,为窗体组件拖放到窗体上,为窗体添加第二个添加第二个menuStrip2主菜单。在主菜单。在“请在此处键入请在此处键入”框中输入框中输入“返回返回(&R)”,并将快捷键属性,并将快捷键属性ShortcutKeys选择为选择为F5,即为,即为F5功功能键。能键。(5)利用属性窗口分别为)利用属性窗口分别为“切换切换(&C)”、“退出退出(&X)”、“返回返回(&R)”菜单添加菜单添加Click事件,事件,函数名称分别为函数名称分别为On_Change、On_Exit和和On_Re
7、turn;为为Form1窗体添加窗体添加Load事事件。件。(6)各事件处理函数代码如下:)各事件处理函数代码如下:private:System:Void Form1_Load(System:Object sender,System:EventArgs e)this-menuStrip2-Visible=false;private:System:Void On_Change(System:Object sender,System:EventArgs e)this-menuStrip1-Visible=false;this-menuStrip2-Visible=true;private:Syst
8、em:Void On_Exit(System:Object sender,System:EventArgs e)Application:Exit();private:System:Void On_Return(System:Object sender,System:EventArgs e)this-menuStrip1-Visible=true;this-menuStrip2-Visible=false;(7)编译、连接、运行。编译、连接、运行。ToolStripItemCollection 类表示类表示 ToolStripItem 对象的集合对象的集合。从从ToolStrip派生类的很多属性
9、都与它有关,如派生类的很多属性都与它有关,如MenuStrip类的类的Items属性、属性、ToolStripMenuItem的的DropDownItems属性等都是属性等都是ToolStripItemCollection句柄类型,所以通过使用句柄类型,所以通过使用ToolStripItemCollection 的的Add、Remove 和和 RemoveAt 等方法很等方法很容易在集合中添加和移除单个控件。还可以使用容易在集合中添加和移除单个控件。还可以使用 AddRange 或或 Clear 方法在集合中添加或移除所有控件。方法在集合中添加或移除所有控件。四、菜单的编程控制四、菜单的编程控
10、制菜单动态添加和事件处理实例:菜单动态添加和事件处理实例:(1)在前列的)在前列的Win_Menu项目的窗体中添加一个编辑框项目的窗体中添加一个编辑框textBox1,用来输入菜单项的标题文本,再添加一个用来输入菜单项的标题文本,再添加一个添加添加按钮按钮button1。4.1菜单菜单(2)单击单击添加添加按钮,为该控件添加按钮,为该控件添加Click事件代码:事件代码:private:System:Void button1_Click(System:Object sender,System:EventArgs e)String str=this-textBox1-Text;str=str-T
11、rim();/去掉字符串前后的空格去掉字符串前后的空格if(str=L)MessageBox:Show(L不能添加该菜单项!不能添加该菜单项!,L提示提示);return;System:Windows:Forms:ToolStripMenuItem tempItem;tempItem=gcnew System:Windows:Forms:ToolStripMenuItem(str);tempItem-Click+=gcnew System:EventHandler(this,&Form1:On_MenuCommand);/添加到添加到menuStrip1中中/this-menuStrip1-I
12、tems-Add(tempItem);/添加到添加到menuStrip1的的“文件文件”菜单中菜单中,索引值为,索引值为1 this-toolStripMenuItem1-DropDownItems-Insert(1,tempItem);private:System:Void On_MenuCommand(System:Object sender,System:EventArgs e)System:Windows:Forms:ToolStripMenuItem tempItem=safe_cast(sender);Stringstr=tempItem-Text;if(str-Equals(L退
13、出退出(&X)|(str-Equals(L退出退出(&x)this-Close();elseMessageBox:Show(str,L你选择了菜单项你选择了菜单项);(3)为)为Form1类添加一个公共菜单项类添加一个公共菜单项Click事件的处理方事件的处理方法法On_MenuCommand:五、快捷菜单五、快捷菜单ContextMenuStrip 类表示快捷菜单。快捷菜单通常用于与特类表示快捷菜单。快捷菜单通常用于与特定情况有关且不适合在定情况有关且不适合在 MenuStrip 中显示的命令。中显示的命令。许多可视控件(以及许多可视控件(以及 Form 本身)都有一个本身)都有一个 Con
14、trol.ContextMenuStrip 属性,该属性将属性,该属性将 ContextMenuStrip 类类绑定到显示快捷菜单的控件。多个控件可使用一个绑定到显示快捷菜单的控件。多个控件可使用一个 ContextMenuStrip。ContextMenuStrip同样是同样是ToolStripMenuItem、ToolStripComboBox、ToolStripSeparator 和和 ToolStripTextBox 对对象的容器。象的容器。4.1菜单菜单五、快捷菜单五、快捷菜单使用快捷菜单实例使用快捷菜单实例(1)创建创建Windows窗体应用程序项目窗体应用程序项目Win_Cont
15、extMenu。(2)将工具箱中的将工具箱中的ContextMenuStrip组件拖放到窗体上,创组件拖放到窗体上,创建一个快捷菜单建一个快捷菜单ContextMenuStrip1。依次添加三个菜单项,分。依次添加三个菜单项,分别为别为“菜单项菜单项1”、“菜单项菜单项2”、“菜单项菜单项3”。(3)在在Form1窗体中添加三个窗体中添加三个TextBox控件,并在控件,并在TextBox控控件的属性窗口中,将件的属性窗口中,将ContextMenuStrip属性选择为属性选择为ContextMenuStrip1。(4)为为Form1窗体添加窗体添加MouseDown事件处理方法,为事件处理方
16、法,为ContextMenuStrip1添加添加Opening事件。它们的代码:事件。它们的代码:4.1菜单菜单private:System:Void Form1_MouseDown(System:Objectsender,System:Windows:Forms:MouseEventArgs e)if(e-Button=System:Windows:Forms:MouseButtons:Right)/右击鼠标右击鼠标this-contextMenuStrip1-Show(this,System:Drawing:Point(e-X,e-Y);private:System:Void contex
17、tMenuStrip1_Opening(System:Object sender,System:ComponentModel:CancelEventArgs e)this-ToolStripMenuItem1-Enabled=true;this-ToolStripMenuItem2-Enabled=true;this-ToolStripMenuItem3-Enabled=true;if(this-contextMenuStrip1-SourceControl=this-textBox1)this-ToolStripMenuItem1-Enabled=false;else if(this-con
18、textMenuStrip1-SourceControl=this-textBox2)this-ToolStripMenuItem2-Enabled=false;else if(this-contextMenuStrip1-SourceControl=this-textBox3)this-ToolStripMenuItem3-Enabled=false;在新的在新的 Windows 窗体应用程序中使用窗体应用程序中使用 ToolStrip 及其相关的及其相关的类来创建工具栏,这些工具栏具有类来创建工具栏,这些工具栏具有 Windows XP、Office、Internet Explorer的特
19、征或自定义的外观和行为。的特征或自定义的外观和行为。ToolStrip 控件控件也提供丰富的设计时体验,包括就地激活和编辑、自定义布局等。也提供丰富的设计时体验,包括就地激活和编辑、自定义布局等。尽管尽管 ToolStrip 类提供了许多可管理绘制、鼠标和键盘输入类提供了许多可管理绘制、鼠标和键盘输入以及拖放功能的成员,但是用户也可以使用以及拖放功能的成员,但是用户也可以使用 ToolStripManager 类类在指定的在指定的 ToolStripContainer 内联接内联接 ToolStrip 控件,以及将控件,以及将 ToolStrip 控件相互合并。通过将控件相互合并。通过将 To
20、olStripRenderer 类和类和 ToolStripManager 类结合使用,可以获得对绘制样式和布局样式类结合使用,可以获得对绘制样式和布局样式的更好控制和更多的自定义功能。的更好控制和更多的自定义功能。4.2 工具栏工具栏(P160)4.2 工具栏工具栏ToolStrip 也是也是ToolStripButton、ToolStripComboBox、ToolStripSplitButton、ToolStripLabel、ToolStripSeparator、ToolStripDropDownButton、ToolStripProgressBar 和和 ToolStripTextBo
21、x 对象的容器。对象的容器。总之,总之,ToolStrip 控件为高度可配置的、可扩展的控件,它提控件为高度可配置的、可扩展的控件,它提供了许多属性、方法和事件,可用来自定义外观和行为。供了许多属性、方法和事件,可用来自定义外观和行为。StatusStrip 控件用于向用户显示操作的状态信息,或控件用于向用户显示操作的状态信息,或显示操显示操作对象在应用程序中相关的上下文信息。通常作对象在应用程序中相关的上下文信息。通常 StatusStrip 控件由控件由 ToolStripStatusLabel 对象组成,其中每个对象都可显示文本或对象组成,其中每个对象都可显示文本或图标。图标。Statu
22、sStrip 还可包含还可包含 ToolStripDropDownButton、ToolStripSplitButton 和和 ToolStripProgressBar 控件。控件。默认的默认的 StatusStrip 没有面板。若要将面板添加到没有面板。若要将面板添加到 StatusStrip,请使用,请使用 ToolStripItemCollection.AddRange 方法,方法,或使用或使用 StatusStrip 项集合编辑器项集合编辑器在设计时添加、移除或重新排序在设计时添加、移除或重新排序项并修改属性。项并修改属性。4.3 状态栏状态栏(P164)实例:简单的记事本应用程序实例
23、:简单的记事本应用程序一、一、创建记事本窗体和菜单创建记事本窗体和菜单(1)创建一个)创建一个Windows窗体应用程序窗体应用程序Win_NotePad。(2)将工具箱中的)将工具箱中的TextBox控件拖放到窗体中,其控件拖放到窗体中,其Name属属性为性为pTextBox,将,将AcceptsReturn(是否允许输入回车符)和(是否允许输入回车符)和AcceptsTab(是否允许输入(是否允许输入tab符)属性设为符)属性设为True,将,将Dock属性属性设为设为Fill,将,将Multiline属性设为属性设为True,将,将ScrollBars属性设为属性设为Both,将,将Wo
24、rdWrap(是否自动换行)属性设为(是否自动换行)属性设为False。(3)将工具箱中的将工具箱中的MenuStrip组件拖放到窗体上,创建了主组件拖放到窗体上,创建了主菜单菜单menuStrip1。添加一个顶层菜单项。添加一个顶层菜单项“文件文件(&F)”,其,其Name属性设为属性设为fileMenu,其下再添加四个菜单项:,其下再添加四个菜单项:“新建新建(&N)”、“打开打开(&O)”、“保存保存(&S)”和和“退出退出(&X)”,其,其Name属性分别属性分别设为设为file_newItem、file_openItem、file_saveItem和和file_exitItem。二、
25、添加状态栏二、添加状态栏(1)将工具箱中的)将工具箱中的StatusStrip控件拖放到窗体上,创建了一控件拖放到窗体上,创建了一个状态栏控件个状态栏控件statusStrip1。单击单击statusStrip1控件控件右方的箭头按钮右方的箭头按钮或打开与属性或打开与属性Items相关联的项集合编辑器,添加六个相关联的项集合编辑器,添加六个ToolStripStatusLabel面板对象面板对象,text属性分别为就绪、大写、数属性分别为就绪、大写、数字、滚动、字、滚动、X:000,Y:000、时间。设置其它有关属性。、时间。设置其它有关属性。(2)为窗体添加为窗体添加SizeChanged(
26、大小改变时大小改变时)或或Resize(调整大小调整大小时时)的事件的事件On_FormSize,代码:,代码:private:System:Void On_FormSize(System:Object sender,System:EventArgs e)System:Drawing:Size size;size=System:Drawing:Size(this-ClientSize.Width,this-ClientSize.Height-this-statusStrip1-Height);this-pTextBox-Size=size;三、三、显示日期时间和鼠标位置显示日期时间和鼠标位置(
27、1)将工具箱中的)将工具箱中的Timer组件拖放到窗体中,添加并创建了组件拖放到窗体中,添加并创建了一个一个Timer组件组件timer1,将,将Enabled属性设为属性设为True,该其添加,该其添加Tick事件事件On_Timer,代码:,代码:private:System:Void On_Timer(System:Object sender,System:EventArgs e)this-toolStripStatusLabel6-Text=System:DateTime:Now.ToLongTimeString();(2)为)为TextBox控件添加控件添加MouseMove事件事件
28、On_MouseMove,代码:,代码:private:System:Void On_MouseMove(System:Object sender,System:Windows:Forms:MouseEventArgs e)String str=String:Concat(LX:,e-X.ToString(),L,Y:,e-Y.ToString();this-toolStripStatusLabel5-Text=str;四、显示特殊键状态四、显示特殊键状态(1)打开打开Form1.h文件,添加文件,添加GetKeyState函数导入代码:函数导入代码:using namespace Syste
29、m:Runtime:InteropServices;DllImport(user32.dll,EntryPoint=GetKeyState“,CharSet=CharSet:Unicode)short GetKeyState(int nVirtKey);(2)在在Form1类定义一个类定义一个UpdateKeyPanel函数,用来根据函数,用来根据Caps Lock、Num Lock和和Scroll Lock键的状态更新状态栏的相应键的状态更新状态栏的相应窗格:窗格:private:void UpdateKeyPanel(void)short nCaps=GetKeyState(20);/Ca
30、ps Lock键值为键值为if(nCaps!=0)/Caps Lock键灯亮时键灯亮时this-toolStripStatusLabel2-Text=L大写大写;elsethis-toolStripStatusLabel2-Text=L小写小写;nCaps=GetKeyState(144);/Num Lock键值为键值为if(nCaps!=0)/Num Lock键灯亮时键灯亮时this-toolStripStatusLabel3-Text=L数字数字;elsethis-toolStripStatusLabel3-Text=L;nCaps=GetKeyState(145);/Scroll Loc
31、k键值为键值为if(nCaps!=0)/Scroll Lock 键灯亮时键灯亮时this-toolStripStatusLabel4-Text=L滚动滚动;elsethis-toolStripStatusLabel4-Text=L;(3)为窗体添加为窗体添加Load事件事件On_Load,代码:,代码:private:System:Void On_Load(System:Object sender,System:EventArgs e)UpdateKeyPanel();(4)为为pTextBox控件添加控件添加KeyDown和和KeyUp事件的共同处理事件的共同处理方法方法On_Key,代码:
32、,代码:private:System:Void On_Key(System:Object sender,System:Windows:Forms:KeyEventArgs e)UpdateKeyPanel();(5)编译运行并测试。编译运行并测试。五、菜单功能的实现五、菜单功能的实现(1)添加支持文件流的命名空间:添加支持文件流的命名空间:using namespace System:IO;(2)为菜单项为菜单项“新建新建(&N)”、“打开打开(&O)”、“保存保存(&O)”、“退出退出(&X)”分别分别添加添加Click事件,代码:事件,代码:private:String strFileNa
33、me=L;private:System:Void On_NewFile(System:Object sender,System:EventArgs e)this-Text=L简单记事本简单记事本-无标题无标题;this-pTextBox-Text=L;/清除编辑框中的内容清除编辑框中的内容this-Select(0,0);/将插入符移到第将插入符移到第(0,0)位置位置this-pTextBox-Modified=false;this-strFileName=L;private:System:Void On_OpenFile(System:Object sender,System:EventA
34、rgs e)OpenFileDialog pOFD=gcnew OpenFileDialog();pOFD-Filter=L文本文件文本文件(*.txt)|*.txt|所有文件所有文件(*.*)|*.*;pOFD-DefaultExt=Ltxt;System:Windows:Forms:DialogResult nResult=pOFD-ShowDialog();if(nResult=System:Windows:Forms:DialogResult:OK)strFileName=pOFD-FileName;StreamReader pReader=gcnew StreamReader(str
35、FileName,System:Text:Encoding:Default );this-pTextBox-Text=pReader-ReadToEnd();this-pTextBox-Select(0,0);this-pTextBox-Modified=false;this-Text=String:Concat(L简单记事本简单记事本-,strFileName);pReader-Close();private:System:Void On_SaveFile(System:Object sender,System:EventArgs e)if(strFileName-Length=0)/无文件
36、名无文件名SaveFileDialog pSFD=gcnew SaveFileDialog();pSFD-Filter=L文本文件文本文件(*.txt)|*.txt|所有件所有件(*.*)|*.*;pSFD-DefaultExt=Ltxt;System:Windows:Forms:DialogResult nResult=pSFD-ShowDialog();if(nResult=System:Windows:Forms:DialogResult:OK)strFileName=pSFD-FileName;else return;StreamWriter pWriter=File:CreateTe
37、xt(strFileName);int nLength=this-pTextBox-Text-Length;pWriter-Write(pTextBox-Text-ToCharArray(),0,nLength);pWriter-Close();this-pTextBox-Modified=false;this-Text=String:Concat(L简单记事本简单记事本-,strFileName);private:System:Void On_Exit(System:Object sender,System:EventArgs e)this-Close();六、菜单功能的细化六、菜单功能的细
38、化编辑框中原有的内容被修改后,当用户选择编辑框中原有的内容被修改后,当用户选择“新建新建”、“打打开开”或或“退出退出”菜单命令时,应提醒是否保存操作。通过检测文菜单命令时,应提醒是否保存操作。通过检测文本框的本框的modified属性可完成该操作。属性可完成该操作。(1)在事件处理方法在事件处理方法On_Load中添加下列代码:中添加下列代码:On_NewFile(sender,e);最初应为空文档,供用户操作。最初应为空文档,供用户操作。(2)添加如下让用户进行保存操作的函数,通过检测文本框添加如下让用户进行保存操作的函数,通过检测文本框的的Modified属性完成,其代码如下:属性完成,
39、其代码如下:private:bool DoModified()if(!(pTextBox-Modified)return true;/没有修改没有修改System:Windows:Forms:DialogResult nRes=MessageBox:Show(L当前文件中的内容有修改,需要保当前文件中的内容有修改,需要保存吗?存吗?,L简单记事本简单记事本,MessageBoxButtons:YesNoCancel);/显示消息对话框显示消息对话框switch(nRes)case System:Windows:Forms:DialogResult:Cancel:return false;cas
40、e System:Windows:Forms:DialogResult:Yes:On_SaveFile(nullptr,nullptr);case System:Windows:Forms:DialogResult:No:return true;default:return false;(3)在在“新建新建”或或“打开打开”菜单事件处理方法菜单事件处理方法On_NewFile和和On_OpenFile的函数体的代码的最前面添加下列代码:的函数体的代码的最前面添加下列代码:if(!DoModified()return;(4)为窗体添加为窗体添加FormClosing事件事件On_FormClos
41、ing,代码:,代码:private:System:Void On_FormClosing(System:Object sender,System:Windows:Forms:FormClosingEventArgs e)e-Cancel=!DoModified();(5)编译运行并测试。编译运行并测试。七、显示菜单项的功能提示信息七、显示菜单项的功能提示信息(1)为为“文件文件(&F)”菜单,添加菜单,添加MouseHover事件事件On_MouseHover,其下所有菜单都添加同样事件,函数相同:,其下所有菜单都添加同样事件,函数相同:private:System:Void On_Mous
42、eHover(System:Object sender,System:EventArgs e)if(sender=this-fileMenu)/“文件文件”菜单项菜单项this-toolStripStatusLabel1-Text=L文件菜单用于常规的文件操作文件菜单用于常规的文件操作;if(sender=this-file_newItem)/“新建新建”菜单项菜单项this-toolStripStatusLabel1-Text=L新建一个文本文件新建一个文本文件;if(sender=this-file_openItem)/“打开打开”菜单项菜单项this-toolStripStatusLab
43、el1-Text=L打开一个文本文件打开一个文本文件;if(sender=this-file_saveItem)/“保存保存”菜单项菜单项this-toolStripStatusLabel1-Text=L保存文本文件中的内容保存文本文件中的内容;if(sender=this-file_exitItem)/“退出退出”菜单项菜单项this-toolStripStatusLabel1-Text=L退出应用程序退出应用程序;(2)打开窗体设计器,在打开窗体设计器,在菜单栏单击菜单栏单击,添加,添加MenuDeactivate事件事件On_MenuDeactivate,代码:,代码:private:System:Void On_MenuDeactivate(System:Object sender,System:EventArgs e)this-toolStripStatusLabel1-Text=L就绪就绪;(3)编译运行)编译运行:内内 容容4.1菜单菜单4.2 工具栏工具栏4.3 状态栏状态栏