控件概述:
学习可视化编程技术,最重要的是学习控件的使用。
在Visual Studio集成开发环境中,提供了大量控件。
控件均为类,从工具箱拖拽到窗体则实例化出一个控件对象。
常用控件分类:
| 控件分类 | 说明 |
|---|---|
| 文本类控件 | 用于在控件上显示文本,如TextBox、Label 、 |
| 选择类控件 | 用于提供界面让用户进行选择 |
| 分组控件 | 用于对窗体中的控件进行分组,如GroupBox、Panel等 |
| 菜单 | 用于为系统制作功能菜单,如菜单栏、右键菜单 |
| 工具栏 | 用于提供主菜单中常用的相关工具 |
| 状态栏 | 用于显示程序的相关信息,如当前用户、当前时间等 |
控件的基本操作:
添加控件:从工具箱中单击某控件并将其拖拽到窗体合适位置
删除控件:选择控件,右键→删除或按下“Delete”键
对齐控件:选择控件,格式菜单→对齐
锁定控件:选择控件,右键→锁定控件
一、文本类控件
AutoSize: 设置为true 自动尺寸,大小被文本撑开,设置为false,可以手动拖拽设置大小
BackColor:设置背景颜色
Font:设置字体样式和字体大小
ForeColor:字体颜色
TextAlign:设置文本对齐方式
标签控件 (Label) :
主要用于在窗体上显示用户不能编辑的文本。
通过Text属性,可以设置或读取标签的文本。
通过Visible属性,可以显示或隐藏标签。
文本框控件(TextBox):
Text属性用于设置或获取用户输入的文本。
ReadOnly属性,指定文本框是否允许编辑。
Multiline属性,设置为true,表示可以多行输入,可以调整大小
创建密码文本框:
(1)UseSystemPasswordChar属性设置为True。
(2)PasswordChar属性设置为“*”。
按钮控件(Button):
按钮控件允许用户通过单击来执行操作,单击按钮,触发Click事件。。
Text属性用于设置按钮上的显示文本。
BackColor属性用于设置按钮背景的颜色
BackgroundImage属性设置按钮图像。
BackgroundImageLayout属性用于指定按钮图像的布局方式。
二、菜单栏
菜单概述:
通常用于显示程序的各项功能,以方便用户选择执行。
菜单是组织大量选项最常用的方式。
菜单通常分为下拉式菜单和弹出式菜单:
下拉式菜单(MenuStrip):
通常出现在应用程序的顶部。
主要由菜单栏、主菜单、子菜单和快捷键组成。
快捷键格式:设置ShortcutKeys属性。
弹出式菜单(ContextMenuScript):
弹出式菜单,也称为右键快捷菜单。
点击右键时弹出,其位置由鼠标点击的位置决定。
其结构与下拉式菜单基本相同。
需要将弹出是菜单与什么控件关联,则设置该控件的"ContextMenuStrip"属性为菜单名字,如果直接与窗体关联,则直接设置窗体的"ContextMenuStrip"属性为菜单名字。
响应菜单命令:
无论是下拉菜单还是弹出式菜单,通常使用菜单项的单击事件来响应菜单命令。
实现思路与按钮的单击事件类似。
例如点击某个菜单需要打开一个新的窗体,示例代码如下:
private void MToolStripMenuItem_Click(object sender, EventArgs e)
{
Form frm = new Form();
putoutForm.Show();
}
三、工具栏(ToolStrip)
为用户提供了应用程序中常用菜单命令的快速访问方式。
通常位于菜单栏的下方,由许多命令按钮组成,每个按钮上都有一个代表功能的小图标。
工具栏相应菜单命令和菜单栏类似。
四、状态栏(StatusStrip)
状态栏通常用于显示应用程序的系统信息。
如操作员信息、软件版本号、当前日期和欢迎信息等。
状态栏通常位于应用程序的窗口底部。
例如需要在状态栏显示欢迎信息以及当前时间,可以:
(1)选择显示项的类型,显示文本一般使用“StatusLabel”。
(2)在窗体的加载事件中编写如下代码:
private void Form1_Load(object sender, EventArgs e)
{
this.toolStripStatusLabel1.Text = string.Format("当前系统日期:{0},欢迎使用商品库存管理系统", DateTime.Now.ToShortDateString());
}
五、分组控件
分组控件作为一个容器,可以对窗体中的控件进行分组。
GroupBox:
作为一个容器,可以拖放其他控件到其中,起到分组的作用,可以通过Text属性设置左上角的文本。
Panel:
作为一个容器,可以拖放其他控件到其中,起到分组的作用,当内部的控件超出panel区域的时候可以通过 AutoScroll=true , AutoSize=false 两个属性出现滚动条。
GroupBox和Panel还可以将多个单选框进行分组,从而实现多个多选一的功能,而不是一个多选一的功能,关于此功能会在选择类控件中进行详细讲解。
TabControl:
提供一个选项卡式页面以有效地组织和访问已分组对象。
TabPages属性中的Text用于设置选项卡的名称
SplitContaine:
提供用可移动拆分条分隔的两个面板。
TableLayoutPanel:
表示一个面板,它可以在一个由行和列组成的网格中对其内容进行动态布局
FlowLayoutPanel:
表示一个沿水平或垂直方向动态排放其内容的面板。
FlowDirection 设置子控件的排列方式
Dock和Anchor属性
Anchor:锚定,将控件固定于某个位置。
默认Anchor属性设置为Top, Left。
-
设置控件的Anchor属性为Top
当窗口大小改变时,该控件锚定与窗口的上方,即与父窗口的上边距Top保持不变。
-
设置控件的Anchor属性为Bottom, Right
控件Anchor属性设置为锚定什么位置,就表示控件和其父窗口该位置的距离保持不变。
Dock:停靠,将控件停靠在一侧或中央。
默认Dock属性设置为None。共有上(Top)、下(Bottom)、左(Left)、右(Right)、中(Fill)、无(None)6个选项。
停靠于左右两侧时,可以调整控件宽度;停靠于上下两侧时,可以调整控件高度。
注意:当设置Dock属性时,Anchor属性无效。
六、选择类控件
在开发Windows应用程序时,通常需要提供界面让用户进行选择,此时需要使用选择类控件。
文本项和图形项(图标)列表(ListBox )
显示一个文本项和图形项(图标)列表。
下拉组合框控件(ComboBox):
下拉组合框控件用于为用户提供选择列表,用户可以选择列表中的某一项或输入文本值。
向ComboBox中添加选择项,有两种方式:
(1)设计器中通过界面添加选择项,找到Items属性设置选择项。
(2)通过代码添加选择项
//窗体的Load事件
private void Form1_Load(object sender, EventArgs e)
{
//窗体加载时,向ComboBox中添加选择项
this.cb_type.Items.Add("日用百货");
this.cb_type.Items.Add("服装鞋袜");
this.cb_type.Items.Add("数码产品");
this.cb_type.Items.Add("母婴用品");
}
DropDownStyle属性:
用于设置ComboBox的下拉样式,ComboBox支持三种下拉样式:
| 属性值 | 说明 |
|---|---|
| Simple | ComboBox列表部分总是可见 |
| DropDown(默认值) | 用户可以编辑控件的文本框部分,单击箭头才显示列表 |
| DropDownList | 用户不可以编辑控件的文本框部分,只能点击箭头选择一项 |
响应选项值更改事件:
例如实现如下效果,当combobox中的值发生改变时,在右边的Label中显示改变之后的值。

