本章要点:1Windows窗体的常用属性、事件和方法2如何调用Windows窗体3常用6种基本控件4创建菜单、工具栏和状态栏5高级控件和组件的应用Windows窗体及控件主要内容10.
1Windows窗体介绍10.
2Windows窗体的调用10.
3基本Windows控件10.
4菜单、工具栏与状态栏10.
5高级控件与组件10.
6综合实例——进销存管理系统登录窗口第10章Windows窗体及控件第10章Windows窗体及控件Windows环境中主流的应用程序都是窗体应用程序,Windows窗体应用程序比命令行应用程序要复杂得多,理解它的结构的基础是理解窗体,所以深刻认识Windows窗体变得尤为重要.
而控件是开发Windows应用程序最基本的部分,每一个Windows应用程序的操作窗体都是由各种控件组合而成的,因此,熟练掌握控件是合理、有效的进行Windows应用程序开发的重要前提.
本章将对Windows窗体及控件进行详细讲解.
10.
1Windows窗体介绍10.
1.
1设置窗体属性10.
1.
2调用窗体方法10.
1.
3触发窗体事件10.
1Windows窗体介绍在Windows窗体应用程序中,窗体是向用户显示信息的可视界面,它是Windows窗体应用程序的基本单元.
窗体都具有自己的特征,开发人员可以通过编程来进行设置.
窗体也是对象,窗体类定义了生成窗体的模板,每实例化一个窗体类,就产生了一个窗体,.
NET框架类库的System.
Windows.
Forms命名空间中定义的Form类是所有窗体类的基类.
编写窗体应用程序时,首先需要设计窗体的外观和在窗体中添加控件或组件,虽然可以通过编写代码来实现,但是却不直观、也不方便,而且很难精确的控制界面.
如果要编写窗体应用程序,推荐使用VisualStudio2015,VisualStudio2015提供了一个图形化的可视化窗体设计器,可以实现所见即所得的设计效果,以便快速开发窗体应用程序.
VisualStudio2015开发环境中的默认窗体(Form1)如图10-1所示.
10.
1.
1设置窗体属性新创建的Windows窗体中包含一些基本的组成要素,比如图标、标题、位置和背景等,设置这些要素可以通过窗体的属性面板进行设置,也可以通过代码实现.
但是为了快速开发Windows窗体应用程序,通常都是通过属性面板进行设置,下面详细介绍Windows窗体的常用属性设置.
1.
更换窗体的图标添加一个新的窗体后,窗体的图标是系统默认的图标.
如果想更换窗体的图标,可以在属性面板中设置窗体的Icon属性,窗体的默认图标和更换后的图标分别如图10-2和图10-3所示.
图10-2窗体默认图标图10-3更换后的窗体图标更换窗体图标的过程非常简单,其具体步骤如下:(1)选中窗体,然后在窗体的属性面板中选中Icon属性,会出现按钮,如图10-4所示.
图10-4窗体的Icon属性(2)单击按钮,打开选择图标文件的对话框,在其中选择新的窗体图标文件,单击"打开"按钮,即可完成窗体图标的更换.
2.
隐藏窗体的标题栏在有些情况下需要隐藏窗体的标题栏,例如,软件的加载窗体大多数都采用无标题栏的窗体.
开发人员可以通过设置窗体的FormBorderStyle属性为None,实现隐藏窗体标题栏功能.
FormBorderStyle属性有7个属性值,其属性值及说明如表10-1所示.
表10-1FormBorderStyle属性的属性值及说明3.
控制窗体的显示位置设置窗体的显示位置时,可以通过设置窗体的StartPosition属性来实现.
StartPosition属性有5个属性值,其属性值及说明如表10-2所示.
属性值说明Fixed3D固定的三维边框FixedDialog固定的对话框样式的粗边框FixedSingle固定的单行边框FixedToolWindow不可调整大小的工具窗口边框None无边框Sizable可调整大小的边框SizableToolWindow可调整大小的工具窗口边框4.
修改窗体的大小在窗体的属性中,通过Size属性可以设置窗体的大小.
双击窗体属性面板中的Size属性,可以看到其下拉菜单中有Width和Height两个属性,分别用于设置窗体的宽和高.
修改窗体的大小,只需更改Width和Height属性的值即可.
窗体的Size属性如图10-5所示.
属性值说明CenterParent窗体在其父窗体中居中CenterScreen窗体在当前显示窗口中居中,其尺寸在窗体大小中指定Manual窗体的位置由Location属性确定WindowsDefaultBounds窗体定位在Windows默认位置,其边界也由Windows默认决定WindowsDefaultLocation窗体定位在Windows默认位置,其尺寸在窗体大小中指定设置窗体的显示位置时,只需根据不同的需要选择属性值即可.
表10-2StartPosition属性的属性值及说明图10-5窗体的Size属性5.
设置窗体背景图片为使窗体设计更加美观,通常会设置窗体的背景,开发人员可以设置窗体的背景颜色,也可以设置窗体的背景图片.
设置窗体的背景图片时可以通过设置窗体的BackgroundImage属性实现,其具体步骤如下:(1)选中窗体属性面板中的BackgroundImage属性,会出现按钮,如图10-6所示.
图10-6BackgroundImage属性(2)单击按钮,打开"选择资源"对话框,如图10-7所示.
图10-7"选择资源"对话框(3)如图10-7所示的"选择资源"对话框中有两个选项,一个是"本地资源",另一个是"项目资源文件",其差别是选择"本地资源"后,直接选择图片,保存的是图片的路径;而选择"项目资源文件"后,会将选择的图片保存到项目资源文件Resources.
resx中.
无论选择哪种方式,都需要单击"导入"按钮选择背景图片,选择完成后单击"确定"按钮完成窗体背景图片的设置,Form1窗体背景图片设置前后对比如图10-8和图10-9所示.
图10-8窗体默认背景图10-9设置背景后的窗体说明:设置窗体背景图片时,窗体还提供了一个BackgroundImageLayout属性,该属性主要用来控制背景图片的布局,开发人员需要将该属性的属性值设置为Stretch,以便能够使图片自动适应窗体的大小.
6.
控制窗体的最大化和最小化Windows窗体提供了"最大化"按钮和"最小化"按钮,开发人员可以根据需要设置这两个按钮可用或不可用,该功能主要通过设置Windows窗体的MaximizeBox属性和MinimizeBox属性实现,其中MaximizeBox属性用来设置窗体的"最大化"按钮是否可用,MinimizeBox属性用来设置窗体的"最小化"按钮是否可用.
另外,开发人员还可以设置窗体启动时,默认是最大化还是最小化,该功能主要通过设置窗体的WindowState属性来实现.
WindowState属性有3个属性值,其属性值及说明如表10-3所示.
表10-3WindowState属性的属性值及说明属性值说明Normal还原窗口Minimized最小化窗口Maximized最大化窗口7.
控制窗体总在最前Windows桌面上允许多个窗体同时显示,但有时候根据实际情况,可能需要将某一个窗体总显示在桌面的最前面,那么在C#中可以通过设置窗体的TopMost属性来实现,该属性主要用来获取或设置一个值,这个值指示窗体是否显示为最顶层窗体.
窗体总在最前效果如图10-10所示.
图10-10中,鼠标焦点在"我的电脑"上,但Form1还是显示在最前面,这里就设置了它的TopMost属性为True.
8.
设置窗体的透明度实际应用中,为了给窗体增加一些特殊的效果,常常需要使窗体半透明,这时可以通过设置窗体的Opacity属性来实现,该属性主要用来获取或设置窗体的不透明度,其默认值为100%.
比如,将窗体的Opacity属性设置为50%,其效果如图10-11所示.
图10-11窗体的半透明效果1.
使用Show方法显示窗体Show方法用来显示窗体,它有两种重载形式,分别如下:publicvoidShow()publicvoidShow(IWin32Windowowner)owner:任何实现IWin32Window并表示将拥有此窗体的顶级窗口的对象.
【例10-1】通过使用Show方法显示Form1窗体,代码如下:Form1frm=newForm1();//实例化窗体对象frm.
Show();//调用Show方法显示窗体说明:由于Show方法为非静态方法,所以需要使用窗体对象进行调用;下面将要介绍到的Hide方法和Close方法也是非静态方法,所以在使用它们时,也需要首先实例化窗体对象.
2.
使用Hide方法隐藏窗体Hide方法用来隐藏窗体,语法如下:publicvoidHide()【例10-2】通过使用Hide方法隐藏Form1窗体,代码如下:10.
1.
2调用窗体方法Form1frm=newForm1();//实例化窗体对象frm.
Hide();//调用Hide方法隐藏窗体说明:使用Hide方法隐藏窗体之后,窗体所占用的资源并没有从内存中释放掉,而是继续存储在内存中,开发人员可以随时调用Show方法来显示隐藏的窗体.
3.
使用Close方法关闭窗体Close方法用来关闭窗体,语法如下:publicvoidClose()【例10-3】通过使用Close方法关闭Form1窗体,代码如下:Form1frm=newForm1();//实例化窗体对象frm.
Close();//调用Close方法关闭窗体说明:关闭当前窗体时,也可以直接使用this关键字调用Close方法来实现.
Windows是事件驱动的操作系统,对Form类的任何交互都是基于事件来实现的.
Form类提供了大量的事件用于响应执行窗体的各种操作,下面对窗体的几种常用事件进行介绍.
说明:选择窗体事件时,可以通过选中控件,然后单击其"属性"窗口中的图标来实现.
1.
Activated事件当使用代码激活或用户激活窗体时触发Activated事件,其语法格式如下:publiceventEventHandlerActivated【例10-4】在窗体每次激活时都弹出一个"窗体已激活"对话框,代码如下:privatevoidForm1_Activated(objectsender,EventArgse)//触发窗体的激活事件{MessageBox.
Show("窗体已激活!
");//弹出信息提示框}10.
1.
3触发窗体事件说明:开发数据库管理系统时,为了能够使数据表格控件中显示最新的数据,在子窗体中添加或修改记录之后,关闭子窗体,重新激活主窗体,这时可以在主窗体的Activated事件中对数据表格控件进行一下重新绑定.
2.
Load事件窗体加载时,将触发窗体的Load事件,该事件是窗体的默认事件,其语法格式如下:publiceventEventHandlerLoad【例10-5】当窗体加载时,弹出对话框,询问是否查看窗体,单击"是"按钮,查看窗体.
代码如下:privatevoidForm1_Load(objectsender,EventArgse)//窗体的Load事件{if(MessageBox.
Show("是否查看窗体!
","",MessageBoxButtons.
YesNo,MessageBoxIcon.
Information)==DialogResult.
Yes)//使用if判断是否单击了"是"按钮{}}3.
FormClosing事件窗体关闭时,触发窗体的FormClosing事件,其语法格式如下:publiceventFormClosingEventHandlerFormClosing【例10-6】创建一个Windows窗体应用程序,实现当关闭窗体之前,弹出提示框,询问是否关闭当前窗体,单击"是"按钮,关闭窗体;单击"否"按钮,取消窗体的关闭.
代码如下.
(实例位置:光盘\MR\源码\第10章\10.
6)privatevoidForm1_FormClosing(objectsender,FormClosingEventArgse){DialogResultdr=MessageBox.
Show("是否关闭窗体","提示",MessageBoxButtons.
YesNo,MessageBoxIcon.
Warning);//弹出提示框if(dr==DialogResult.
Yes)//使用if语句判断是否单击"是"按钮{e.
Cancel=false;//如果单击"是"按钮则关闭窗体}else{e.
Cancel=true;//不执行操作}}程序的运行结果如图10-12所示.
图10-12是否关闭窗体说明:开发网络程序或多线程程序时,可以在窗体的FormClosing事件中关闭网络连接或多线程,以便释放网络连接或多线程所占用的系统资源.
10.
2Windows窗体的调用10.
2.
1调用模式窗体10.
2.
2调用非模式窗体窗体是用户设计程序外观的操作界面,根据不用的需求,可以使用不用类型的Windows窗体.
根据Windows窗体的显示状态,可以分为模式窗体和非模式窗体,下面首先来看模式窗体.
10.
2Windows窗体的调用模式窗体就是使用ShowDialog方法显示的窗体,它在显示时,如果作为激活窗体,则其他窗体不可用,只有在将模式窗体关闭之后,其他窗体才能恢复可用状态.
如图10-13所示,如果是以模式窗体显示,则只有在关闭上层的"SQL数据库技术词典"窗体之后,用户才可以编辑"C#编程词典"窗体.
图10-13模式窗体10.
2.
1调用模式窗体说明:模式窗体和非模式窗体只有在实际使用时,才能体验到存在差别,它们在呈现给用户时并没有明显差别.
【例10-7】使用窗体对象的ShowDialog方法以模式窗体显示Form2,代码如下:Form2frm=newForm2();//实例化窗体对象frm.
ShowDialog();//以模式窗体显示Form2非模式窗体就是使用Show方法显示的窗体,一般的窗体都是非模式窗体.
非模式窗体在显示时,如果有多个窗体,用户可以单击任何一个窗体,单击的窗体将立即成为激活窗体并显示在屏幕的最前面.
例如,10.
2.
1节中的图10-13中的窗体如果是以非模式窗体显示,则用户可以在任何时候编辑"SQL数据库技术词典"和"C#编程词典"两个窗体.
【例10-8】使用窗体对象的Show方法以非模式窗体显示Form2,代码如下:Form2frm=newForm2();//实例化窗体对象frm.
Show();//以非模式窗体显示Form210.
2.
2调用非模式窗体10.
3基本Windows控件10.
3.
1Label控件10.
3.
2TextBox控件10.
3.
3RichTextBox控件10.
3.
4Button控件10.
3.
5GroupBox控件10.
3.
6TabControl控件10.
3.
7CheckBox控件10.
3.
8RadioButton控件10.
3.
9PictureBox控件10.
3.
10日期控件(2个)在Windows应用程序开发中,有一些使用频率比较高的控件,通常我们称之为基本控件,比如常见的有,按钮、文本框、文本标签等等,本节将对最常用到的6种基本控件进行详细讲解.
10.
3基本Windows控件Label控件,又称为标签控件,它主要用于显示用户不能编辑的文本,标识窗体上的对象(例如,给文本框、列表框添加描述信息等),另外,也可以通过编写代码来设置要显示的文本信息.
如图10-14为Label控件,其拖放到窗体中的效果如图10-15所示.
图10-14Label控件图10-15Label控件在窗体中的效果下面通过一个例子看一下如何使用Label控件.
【例10-9】创建一个Windows应用程序,在默认窗体中添加两个Label控件,分别用来使用不同的字体和颜色显示文字,代码如下.
(实例位置:光盘\MR\源码\第10章\10-9)privatevoidForm1_Load(objectsender,EventArgse){label1.
Font=newFont("楷体",12);//设置label1控件的字体label1.
Text="明日科技";//设置label1控件显示的文字label2.
ForeColor=Color.
Red;//设置label2控件的字体颜色10.
3.
1Label控件label2.
Text="C#编程词典";//设置label2控件显示的文字}程序运行结果如图10-16所示.
图10-16使用Label控件显示文字TextBox控件,又称为文本框控件,它主要用于获取用户输入的数据或者显示文本,它通常用于可编辑文本,也可以使其成为只读控件.
文本框可以显示多行,开发人员可以使文本换行以便符合控件的大小.
如图10-17为TextBox控件,其拖放到窗体中的效果如图10-18所示.
图10-17TextBox控图10-18TextBox控件在窗体中的效果下面对TextBox控件的一些常用属性及事件的使用进行详细介绍.
(1)ReadOnly属性获取或设置一个值,该值指示文本框中的文本是否为只读,其语法格式如下:publicboolReadOnly{get;set;}属性值:如果文本框是只读的,则为true,否则为false.
默认值为false.
【例10-10】将textBox1文本框设置为只读,代码如下:textBox1.
ReadOnly=true;//将文本框设置为只读10.
3.
2TextBox控件(2)PasswordChar属性和UseSystemPasswordChar属性这两个属性都用来将文本框设置为密码文本框,其中PasswordChar属性用来获取或设置字符,该字符用于屏蔽单行TextBox控件中的密码字符;而UseSystemPasswordChar属性则用来获取或设置一个值,该值指示TextBox控件中的文本是否应该以默认的密码字符显示.
PasswordChar属性语法格式如下:publiccharPasswordChar{get;set;}属性值:用于屏蔽在单行TextBox控件中输入的字符.
如果不想让控件在字符键入时将它们屏蔽,请将此属性值设置为0(字符值).
默认值等于0(字符值).
UseSystemPasswordChar属性语法格式如下:publicboolUseSystemPasswordChar{get;set;}属性值:如果TextBox控件中的文本应该以默认的密码字符显示,则为true;否则为false.
说明:UseSystemPasswordChar属性的优先级高于PasswordChar属性.
每当UseSystemPasswordChar属性设置为true时,将使用默认系统密码字符,并忽略由PasswordChar属性设置的任何字符.
【例10-11】创建一个Windows应用程序,使用PasswordChar属性将密码文本框中字符自定义显示为"@",同时将UseSystemPasswordChar属性设置为True,使第二个密码文本框中的字符显示为"*",代码如下.
(实例位置:光盘\MR\源码\第10章\10-11)privatevoidForm1_Load(objectsender,EventArgse){textBox1.
PasswordChar设置文本框的PasswordChar属性为字符@//设置文本框的UseSystemPasswordChar属性设置为TruetextBox2.
UseSystemPasswordChar=true;}程序运行结果如图10-19所示.
图10-19设置密码文本框(3)Multiline属性获取或设置一个值,该值指示此控件是否为多行TextBox控件,其语法格式如下:publicoverrideboolMultiline{get;set;}属性值:如果该控件是多行TextBox控件,则为true;否则为false.
默认为false.
【例10-12】将文本框的Multiline属性设置为True,使其成为多行文本框,代码如下:textBox1.
Multiline=true;//设置文本框的Multiline属性使其多行显示多行文本框效果如图10-20所示.
图10-20多行文本框说明:多行文本框的大小并不固定,从图10-4可以看出,多行文本框的4周都可以拖动,开发人员可以自行确定它的大小.
Text属性SelectedText属性ScrollBarsTextChanged事件RichTextBox控件,又称为有格式文本框控件,它主要用于显示、输入和操作带有格式的文本,比如它可以实现显示字体、颜色、链接、从文件加载文本及嵌入的图像、撤消和重复编辑操作以及查找指定的字符等功能.
如图10-21为RichTextBox控件,其拖放到窗体中的效果如图10-22所示.
图10-21RichTextBox控件图10-22RichTextBox控件在窗体中的效果下面通过一个例子看一下如何使用RichTextBox控件.
【例10-13】创建一个Windows应用程序,在默认窗体中添加两个Button控件和一个RichTextBox控件,其中Button控件用来执行打开文件、插入图片操作,RichTextBox控件用来显示文件和图片.
代码如下.
(实例位置:光盘\MR\源码\第10章\10-13)privatevoidForm1_Load(objectsender,EventArgse){richTextBox1.
BorderStyle=BorderStyle.
Fixed3D;//设置边框样式10.
3.
3RichTextBox控件richTextBox1.
DetectUrls=true;//设置自动识别超链接richTextBox1.
ScrollBars=RichTextBoxScrollBars.
Both;//设置滚动条}//打开文件privatevoidbutton1_Click(objectsender,EventArgse){OpenFileDialogopenfile=newOpenFileDialog();//实例化打开文件对话框对象openfile.
Filter="rtf文件(*.
rtf)|*.
rtf";//设置文件筛选器if(openfile.
ShowDialog()==DialogResult.
OK)//判断是否选择了文件{richTextBox1.
Clear();//清空文本框//加载文件richTextBox1.
LoadFile(openfile.
FileName,RichTextBoxStreamType.
RichText);}}//插入图片privatevoidbutton2_Click(objectsender,EventArgse){OpenFileDialogopenpic=newOpenFileDialog();//实例化打开文件对话框对象//设置文件筛选器openpic.
Filter="bmp文件(*.
bmp)|*.
bmp|jpg文件(*.
jpg)|*.
jpg|ico文件(*.
ico)|*.
ico";openpic.
Title="打开图片";//设置对话框标题if(openpic.
ShowDialog()==DialogResult.
OK)//判断是否选择了图片{Bitmapbmp=newBitmap(openpic.
FileName);//使用选择图片实例化BitmapClipboard.
SetDataObject(bmp,false);//将图像置于系统剪贴板中//判断richTextBox1控件是否可以粘贴图片信息if(richTextBox1.
CanPaste(DataFormats.
GetFormat(DataFormats.
Bitmap)))richTextBox1.
Paste();//粘贴图片}}程序运行结果如图10-23所示.
图10-23使用RichTextBox控件显示图文数据Button控件,又称为按钮控件,它表允许用户通过单击来执行操作.
Button控件既可以显示文本,也可以显示图像,当该控件被单击时,它看起来像是被按下,然后被释放.
如图10-24为Button控件,其拖放到窗体中的效果如图10-25所示.
图10-24Button控件图10-25Button控件在窗体中的效果下面通过一个例子看一下如何使用Button控件.
【例10-14】创建一个Windows应用程序,在默认窗体中添加4个Button控件,然后通过设置这4个Button控件的样式来制作4种不同的按钮.
代码如下.
(实例位置:光盘\MR\源码\第10章\10-14)privatevoidForm1_Load(objectsender,EventArgse){button1.
BackgroundImage=Properties.
Resources.
j_1;//设置button1的背景button1.
BackgroundImageLayout=ImageLayout.
Stretch;//设置button1背景布局方式button2.
Image=Properties.
Resources.
j_1;//设置button2显示图像10.
3.
4Button控件button2.
ImageAlign=ContentAlignment.
MiddleLeft;//设置图像对齐方式button2.
Text="解锁";//设置button2的文本button3.
FlatStyle=FlatStyle.
Flat;//设置button3的外观样式button3.
Text="确定";//设置button3的文本button4.
TextAlign=ContentAlignment.
MiddleRight;//设置文本对齐方式button4.
Text="确定";//设置button4的文本}程序运行结果如图10-26所示.
图10-26使用Button控件制作样式不同的按钮GroupBox控件,又称为分组框控件,它主要为其他控件提供分组,并且按照控件的分组来细分窗体的功能,其在所包含的控件集周围总是显示边框,而且可以显示标题,但是没有滚动条.
如图10-27为GroupBox控件,其拖放到窗体中的效果如图10-28所示.
图10-27GroupBox控件图10-28GroupBox控件在窗体中的效果下面通过一个例子看一下如何使用GroupBox控件.
【例10-15】创建一个Windows应用程序,在默认窗体中添加两个GroupBox控件,用来将窗体中的控件分为两组,然后在窗体加载事件中分别设置两个GroupBox控件的分组标题.
代码如下.
(实例位置:光盘\MR\源码\第10章\10-15)privatevoidForm1_Load(objectsender,EventArgse){groupBox1.
Text="员工基本信息";//设置groupBox1控件的标题10.
3.
5GroupBox控件groupBox2.
Text="基本操作";//设置groupBox2控件的标题}程序运行结果如图10-29所示.
图10-29使用GroupBox控件进行分组TabControl控件,又称为选项卡控件,它可以添加多个选项卡,然后可以在选项卡上添加子控件,这样就可以把窗体设计成多页,并且使窗体的功能划分为多个部分.
选项卡控件的选项卡中可以包含图片或其他控件.
如图10-30为TabControl控件,其拖放到窗体中的效果如图10-31所示.
图10-30TabControl控件图10-31TabControl控件在窗体中的效果下面通过一个例子看一下如何使用TabControl控件.
【例10-16】创建一个Windows应用程序,在默认窗体中添加一个TabControl控件和两个Button控件,其中TabControl控件用来作为选项卡控件,Button控件分别用来执行添加和删除选项卡操作.
代码如下.
(实例位置:光盘\MR\源码\第10章\10-16)privatevoidForm1_Load(objectsender,EventArgse){tabControl1.
Appearance=TabAppearance.
Normal;//设置选项卡的外观样式}10.
3.
6TabControl控件//添加选项卡privatevoidbutton1_Click(objectsender,EventArgse){//声明一个字符串变量,用于生成新增选项卡的名称stringTitle="新增选项卡"+(tabControl1.
TabCount+1).
ToString();TabPageMyTabPage=newTabPage(Title);//实例化TabPage//使用TabControl控件的TabPages属性的Add方法添加新的选项卡tabControl1.
TabPages.
Add(MyTabPage);//获取选项卡个数MessageBox.
Show("现有"+tabControl1.
TabCount+"个选项卡");}//移除选项卡privatevoidbutton2_Click(objectsender,EventArgse){if(tabControl1.
SelectedIndex==0)//判断是否选择了要移除的选项卡{MessageBox.
Show("请选择要移除的选项卡");//如果没有选择,弹出提示}else{//使用TabControl控件的TabPages属性的Remove方法移除指定的选项卡tabControl1.
TabPages.
Remove(tabControl1.
SelectedTab);}}程序运行结果如图10-32所示.
图10-32使用TabControl控件创建多面板10.
4菜单、工具栏与状态栏10.
4.
1MenuStrip控件10.
4.
2ToolStrip控件10.
4.
3StatusStrip控件除了上面介绍的常用基本控件之外,在开发应用程序时,还少不了菜单控件(MenuStrip控件)、工具栏控件(ToolStrip控件)和状态栏控件(StatusStrip控件),本节将对这3种控件进行详细讲解.
10.
4菜单、工具栏与状态栏菜单控件使用MenuStrip控件来表示,它主要用来设计程序的菜单栏,C#中的MenuStrip控件支持多文档界面、菜单合并、工具提示和溢出等功能,开发人员可以通过添加访问键、快捷键、选中标记、图像和分隔条来增强菜单的可用性和可读性.
如图10-33为MenuStrip控件,其拖放到窗体中的效果如图10-34所示.
图10-33MenuStrip控件图10-34MenuStrip控件在窗体中的效果下面通过一个例子看一下如何使用MenuStrip控件.
【例10-17】创建一个Windows应用程序,演示如何使用MenuStrip控件设计菜单栏,具体步骤如下.
(实例位置:光盘\MR\源码\第10章\10-17)(1)从工具箱中将MenuStrip控件拖曳到窗体中,如图10-35所示.
10.
4.
1MenuStrip控件图10-35将MenuStrip控件拖曳到窗体中图10-36输入菜单名称(2)在输入菜单名称时,系统会自动产生输入下一个菜单名称的提示,如图10-36所示.
(3)在图10-36所示的输入框中输入"新建(&N)"后,菜单中会自动显示"新建(N)",在此处,"&"被识别为确认热键的字符,例如,"新建(N)"菜单就可以通过键盘上的〈Alt+N〉组合键打开.
同样,在"新建(N)"菜单下创建"打开(O)"、"关闭(C)"和"保存(S)"等子菜单,如图10-37所示.
图10-37添加菜单图10-38运行后菜单示意图(4)菜单设置完成后,运行程序,效果如图10-38所示.
说明:开发人员可以通过菜单控件上的右键菜单为菜单项设置菜单,或者添加其他的菜单对象.
工具栏控件使用ToolStrip控件来表示,使用该控件可以创建具有WindowsXP、Office、InternetExplorer或自定义的外观和行为的工具栏及其他用户界面元素,这些元素支持溢出及运行时项重新排序.
如图10-39为ToolStrip控件,其拖放到窗体中的效果如图10-40所示.
图10-39ToolStrip控件图10-40ToolStrip控件在窗体中的效果下面通过一个例子看一下如何使用ToolStrip控件.
【例10-18】创建一个Windows应用程序,演示如何使用ToolStrip控件创建工具栏,具体步骤如下.
(实例位置:光盘\MR\源码\第10章\10-18)(1)从工具箱中将ToolStrip控件拖曳到窗体中,如图10-41所示.
10.
4.
2ToolStrip控件图10-41将ToolStrip控件拖曳到窗体中图10-42添加工具栏项目(2)单击工具栏上向下箭头的提示图标,如图10-42所示.
从上图中可以看到,当单击工具栏中向下的箭头,在下拉菜单中有8种不同的类型,下面分别介绍.
Button:包含文本和图像中可让用户选择的项.
Label:包含文本和图像的项,不可以让用户选择,可以显示超链接.
SplitButton:在Button的基础上增加了一个下拉菜单.
DropDownButton:用于下拉菜单选择项.
Separator:分隔符.
ComboBox:显示一个ComboBox的项.
TextBox:显示一个TextBox的项.
ProgressBar:显示一个ProgressBar的项.
(3)添加相应的工具栏按钮后,可以设置其要显示的图像,具体方法是:选中要设置图像的工具栏按钮,单击右键,在弹出的快捷菜单中选择"设置图像"选项,如图10-43所示.
图10-43设置按钮图像图10-44程序运行结果(4)工具栏中的按钮默认只显示图像,如果要以其他方式(比如只显示文本、同时显示图像和文本等)显示工具栏按钮,可以选中工具栏按钮,单击右键,在弹出的快捷菜单中选择"DisplayStyle"菜单项下面的各个子菜单项.
(5)工具栏设计完成后,运行程序,效果如图10-44所示.
状态栏控件使用StatusStrip控件来表示,它通常放置在窗体的最底部,用于显示窗体上一些对象的相关信息,或者可以显示应用程序的信息.
StatusStrip控件由ToolStripStatusLabel对象组成,每个这样的对象都可以显示文本、图像或同时显示这二者,另外,StatusStrip控件还可以包含ToolStripDropDownButton、ToolStripSplitButton和ToolStripProgressBar等控件.
如图10-45为StatusStrip控件,其拖放到窗体中的效果如图10-46所示.
图10-45StatusStrip控件图10-46StatusStrip控件在窗体中的效果下面通过一个例子看一下如何使用StatusStrip控件.
【例10-19】创建一个Windows应用程序,演示如何使用StatusStrip控件创建状态栏,具体步骤如下.
(实例位置:光盘\MR\源码\第10章\10-19)(1)从工具箱中将StatusStrip控件拖曳到窗体中,如图10-47所示.
10.
4.
3StatusStrip控件图10-47将StatusStrip控件拖曳到窗体中图10-48添加状态栏项目(2)单击状态栏上向下箭头的提示图标,选择"插入"菜单项,弹出子菜单,如图10-48所示.
从上图中可以看到,当单击"插入"菜单项时,在下拉子菜单中有4种不同的类型,下面分别介绍.
StatusLabel:包含文本和图像的项,不可以让用户选择,可以显示超链接.
ProgressBar:进度条显示.
DropDownButton:用于下拉菜单选择项.
SplitButton:在Button的基础上增加了一个下拉菜单.
(3)在图10-48中选择需要的项添加到状态栏中,然后可以在其"属性"对话框中通过设置Text属性来确定要显示的文本,状态栏设计效果如图10-49所示.
图10-49状态栏设计效果(4)窗体加载时,在状态栏中显示当前日期,代码如下:privatevoidForm1_Load(objectsender,EventArgse){//在状态栏上显示系统的当前时间toolStripStatusLabel1.
Text="当前时间:"+DateTime.
Now.
ToLongTimeString();}程序运行结果如图10-50所示.
10.
5高级控件与组件10.
5.
1列表选择控件10.
5.
2视图控件10.
5.
3ImageList组件10.
5.
4Timer组件除了上面小节中介绍的基本控件之外,Windows应用程序还有一些高级控件和组件,熟练地掌握这些高级控件和组件,在开发应用程序过程中可以快速地实现一些复杂的功能.
与控件不同,组件是一种非可视化的类,在编写程序时,"组件"这个术语通常用于可重复使用并且可以和其他对象进行交互的对象.
10.
5高级控件与组件列表选择控件主要包括列表控件(ListBox控件),下拉组合框控件(ComboBox控件)、列表视图控件和树控件(TreeView控件).
通过对本节的学习,可以掌握列表选择控件的基本用法.
1.
ListBox控件ListBox控件,又称为列表控件,它主要用于显示一个列表,用户可以从中选择一项或多项,如果选项总数超出可以显示的项数,则控件会自动添加滚动条.
如图10-51为ListBox控件,其拖放到窗体中的效果如图10-52所示.
图10-51ListBox控件图10-52ListBox控件在窗体中的效果下面通过一个例子看一下如何使用ListBox控件.
【例10-20】创建一个Windows应用程序,在默认窗体中添加一个TextBox控件、一个Button控件、一个ListBox控件和两个Label控件,其中TextBox控件用来显示选择的文件夹,Button控件用来选择文件夹并获取其中的文件列表,ListBox控件用来显示获取到的文件列表,Label控件分别用来显示文件列表总数和选中的文件夹或文件名称.
代码如下.
(实例位置:光盘\MR\源码\第10章\10-20)10.
5.
1列表选择控件privatevoidForm1_Load(objectsender,EventArgse){//HorizontalScrollbar属性设置为true,使其能显示水平方向的滚动条listBox1.
HorizontalScrollbar=true;//和ScrollAlwaysVisible属性设置为true,使其能显示垂直方向的滚动条listBox1.
ScrollAlwaysVisible=true;//SelectionMode属性值为SelectionMode枚举成员MultiExtended,实现在控件中可以选择多项listBox1.
SelectionMode=SelectionMode.
MultiExtended;}//获取文件列表privatevoidbutton1_Click(objectsender,EventArgse){//实例化浏览文件夹对话框FolderBrowserDialogfolderbrowser=newFolderBrowserDialog();if(folderbrowser.
ShowDialog()==DialogResult.
OK)//判断是否选择了要浏览的文件夹{textBox1.
Text=folderbrowser.
SelectedPath;//获取选择的文件夹路径//使用获取的文件夹路径实例化DirectoryInfo类对象DirectoryInfodinfo=newDirectoryInfo(textBox1.
Text);//获取指定文件夹下的所有子文件夹及文件FileSystemInfo[]finfo=dinfo.
GetFileSystemInfos();//将获取到的子文件夹及文件添加到ListBox控件中listBox1.
Items.
AddRange(finfo);label3.
Text="("+listBox1.
Items.
Count+"项)";//获取ListBox控件中的项数}}//获取选择项privatevoidlistBox1_SelectedIndexChanged(objectsender,EventArgse){label4.
Text="您选择的是:";for(inti=0;iDropDownList;//设置comboBox1的下拉框样式string[]str=newstring[]{"总经理","副总经理","人事部经理","财务部经理","部门经理","普通员工"};//定义职位数组comboBox1.
DataSource=str;//指定comboBox1控件的数据源comboBox1.
SelectedIndex=0;//指定默认选择第一项}//触发comboBox1控件的选择项更改事件privatevoidcomboBox1_SelectedIndexChanged(objectsender,EventArgse){label2.
Text="您选择的职位为:"+comboBox1.
SelectedItem;//获取comboBox1中的选中项}程序运行结果如图10-56所示.
图10-56使用ComboBox控件选择职位视图控件通常以数据并配有图标的方式来向用户展示信息,常用的视图控件有ListView控件和TreeView控件,下面将对这两种控件进行详细讲解.
1.
ListView控件ListView控件,又称为列表视图控件,它主要用于显示带图标的项列表,其中可以显示大图标、小图标和数据.
使用ListView控件可以创建类似Windows资源管理器右边窗口的用户界面.
如图10-57为ListView控件,其拖放到窗体中的效果如图10-58所示.
图10-57ListView控件图10-58ListView控件在窗体中的效果下面通过一个例子看一下如何使用ListView控件.
【例10-22】创建一个Windows应用程序,将ListView控件的View属性设置为SmallIcon,然后使用Groups集合的Add方法创建两个分组,标题分别为"名称"和"类别",排列方式为左对齐,最后向ListView控件中添加6项,然后设置每项的Group属性,将控件中的项进行分组;最后通过3个Button控件,分别10.
5.
2视图控件实现向ListView控件添加、移除和清空项的功能.
代码如下.
(实例位置:光盘\MR\源码\第10章\10-22)privatevoidForm1_Load(objectsender,EventArgse){listView1.
View=View.
SmallIcon;//设置listView1控件的View属性,设置样式//为listView1建立两个组listView1.
Groups.
Add(newListViewGroup("名称",HorizontalAlignment.
Left));listView1.
Groups.
Add(newListViewGroup("类别",HorizontalAlignment.
Left));//向控件中添加项目listView1.
Items.
Add("明日科技");listView1.
Items.
Add("C#编程词典");listView1.
Items.
Add("视频学C#编程");listView1.
Items.
Add("公司");listView1.
Items.
Add("软件");listView1.
Items.
Add("图书");//将listView1控件中索引是0、1和2的项添加到第一个分组listView1.
Items[0].
Group=listView1.
Groups[0];listView1.
Items[1].
Group=listView1.
Groups[0];listView1.
Items[2].
Group=listView1.
Groups[0];//将listView1控件中索引是3、4和5的项添加到第二个分组listView1.
Items[3].
Group=listView1.
Groups[1];listView1.
Items[4].
Group=listView1.
Groups[1];listView1.
Items[5].
Group=listView1.
Groups[1];}//添加项privatevoidbutton1_Click(objectsender,EventArgse){if(textBox1.
Text判断文本框中是否输入数据{MessageBox.
Show("项目不能为空");//如果没有输入数据则弹出提示}else{listView1.
Items.
Add(textBox1.
Text.
Trim());//使用Add方法向控件中添加数据}}//移除项privatevoidbutton2_Click(objectsender,EventArgse){if(listView1.
SelectedItems.
Count==0)//判断是否选择了要删除的项{MessageBox.
Show("请选择要删除的项");//如果没有选择弹出提示}else{//使用RemoveAt方法移除选择的项目listView1.
Items.
RemoveAt(listView1.
SelectedItems[0].
Index);listView1.
SelectedItems.
Clear();//取消控件的选择}}//清空项privatevoidbutton3_Click(objectsender,EventArgse){if(listView1.
Items.
Count==0)//判断控件中是否存在项目{MessageBox.
Show("项目中已经没有项目");//如果没有项目弹出提示}else{listView1.
Items.
Clear();//使用Clear方法移除所有项目}}程序运行结果如图10-59所示.
图10-59对ListView控件中的列表项进行分组说明:ListView是一种列表控件,在实现诸如显示文件详细信息这样的功能时,推荐使用该控件;另外,由于ListView有多种显示样式,因此在实现类似Windows系统的"缩略图"、"平铺"、"图标"、"列表"和"详细信息"等功能时,经常需要使用ListView控件.
2.
TreeView控件TreeView控件,又称为树控件,它可以为用户显示节点层次结构,而每个节点又可以包含子节点,包含子节点的节点叫父节点,其效果就像在Windows操作系统的Windows资源管理器功能的左窗口中显示文件和文件夹一样.
如图10-60为TreeView控件,其拖放到窗体中的效果如图10-61所示.
图10-60TreeView控件图10-61TreeView控件在窗体中的效果说明:TreeView控件经常用来设计Windows窗体的左侧导航菜单.
下面通过一个例子看一下如何使用TreeView控件.
【例10-23】创建一个Windows应用程序,在默认窗体中添加一个TreeView控件、一个ImageList控件和一个ContextMenuStrip控件,其中,TreeView控件用来显示部门结构,ImageList控件用来存储TreeView控件中用到的图片文件,ContextMenuStrip控件用来作为TreeView控件的快捷菜单.
代码如下.
(实例位置:光盘\MR\源码\第10章\10-23)privatevoidForm1_Load(objectsender,EventArgse){treeView1.
ContextMenuStrip=contextMenuStrip1;//设置树控件的快捷菜单TreeNodeTopNode=treeView1.
Nodes.
Add("公司");//建立一个顶级节点//建立4个基础节点,分别表示4个大的部门TreeNodeParentNode1=newTreeNode("人事部");TreeNodeParentNode2=newTreeNode("财务部");TreeNodeParentNode3=newTreeNode("基础部");TreeNodeParentNode4=newTreeNode("软件开发部");//将4个基础节点添加到顶级节点中TopNode.
Nodes.
Add(ParentNode1);TopNode.
Nodes.
Add(ParentNode2);TopNode.
Nodes.
Add(ParentNode3);TopNode.
Nodes.
Add(ParentNode4);//建立6个子节点,分别表示6个部门TreeNodeChildNode1=newTreeNode("C#部门");TreeNodeChildNode2=newTreeNode("ASP.
NET部门");TreeNodeChildNode3=newTreeNode("VB部门");TreeNodeChildNode4=newTreeNode("VC部门");TreeNodeChildNode5=newTreeNode("JAVA部门");TreeNodeChildNode6=newTreeNode("PHP部门");//将6个子节点添加到对应的基础节点中ParentNode4.
Nodes.
Add(ChildNode1);ParentNode4.
Nodes.
Add(ChildNode2);ParentNode4.
Nodes.
Add(ChildNode3);ParentNode4.
Nodes.
Add(ChildNode4);ParentNode4.
Nodes.
Add(ChildNode5);ParentNode4.
Nodes.
Add(ChildNode6);//设置imageList1控件中显示的图像imageList1.
Images.
Add(Image.
FromFile("1.
png"));imageList1.
Images.
Add(Image.
FromFile("2.
png"));//设置treeView1的ImageList属性为imageList1treeView1.
ImageList=imageList1;imageList1.
ImageSize=newSize(16,16);//设置treeView1控件节点的图标在imageList1控件中的索引是0treeView1.
ImageIndex=0;//选择某个节点后显示的图标在imageList1控件中的索引是1treeView1.
SelectedImageIndex=1;}privatevoidtreeView1_AfterSelect(objectsender,TreeViewEventArgse){//在AfterSelect事件中获取控件中选中节点显示的文本label1.
Text="选择的部门:"+e.
Node.
Text;}privatevoid全部展开ToolStripMenuItem_Click(objectsender,EventArgse){treeView1.
ExpandAll();//展开所有树节点}privatevoid全部折叠ToolStripMenuItem_Click(objectsender,EventArgse){treeView1.
CollapseAll();//折叠所有树节点}程序运行结果如图10-62所示.
图10-62使用TreeView控件显示部门结构ImageList组件,又称为图片存储组件,它主要用于存储图片资源,然后在控件上显示出来,这样就简化了对图片的管理.
ImageList组件的主要属性是Images,它包含关联控件将要使用的图片.
每个单独的图片可以通过其索引值或键值来访问;另外,ImageList组件中的所有图片都将以同样的大小显示,该大小由其ImageSize属性设置,较大的图片将缩小至适当的尺寸.
如图10-63为ImageList组件.
图10-63ImageList组件ImageList组件的常用属性及说明如表10-4所示.
表10-4ImageList组件的常用属性及说明10.
5.
3ImageList组件属性说明ColorDepth获取图像列表的颜色深度Images获取此图像列表的ImageList.
ImageCollectionImageSize获取或设置图像列表中的图像大小ImageStream获取与此图像列表关联的ImageListStreamer下面通过一个例子看一下如何使用ImageList组件.
【例10-24】创建一个Windows应用程序,在默认窗体中添加一个PictureBox控件、3个Button控件和一个ImageList组件,其中PictureBox控件用来显示图像,Button控件用来执行加载图像一、图像二和移除图像功能,ImageList组件用来存储图像集合.
代码如下.
(实例位置:光盘\MR\源码\第10章\10-24)privatevoidForm1_Load(objectsender,EventArgse){imageList1.
ColorDepth=ColorDepth.
Depth32Bit;//设置图像的颜色深度}privatevoidbutton1_Click(objectsender,EventArgse){imageList1.
Images.
Clear();//清除图像stringPath="01.
jpg";//设置要加载的第一张图片的路径Imageimg=Image.
FromFile(Path,true);//创建一个Image对象//使用Images属性的Add方法向控件中添加图像imageList1.
Images.
Add(img);imageList1.
ImageSize=newSize(215,135);//设置显示图片的大小//设置pictureBox1的图像索引是imageList1控件索引为0的图片pictureBox1.
Image=imageList1.
Images[0];}privatevoidbutton2_Click(objectsender,EventArgse){imageList1.
Images.
Clear();//清除图像stringPath="02.
jpg";//设置要加载的第二张图片的路径Imageimg=Image.
FromFile(Path,true);//创建一个Image对象imageList1.
Images.
Add(img);//使用Add方法向控件中添加图像imageList1.
ImageSize=newSize(215,135);//设置显示图片的大小//设置pictureBox1的图像索引是imageList1控件索引为1的图片pictureBox1.
Image=imageList1.
Images[0];}privatevoidbutton3_Click(objectsender,EventArgse){imageList1.
Images.
RemoveAt(0);//使用RemoveAt方法移除图像pictureBox1.
Image=null;//清空图像}程序运行结果如图10-64、图10-65和图10-661所示.
图10-64加载图像一图10-65加载图像二图10-66移除图像说明:对于一些经常用到图片或图标的控件,经常与ImageList组件一起使用,比如在使用工具栏控件、树控件和列表控件等时,经常使用ImageList组件存储它们需要用到的一些图片或图标,然后在程序中通过ImageList组件的索引项来方便的获取需要的图片或图标.
Timer组件又称作计时器组件,它可以定期引发事件,时间间隔的长度由其Interval属性定义,其属性值以毫秒为单位.
若启用了该组件,则每个时间间隔引发一次Tick事件,开发人员可以在Tick事件中添加要执行操作的代码.
如图10-67为Timer组件.
图10-67Timer组件Timer组件的常用属性及说明如表10-5所示.
表10-5Timer组件的常用属性及说明Timer组件的常用方法及说明如表10-6所示.
表10-6Timer组件的常用方法及说明10.
5.
4Timer组件属性说明Enabled获取或设置计时器是否正在运行Interval获取或设置在相对于上一次发生的Tick事件引发Tick事件之前的时间(以毫秒为单位)方法说明Start启动计时器Stop停止计时器Timer组件的常用事件及说明如表10-7所示.
表10-7Timer组件的常用事件及说明下面通过一个例子看一下如何使用Timer组件实现一个简单的倒计时程序.
【例10-25】创建一个Windows应用程序,在默认窗体中添加两个Label控件、3个NumericUpDown控件、一个Button控件和两个Timer组件,其中Label控件用来显示系统当前时间和倒计时,NumericUpDown控件用来选择时、分、秒,Button控件用来设置倒计时,Timer组件用来控制实时显示系统当前时间和实时显示倒计时.
代码如下.
(实例位置:光盘\MR\源码\第10章\10-25)//定义两个DateTime类型的变量,分别用来记录当前时间和设置的到期时间DateTimedtNow,dtSet;privatevoidForm1_Load(objectsender,EventArgse){//设置timer1计时器的执行时间间隔timer1.
Interval=1000;timer1.
Enabled=true;事件说明Tick当指定的计时器间隔已过去而且计时器处于启用状态时发生//启动timer1计时器numericUpDown1.
Value=DateTime.
Now.
Hour;//显示当前时numericUpDown2.
Value=DateTime.
Now.
Minute;//显示当前分numericUpDown3.
Value=DateTime.
Now.
Second;//显示当前秒}privatevoidbutton1_Click(objectsender,EventArgse){if(button1.
Text=="设置")//判断文本是否为"设置"{button1.
Text="停止";//设置按钮的文本为停止timer2.
Start();/启动timer2计时器}elseif(button1.
Text=="停止")//判断文本是否为停止{button1.
Text="设置";//设置按钮的文本为设置timer2.
Stop();//停止timer2计时器label3.
Text="倒计时已取消";}}privatevoidtimer1_Tick(objectsender,EventArgse){label7.
Text=DateTime.
Now.
ToLongTimeString();//显示系统时间dtNow=Convert.
ToDateTime(label7.
Text);//记录系统时间}privatevoidtimer2_Tick(objectsender,EventArgse){//记录设置的到期时间dtSet=Convert.
ToDateTime(numericUpDown1.
Value+":"+numericUpDown2.
Value+":"+numericUpDown3.
Value);//计算倒计时longcountdown=DateAndTime.
DateDiff(DateInterval.
Second,dtNow,dtSet,FirstDayOfWeek.
Monday,FirstWeekOfYear.
FirstFourDays);if(countdown>0)//判断倒计时时间是否大于0label3.
Text="倒计时已设置,剩余"+countdown+"秒";//显示倒计时elselabel3.
Text="倒计时已到";}说明:由于本程序中用到DateAndTime类,所以首先需要添加Microsoft.
VisualBasic命名空间.
这里需要注意的是,在添加Microsoft.
VisualBasic命名空间之前,首先需要在"添加引用"对话框中的".
NET"选项卡中添加Microsoft.
VisualBasic组件引用,因为Microsoft.
VisualBasic命名空间位于Microsoft.
VisualBasic组件中.
程序运行结果如图10-68所示.
在第四章中,我们讲解了使用控制台来实现模拟系统登录,但那种方式极少用到,通常都使用Windows窗体来实现系统登录控制,本实例就制作一个Windows登录窗口(即进销存管理系统登录窗口),其运行效果如图10-69所示.
图10-69进销存管理系统登录窗口程序开发步骤如下:(1)创建一个Windows窗体应用程序,项目命名为LoginForm.
(2)把默认窗体Form1更名为frmLogin,该窗体用来实现用户的登录校验功能,然后在其上面添加一个GroupBox控件,接着在该控件中添加两个TextBox控件、两个Label控件和两个Button控件,分别用来输入登录信息(用户名和10.
6综合实例——进销存管理系统登录窗口密码)、标注信息(提示用户名和密码)和功能操作(登录和退出操作).
(3)另外,在LoginForm项目中,再添加一个窗体,并命名为frmMain,用来作为登录成功后所显示的系统主窗体.
(4)在frmLogin窗体中,单击"登录"按钮,程序首先判断用户名是否为空,若不为空,则再判断用户名和密码是否正确,其中主要代码如下:privatevoidbtnLogin_Click(objectsender,EventArgse)//单击"登录"按钮{if(txtUserName.
Text==string.
Empty)//若用户名为空{MessageBox.
Show("用户名称不能为空!
","错误提示",MessageBoxButtons.
OK,MessageBoxIcon.
Error);//提示不许用户名为空return;}//判断用户名和密码是否正确if(txtUserName.
Text=="mr"&&txtUserPwd.
Text=="mrsoft"){frmMainmain=newfrmMain();//实例化主窗体main.
Show();//显示主窗体this.
Visible=false;//隐藏登录窗体}Else//若用户名或密码错误{MessageBox.
Show("用户名称或密码不正确!
","错误提示",MessageBoxButtons.
OK,MessageBoxIcon.
Error);//提示用户名或密码错误}}(1)在Windows窗体应用程序中,窗体是向用户显示信息的可视界面,它是Windows窗体应用程序的基本单元.
(2)窗体是用户设计程序外观的操作界面,根据不用的需求,可以使用不用类型的Windows窗体.
根据Windows窗体的显示状态,可以分为模式窗体和非模式窗体.
imidc怎么样?imidc彩虹网路,rainbow cloud知名服务器提供商。自营多地区数据中心,是 Apnic RIPE Afrinic Arin 认证服务商。拥有丰富的网路资源。 在2021年 6.18 开启了输血大促销,促销区域包括 香港 台湾 日本 莫斯科 等地促销机型为 E3係,参与促销地区有 香港 日本 台湾 莫斯科 等地, 限量50台,售罄为止,先到先得。所有服务器配置 CPU ...
vollcloud LLC创立于2020年,是一家以互联网基础业务服务为主的 技术型企业,运营全球数据中心业务。致力于全球服务器租用、托管及云计算、DDOS安 全防护、数据实时存储、 高防服务器加速、域名、智能高防服务器、网络安全服务解决方案等领域的智 能化、规范化的体验服务。所有购买年付产品免费更换香港原生IP(支持解锁奈飞),商家承诺,支持3天内无条件退款(原路退回)!点击进入:vollclo...
运作了18年的德国老牌机房contabo在继去年4月开办了第一个美国数据中心(中部城市:圣路易斯)后立马在本月全新上马两个数据中心:纽约、西雅图。当前,为庆祝美国独立日,美国三个数据中心的VPS全部免除设置费,VPS本身的配置很高,价格适中,有较高的性价比!官方网站:https://contabo.com/en/SSD VPSKVM虚拟,纯SSD阵列,不限制流量,自带一个IPv4内存CPUSSD带...