Windows窗体及标签控件
一般来说,一个完整的Windows应用程序的设计过程是:在项目中添加Windows窗体,向窗体加入用户操作的控件,分别设置窗体和控件的属性,在事件处理程序编程,在程序中调用各个对象的方法。
一、Windows窗体
窗体可以理解为一个窗口或一个应用程序的界面。当创建一个Windows应用程序项目时,系统自动为项目提供一个窗体,若应用程序需要增加窗体时,需要使用菜单:项目->添加Windows窗体->Windows窗体->打开,即可向项目中增加一个窗体。
窗体类的命名空间在System.Windows.Forms。
二、窗体的属性和事件
窗体有许多属性可以用来对窗体进行设置,以便使窗体符合程序的需要。以下仅列出最常用的几个:
属性名 | 作用 |
Name | 标识窗体对象的名字,程序中用来指明是哪个窗体 |
Text | 显示在窗体标题条上的文字 |
StartPosition | 窗体显示在屏幕上的初始位置, |
BackColor | 设置背景颜色 |
ForeColor | 设置前景颜色 |
BackgroundImage | 设置背景图片 |
MaximizeBox | 设置窗体是否需要最大化按钮 |
MinimizeBox | 设置窗体是否需要最小化按钮 |
ControlBox | 设置窗体是否需要关闭按钮 |
窗体有许多事件可以利用,程序中可以对需要利用的事件编写事件处理程序,当该事件发生时,事件处理程序被调用,以实现预定的功能。以下仅列出最常用的几个事件:
事件名 | 含义 |
Load | 窗体载入时发生 |
Activated | 窗体被激活时发生 |
Click | 鼠标左键在窗体内单击时发生 |
DoubleClick | 鼠标左键在窗体内双击时发生 |
KeyDown | 键按下时发生 |
KeyUp | 键弹起时发生 |
KeyPress | 按键时发生 |
MouseMove | 在窗体内移动鼠标时发生 |
三、Label控件
Label控件称为标签,主要用来显示静态文字,这些文字用作指示性说明,或者是这些文字不允许用户修改。
Label控件最常用的属性如下:
属性名 | 作用 |
Name | 标识标签对象的名字,程序中用来指明是哪个标签 |
Text | 标签显示出来的文字 |
Font | 标签的字体和大小 |
ForeColor | 文字的颜色 |
Location | 标签在窗体中的位置 |
Size | 标签的大小 |
Visible | 标签的可见性,为true时可见,为false时不可见 |
标签也有许多事件,不过很少为标签的事件写程序。固此不多介绍。
四、Timer控件
Timer控件称计时器,其作用是用来计时,当程序中每隔一段时间就要做某一件事时,就使用它来控制。
计时器是在后台运行的控件,程序运行时总是不可见的,这类控件在设计状态时显示在窗体下部的架子上。
Timer控件的常用属性有3个:
属性名 | 作用 |
Name | 标识计时器对象的名字,程序中用来指明是哪个计时器 |
Interval | 设定时间间隔,单位为毫秒 |
Enabled | 设置可用性,true时可用,false时不可用 |
Timer控件的事件只有一个Tick,它每当指定的时间间隔时发生。这个事件的事件处理程序总是要写的,否则使用这个控件就失去了意义。
五、应用举例(时钟)
这里有一个实例,在一个窗体中动态显示当前的日期和时间。
System.DateTime rq=DateTime.Now;
int y=rq.Year;
int m=rq.Month;
int d=rq.Day;
label1.Text=y.ToString();
label3.Text=m.ToString();
label5.Text=d.ToString();
label7.Text=rq.TimeOfDay.ToString().Substring(0,8);
命令按钮和文本框控件
一、Button控件
Button控件称为命令按钮,主要用来启动一个命令(程序功能)。
Button控件有很多属性与标签是相同的,例如Name、Text、Font、BackColor、 ForeColor等,在程序中最常用的利用的属性是Enabled,为true时控件可用,为false时控件不可用(灰色显示)。
标签也有许多事件,常常只使用click,鼠标左键单击时发生,用来启动一项程序功能。
二、TextBox控件
TextBox控件称为文本框,主要用来接受用户的输入。
TextBox控件有很多属性与前述控件是相同的,例如Name、Text、Font、BackColor、 ForeColor、Location、Size等,除此之外还有一些属性也是常用的:
属性名 | 作用 |
Enabled | 控件是否可用 |
Visible | 控件是否可见 |
Multiline | 是否可以多行显示或输入 |
ReadOnly | 是否只读 |
PasswordChar | 输入口令时的掩盖字符 |
TextBox控件有很多事件可以使用,常常利用键盘和鼠标事件来判断用户的操作,以便程序作出正确的反映。
事件名 | 含义 |
DoubleClick | 双击控件时发生 |
Enter | 控件成为活动控件时发生 |
KeyDown | 首次按下某键时发生 |
KeyUp | 键弹起时发生 |
KeyPress | 完成按键时发生 |
MouseMove | 在控件内移动鼠标时发生 |
MouseDown | 按下鼠标按钮时发生 |
MouseEnter | 鼠标进入控件可见部分时发生 |
MouseLeave | 鼠标离开控件可见部分时发生 |
MouseHover | 鼠标在控件内停留一段时间后发生 |
TextBox控件有很多方法可以调用来实现特定的功能,常用的方法有:
方法名 | 功能 |
Clear | 从文本框中清除所有文本 |
Copy | 将文本框中选定的内容复制到剪贴板中 |
Cut | 将文本框中选定的内容剪切到剪贴板中 |
Focus | 将输入焦点于置文本框内 |
Paste | 用剪贴板中的内容替换文本框中当前选定的内容 |
Select | 选定文本框的一部分文字 |
SelectAll | 选定文本框的全部文字 |
Undo | 撤消在文本框中的上一次编辑操作 |
列表框和组合框
一、ListBox控件
ListBox控件称为列表框,主要用来供用户在列表中选择某些项。
ListBox控件的常用属性如下:
属性名 | 作用 |
DataSource | 该控件获取列表项的数据源,例如某个数据表的某列或某个数组 |
Items | 列表框中的各项 |
SelectIndex | 列表框中选定项的索引号,从0开始,未选中任何项时为-1 |
SelectItem | 列表框中的选定项 |
Text | 列表框中选定项的文本 |
ListBox控件的常用事件如下:
事件名 | 含义 |
DoubleClick | 双击控件时发生 |
Enter | 控件成为活动控件时发生 |
SelectIndexChange | 列表框中选择项的索引号变化时发生 |
ListBox控件的常用方法如下:
方法名 | 功能 |
ClearSelected | 撤消对列表框中所有选择项的选择 |
SetSelected | 设置或撤消对列表框中选择项的选择 |
对于ListBox控件的属性Items,它还带有一些十分有用的属性和方法。
ListBox控件的Items的常用方法如下:
方法名 | 功能 |
Add | 向Items添加列表项 |
RemoveAt | 从Items移除指定索引号的某项 |
Insert | 向Items插入列表项到指定索引处 |
Clear | 从Items移除所有列表项 |
Items有一个属性Count指明它有几项。
二、ComboBox控件
ComboBox控件称为组合框,它是文本框和列表框的组合,既可以接受用户的输入,也可以接受用户的选择。
组合框的属性、方法和事件与列表框是基本相同的。
菜单设计
菜单是组织应用程序功能的一种方法,Windows应用程序界面通常会通过菜单来使用程序的功能。
C#菜单分主菜单和弹出菜单(上下文菜单)两种。菜单可以由程序代码生成,也可以使用菜单控件直接编辑而成,后者使用简单快捷,是常用的菜单设计方式。
一、MainMenu控件
MainMenu控件称为主菜单,程序运行后主菜单显示在窗体的标题条下,供用户选择应用程序的功能。主菜单通常还有下一级的下拉菜单,每一个下拉菜单实际上是一个功能组。
1、编辑主菜单
将MainMenu控件拖入应用程序窗体,可以看到应用程序窗体下部增加了一个控件mainMenu1,此时应将窗体Form1的属性Menu设置为mainMenu1,否则程序运行时主菜单不可见。
选中mainMenu1,就可以在菜单编辑器上编辑菜单,只需在“请在此处输入”的空白处一级一级地输入,就可以完成主菜单的编辑。
编辑菜单项时,在Text属性中带有“(&字母)”项称为字母助记符,例如“文件(&F)”和“打开(&O)”,它的作用是通过助记符选中对应的菜单项。操作时,如果是窗体水平菜单条上的菜单项,按下Alt加助记符将选中该菜单,例如按Alt+F可选择“文件”菜单项;若菜单项是在下拉菜单上,则要在弹出下拉菜单后,直接按助记字母即可,例如在“文件”菜单组被下拉后,直接按O键可选中“打开”菜单项。
菜单名后的“…”表示启动该菜单功能后,会弹出一个对话框供用户作进一步的输入或选择,以便让程序明白用户要指定的操作目标。
MenuItem.Shortcut属性用来指定菜单功能的快捷键,即用快捷键代替菜单操作。例如指定“新建”菜单项的Shortcut属性为CtrlN后,在任何时刻按下Ctrl+N键都可以启动“新建”功能。
文件菜单组各菜单项的属性设置:
MenuItem.Name属性 | MenuItem.Text属性 | MenuItem.Shortcut属性 |
mainMenuItemNew | 新建(&N) | CtrlN |
mainMenuItemOpen | 打开(&O)… | CtrlO |
mainMenuItemSave | 保存(&S)… | CtrlS |
menuItem1 | - | None |
mainMenuItemExit | 退出(&X) | None |
编辑菜单组各菜单项的属性设置:
MenuItem.Name属性 | MenuItem.Text属性 | MenuItem.Shortcut属性 |
mainMenuItemUndo | 撤消(&U) | CtrlZ |
menuItem2 | - | None |
mainMenuItemCut | 剪切(&T)… | CtrlX |
mainMenuItemCopy | 复制(&C)… | CtrlC |
mainMenuItemPaste | 粘贴(&P) | CtrlV |
mainMenuItemDelete | 删除(&L) | Del |
menuItem3 | - | None |
mainMenuItemAll | 全选(&A) | CtrlA |
格式菜单组各菜单项的属性设置:
MenuItem.Name属性 | MenuItem.Text属性 | MenuItem.Shortcut属性 |
mainMenuItemFont | 字体(&F)… | None |
mainMenuItemColor | 颜色(&C)… | None |
主菜单编辑时的状态如下图:
2、编写菜单处理程序
要为某菜单项编写处理程序,只要为该项的Click事件处理程序写入代码即可。
二、ContextMenu控件
ContextMenu控件称为上下文菜单或弹出菜单,使用时通常是在某目标上单击右键,立即弹出上下文菜单,单击某菜单项即可实现对应的功能。
1、编辑上下文菜单
将ContextMenu控件拖入应用程序窗体,可以看到应用程序窗体下部增加了一个控件ContextMenu1。单击这个控件,在原先主菜单的位置出现上下文菜单,其编辑方法同主菜单。
上下文菜单组各菜单项的属性设置:
MenuItem.Name属性 | MenuItem.Text属性 |
contextMenuItemUndo | 撤消(&U) |
menuItem2 | - |
contextMenuItemCut | 剪切(&T)… |
contextMenuItemCopy | 复制(&C)… |
contextMenuItemPaste | 粘贴(&P) |
contextnMenuItemDelete | 删除(&L) |
2、上下文菜单的弹出
上下文菜单的弹出,通常是利用操作目标的右键单击事件。例如下段程序就是在窗体上击右键时便弹出上下文菜单contextMenu1。
... {
if(e.Button.ToString()=="Right")
...{ Point p=new Point(e.X,e.Y);
contextMenu1.Show(this,p);
}
}
1 、 上下文菜单的事件处理程序
菜单处理程序:
private void mainMenuItemExit_Click( object sender, System.EventArgs e)
... {
this.Close();
}
private void mainMenuItemUndo_Click( object sender, System.EventArgs e)
... {
if(textBoxEdit.CanUndo==true)
...{
//调用TextBox.Undo()方法,撤消上一次操作
textBoxEdit.Undo();
//清除缓冲区中有关撤消操作的信息
textBoxEdit.ClearUndo();
}
}
private void mainMenuItemCut_Click( object sender, System.EventArgs e)
... {
if(textBoxEdit.SelectedText!="")
...{
//调用TextBox.Cut()方法,剪切选中的文本
textBoxEdit.Cut();
}
}
private void mainMenuItemCopy_Click( object sender, System.EventArgs e)
... {
if(textBoxEdit.SelectionLength>0)
...{
//调用TextBox.Copy()方法,复制选中的文本
textBoxEdit.Copy();
}
}
private void mainMenuItemPaste_Click( object sender, System.EventArgs e)
... {
if(Clipboard.GetDataObject().GetDataPresent(DataFormats.Text)==true)
...{
textBoxEdit.Paste();
}
}
private void mainMenuItemDelete_Click( object sender, System.EventArgs e)
... {
int start=textBoxEdit.SelectionStart;
int count=textBoxEdit.SelectionLength;
textBoxEdit.Text=textBoxEdit.Text.Remove(start,count);
textBoxEdit.SelectionStart=start;
}
private void mainMenuItemAll_Click( object sender, System.EventArgs e)
... {
textBoxEdit.SelectAll();
}
private void textBox1_MouseDown( object sender, System.Windows.Forms.MouseEventArgs e)
... {
if(e.Button.ToString()=="Right")
...{
if(Clipboard.GetDataObject().GetDataPresent(DataFormats.Text))
contextMenuItemPaste.Enabled=true;
else
contextMenuItemPaste.Enabled=false;
if(textBoxEdit.SelectionLength>0)
...{
contextMenuItemCut.Enabled=true;
contextMenuItemCopy.Enabled=true;
contextMenuItemDelete.Enabled=true;
}
else
...{
contextMenuItemCut.Enabled=false;
contextMenuItemCopy.Enabled=false;
contextMenuItemDelete.Enabled=false;
}
if(textBoxEdit.CanUndo==true)
contextMenuItemUndo.Enabled=true;
else
contextMenuItemUndo.Enabled=false;
Point pt=new Point(e.X,e.Y);
contextMenu1.Show(textBoxEdit,pt);
}
}
private void contextMenuItemUndo_Click( object sender, System.EventArgs e)
... {
mainMenuItemUndo_Click(null,null);
}
private void contextMenuItemCut_Click( object sender, System.EventArgs e)
... {
mainMenuItemCut_Click(null,null);
}
private void contextMenuItemCopy_Click( object sender, System.EventArgs e)
... {
mainMenuItemCopy_Click(null,null);
}
private void contextMenuItemPaste_Click( object sender, System.EventArgs e)
... {
mainMenuItemPaste_Click(null,null);
}
private void contextMenuItemDelete_Click( object sender, System.EventArgs e)
... {
mainMenuItemDelete_Click(null,null);
}
一、 动态控制菜单
动态控制菜单指的是根据应用程序运行时的不同状态以不同形式来显示菜单。
1. 不同状态时窗体上显示不同的主菜单
要显示不同的主菜单,只要为窗体设计多个主菜单,根据应用程序的当前状态决定显示哪个主菜单。为了实现这一点,需要在程序中将当前的主菜单名赋给窗体的Menu属性。也可以只设计一个主菜单,当需要改变主菜单的某些项时,在程序中动态修改这个主菜单的这些项即可。
2. 某菜单项不满足使用条件时应以灰色显示
要以深色或灰色显示某个菜单项,需要将这个菜单项的Enabled属性设置为true或false,这当然需要依据当前是否符合使用该项功能的前提而定。
为了动态控制“编辑”菜单组中各菜单项的显示状态,可利用mainMenuItemEdit的Popup事件,即在该下拉菜单弹出时决定那些项以深色显示,那些项以灰色显示。
... {
if(Clipboard.GetDataObject().GetDataPresent(DataFormats.Text))
mainMenuItemPaste.Enabled=true;
else
mainMenuItemPaste.Enabled=false;
if(textBoxEdit.SelectionLength>0)
...{
mainMenuItemCut.Enabled=true;
mainMenuItemCopy.Enabled=true;
mainMenuItemDelete.Enabled=true;
}
else
...{
mainMenuItemCut.Enabled=false;
mainMenuItemCopy.Enabled=false;
mainMenuItemDelete.Enabled=false;
}
//根据文本框中是否可执行撤消操作
//决定mainMenuItemUndo是否可用
if(textBoxEdit.CanUndo==true)
mainMenuItemUndo.Enabled=true;
else
mainMenuItemUndo.Enabled=false;
}