实现步骤如下:
(1)在设计器中双击下拉组合框控件,添加SelectedIndexChange事件。
(2)向窗体中添加一个标签控件Label,用于显示选中的商品类别。
(3)在SelectedIndexChange事件处理函数中编写代码。
(4)为了防止选项的文本被随意编辑,将ComboBox的DropDownStyle属性设置为DropDownList。
private void cb_type_SelectedIndexChanged(object sender, EventArgs e)
{
//获取选中的商品类别
string selectedType = this.cb_type.Text;
//显示到Label中
this.lbl_type.Text = selectedType;
}
复选框控件(CheckBox):
用于为用户提供多项选择,Text属性用于指定控件右侧文本,Checked属性可以控制其选中状态,选中状态发生变化时,将触发CheckedChanged事件。
例如我要实现如下效果,当点击"添加"按钮的时候,弹出一个对话框,显示我选择的所有促销时段:

实现步骤如下:
(1)向窗体中添加四个CheckBox控件
(2)按界面要求,分别设置Text属性值
(3)为“添加”按钮添加Click单击事件,在事件处理函数中编写代码
//方案一:一个一个判断
private void button3_Click(object sender, EventArgs e)
{
string promotionTime = "";
if (this.checkBox1.Checked)
promotionTime += this.checkBox1.Text + ",";
if (this.checkBox2.Checked)
promotionTime += this.checkBox2.Text + ",";
if (this.checkBox3.Checked)
promotionTime += this.checkBox3.Text + ",";
if (this.checkBox4.Checked)
promotionTime += this.checkBox4.Text + ",";
//弹出对话框,显示最终的促销时段
MessageBox.Show("促销时段:" + promotionTime);
}
//方案二:将checkbox放入panel,循环遍历panel中的控件进行判断
private void button3_Click(object sender, EventArgs e)
{
foreach (CheckBox item in panel1.Controls)
{
string promotionTime = "";
if(item.Checked == true)
promotionTime += item.Text + ",";
}
MessageBox.Show("促销时段:" + promotionTime);
}
单选框控件(RadioButton)
用于为用户提供唯一选择,Text属性用于指定按钮右侧文本,Checked属性用于控制其选中状态,当选中状态发生更改时,将触发CheckedChanged事件。
例如我要实现如下效果,当用户点击"添加"按钮的时候,弹出对话框展示用户选择的促销方案:

实现步骤如下:
(1)向窗体中添加5个RadioButton控件。
(2)分别设置Text属性描述促销方案的名称。
(3)窗体加载时默认选中第一种促销方案,在窗体的Load事件中,设置Checked属性为true。
private void Form1_Load(object sender, EventArgs e)
{
//窗体加载时,默认选择第一种促销方案
this.radioButton1.Checked = true;
}
(4)为“添加”按钮添加Click单击事件,在事件处理函数中编写代码
--方案一:每个单选框去判断
private void btAdd_Click(object sender, EventArgs e)
{
if(this.radioButton1.Checked== true)
MessageBox.Show("促销方案:" + this.radioButton1.Text);
if (this.radioButton2.Checked == true)
MessageBox.Show("促销方案:" + this.radioButton2.Text);
if (this.radioButton3.Checked == true)
MessageBox.Show("促销方案:" + this.radioButton3.Text);
if (this.radioButton4.Checked == true)
MessageBox.Show("促销方案:" + this.radioButton4.Text);
if (this.radioButton5.Checked == true)
MessageBox.Show("促销方案:" + this.radioButton5.Text);
}
--方案二:将所有单选框放入panel中,循环panel中的控件进行判断
private void btAdd_Click(object sender, EventArgs e)
{
foreach (RadioButton item in this.panel2.Controls)
{
if (item.Checked == true)
{
MessageBox.Show("促销方案:" + item.Text);
break;
}
}
}
单选按钮分组问题:

如上图的设计,原本的逻辑是性别二选一,学历三选一,但是实际效果会变成5个单选框5选1。
为了解决此问题,可以分别将性别的两个单选框和学历的三个单选框分别用GroupBox或Panel包含起来进行单选框的分组,实现,原本的用户希望的逻辑。
七、图片框PictureBox控件
用于在窗体的指定位置显示图片,其为不可编辑的控件,无法获得焦点。
图片框PictureBox的常用属性:
| 属性 | 说明 |
|---|---|
| Imgae | 用于设置显示在图片框控件上的图像 |
| ImageLocation | 用于设置显示在图片框控件上的图像的路径 |
| SizeMode | 用于设置图像位置和控件大小 |
其中SizeMode属性包含5个属性值:
| 属性值 | 说明 |
|---|---|
| Normal | 图像被置于PictureBox的左上角。如果图像比包含它的PictureBox大,则该图像将被裁剪掉。 |
| StretchImage | PictureBox中的图像被拉伸或收缩,以适应PictureBox的大小。 |
| AutoSize | 调整PictureBox的大小,使其等于所包含的图像大小。 |
| CenterImage | 如果PictureBox比图像大,则图像将居中显示。如果PictureBox比图像小,则图像将居中显示并裁剪掉超出的部分。 |
| Zoom | 图像大小按其原有的长宽比例被等比例放大或缩小。 |
使用PictureBox显示图片步骤:
(1)从工具箱拖拽PictureBox控件到窗体内
(2)点击PictureBox右上角小三角,弹出快捷菜单
(3)指定PictureBox需要显示的图像和大小模式
使用PictureBox显示图像需要注意的地方:
(1)PictureBox控件的图像可以设置Image属性,也可以设置ImageLocation属性。
(2)区别在于Image属性是图像对象类型,而ImageLocation属性是图像路径,是文本类型。
(3)右上角小三角“选择图像”,指定的是Image属性。
八、图片集ImageList控件
思考:PictureBox控件中只能存储一张图片,如果需要对多张图片进行展示,如何存储多张图片?
我们可以使用图片集ImageList控件,用于存储多个图像资源,是一个图像集,通过索引访问图像集中的图片。
ImageList控件的常用属性:
| 属性 | 说明 |
|---|---|
| Images | 存储在控件中的图像集合 |
| ImageSize | 图像集中图像的大小,最大值为256*256 |
| ColorDepth | 图像集中图像的颜色深度 |
注意:
(1)图像资源存储于Images属性中,它是一个图片集合。
(2)图片集中的图像可通过其索引值或其键值进行访问。
(3)所有图像都将以相同大小显示,由ImageSize属性设置。
案例: 使用ImageList控件制作图片查看器

实现步骤:
(1)向ImageList控件中添加图像。
【1】向窗体中添加图像集ImageList控件。
【2】在设计器中, 点击其右上角的小三角,弹出快捷菜单。
【3】选择需要添加的图片,并设置图片的大小和颜色深度。
(2)展示ImageList控件中的图像。
【1】按照截图效果,拖动控件,对图片浏览窗体进行布局。
【2】窗体加载时,显示第一张图片,并将“上一张”按钮置为不可用。
//图片浏览窗体Load事件处理函数
private void ImageListForm_Load(object sender, EventArgs e)
{
//窗体加载后,默认显示第一张图片
this.pic_animation.Image = this.imageList1.Images[0];
//显示第一张图像,“上一张”按钮不可用
this.btn_pre.Enabled = false;
}
【3】点击“上一张”、“下一张”按钮,实现图片切换效果。
private int currentIndex = 0;
private void btnPrev_Click(object sender, EventArgs e)
{
currentIndex--; //当前图片索引减一
SetButtonEnable(); //设置按钮是否可用
//将当前图像显示到图片框中
this.pic_animation.Image = this.imageList1.Images[currentIndex];
}
private void btnNext_Click(object sender, EventArgs e)
{
currentIndex++; //当前图片索引加一
SetButtonEnable(); //设置按钮是否可用
//将当前图像显示到图片框中
this.pic_animation.Image = this.imageList1.Images[currentIndex];
}
【4】编写判断“上一张”、“下一张”按钮是否可用的方法,提供给上一张,下一张按钮调用。
private void SetButtonEnable()
{
this.btnPrev.Enabled = true;
this.btnNext.Enabled = true;
if(currentIndex == 0)
this.btnPrev.Enabled = false;
if (currentIndex == this.imageList1.Images.Count - 1)
this.btnNext.Enabled = false;
}
九、计时器Timer控件
按用户定义的时间间隔引发事件的控件,程序每隔一定时间重复执行一个操作。
Timer控件的常用属性、方法和事件:
| 属性 | 说明 |
|---|---|
| Interval | 事件发生的间隔(频率),以毫秒为单位 |
| Enable | 设置计时器是否启用,布尔类型 |
| 方法 | 说明 |
|---|---|
| Start() | 启动计时器 |
| Stop() | 停止计时器 |
| 事件 | 说明 |
|---|---|
| Tick | 定时间隔到,自动引发的事件 |
案例:使用Timer控件制作电子时钟

实现步骤:
(1)向窗体内添加标签Label控件,用于显示当前时间,并且设置Label控件的字体大小、颜色、字体等属性。
(2)向窗体内添加计时器Timer控件,用于定时引发事件,指定间隔事件1秒:Interval属性设置为1000(单位:毫秒),添加Tick事件,在事件处理函数中更新当前时间。
//窗体加载的时候显示时间
private void TimerForm_Load(object sender, EventArgs e)
{
this.lbl_clock.Text = DateTime.Now.ToString("yyyy年MM月dd日 hh:mm:ss");
}
//每隔一秒钟显示时间
private void timer1_Tick(object sender, EventArgs e)
{
//获取系统当前时间,格式化后,显示到Label中
this.lbl_clock.Text = DateTime.Now.ToString("yyyy年MM月dd日HH:mm:ss");
}
(3)窗体加载后启动定时器 方法1:设置Timer控件的Enable属性为true 方法2:在窗体Load事件中使用timer控件.Start()方法启动定时器
private void TimerForm_Load(object sender, EventArgs e)
{
this.timer1.Start();
}
十、系统托盘NotifyIcon控件

软件启动后会在系统右下角创建一个小图标,称为系统托盘,当软件在后台运行时,可以通过系统托盘对软件进行相关操作。
NotifyIcon控件的常用属性:
| 属性 | 说明 |
|---|---|
| Icon | 将在系统栏中显示的图标,必须为ico格式文件 |
| Text | 当鼠标悬停在图标上时,显示的文本 |
| ContentMenuScript | 与系统托盘图标相关联的右键快捷菜单 |
案例:为之前的程序添加系统托盘
需求:
(1)程序运行后,在系统任务栏右下角启动托盘图标 。
(2)鼠标悬停在图标上时,显示软件名称。
(3)在系统托盘上点击右键,弹出右键快捷菜单,右键菜单包括“关于”和“退出”两个菜单项 ,点击"关于"弹出一个软件介绍的新窗体,点击"退出"退出整个应用程序。
实现步骤:
(1)向窗体中添加NotifyIcon控件,设置系统托盘的图标和文本。
(2)向图片浏览窗体中加入右键快捷菜单ContextMenuScript,并且添加菜单项"关于"和"退出"。
(3)设置NotifyIcon控件的ConTextMenuStrip属性,将右键快捷菜单与系统托盘关联。
(4)编写菜单相应代码:
//“关于”菜单项单击事件处理函数
private void 关于ToolStripMenuItem_Click(object sender, EventArgs e)
{
FrmAbout frm = new FrmAbout();
frm.show();
}
//“退出”菜单项单击事件处理函数
private void 退出ToolStripMenuItem_Click(object sender, EventArgs e)
{
Application.Exit();
}

524

被折叠的 条评论
为什么被折叠?



