WinForm 是 Windows Form 的简称,是基于 .NET Framework 平台的客户端(PC软件)开发技术,是 C#
语言中的一个重要应用。
.NET 提供了大量 Windows 风格的控件和事件,可以直接拿来使用。
Visual Studio中新建项目 - 选择Windows窗体应用。
在每一个 Windows 窗体应用程序的项目文件夹中,都会有一个默认的窗体框架代码文件 Form1.cs 和 窗体代码文件 Program.cs ,其包含了工程的起始代码框架.
注:每一个 Windows 窗体应用程序在运行时仅能指定一个启动窗体,设置启动窗体的方式是在项目的 Program.cs 文件中的main函数中指定。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WinFormLearning // 项目名
{
static class Program
{
///
/// 应用程序的主入口点。
///
[STAThread]
static void Main()
{
Application.EnableVisualStyles(); // 配置程序样式
Application.SetCompatibleTextRenderingDefault(false); // 配置控件参数
Application.Run(new Form1()); // 启动WinForm程序的启动窗体 Form1
}
}
}
与1.1.1 节
相反,在窗体设计器界面右击任意地方,选择“查看代码”,即可进入代码编辑界面;
菜单栏 - 视图 - 工具箱(快捷键:Ctrl +Alt +X),可查看可用的控件,若工具箱无控件,右击窗口选择”显示全部“。
在右键菜单中选择“选择项”命令,弹出如下图所示的对话框。
在该对话框中列出了不同组件中所带的控件,如果需要在工具箱中添加,直接选中相应组件名称前的复选框即可。
如果需要添加外部的控件,则单击“浏览”按钮,找到相应控件的 .dll 或 .exe 程序添加即可。
在 Windows 窗体应用程序中右击窗体或控件,在弹出的右键菜单中 选择“属性”命令,弹出如下图所示的属性面板。
窗体的常用属性如下表所示。
属性 | 作用 |
---|---|
Name | 窗体/空间的名称 |
WindowState | 获取或设置窗体的窗口状态,取值有3种,即Normal(正常)、Minimized(最小化)、Maximized(最大化),默认为 Normal,即正常显示 |
StartPosition | 获取或设置窗体运行时的起始位置,取值有 5 种,即 Manual(窗体位置由 Location 属性决定)、CenterScreen(屏幕居中)、WindowsDefaultLocation( Windows 默认位置)、WindowsDefaultBounds(Windows 默认位置,边界由 Windows 决定)、CenterParent(在父窗体中居中),默认为 WindowsDefaultLocation |
Text | 窗口标题栏中的文字 |
MaximizeBox | 获取或设置窗体标题栏右上角是否有最大化按钮,默认为 True |
MinimizeBox | 获取或设置窗体标题栏右上角是否有最小化按钮,默认为 True |
BackColor | 获取或设置窗体的背景色 |
BackgroundImage | 获取或设置窗体的背景图像 |
BackgroundImageLayout | 获取或设置图像布局,取值有 5 种,即 None(图片居左显示)、Tile(图像重复,默认值)、Stretch(拉伸)、Center(居中)、Zoom(按比例放大到合适大小) |
Enabled | 获取或设置窗体是否可用 |
Font | 获取或设置窗体上文字的字体 |
ForeColor | 获取或设置窗体上文字的颜色 |
Icon | 获取或设置窗体上显示的图标 |
属性 | 属性值 |
---|---|
Name | TestForm |
StartPosition | CenterScreen |
Text | 第一个窗体 |
MaximizeBox | False |
MinimizeBox | False |
Backgroundimage | 导入指定背景图片 |
BackgroundlmageLayout | Stretch |
Size | 265, 347(可调整) |
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WinFormLearning // 项目名
{
static class Program
{
///
/// 应用程序的主入口点。
///
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new TestForm()); // 启动WinForm程序 TestForm
}
}
}
在 Windows 窗体应用程序中系统已经自定义了一些事件,在窗体属性面板中单击闪电图标即可查看到窗体中的事件。
窗体中常用的事件为:
事件 | 作用 |
---|---|
Load | 窗体加载事件,在运行窗体时即可执行该事件 |
MouseClick | 鼠标单击事件 |
MouseDoubleClick | 鼠标双击事件 |
MouseMove | 鼠标移动事件 |
KeyDown | 键盘按下事件 |
KeyUp | 键盘释放事件 |
FormClosing | 窗体关闭事件,关闭窗体时发生 |
FormClosed | 窗体关闭事件,关闭窗体后发生 |
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WinFormLearning
{
public partial class TestForm : Form
{
public TestForm()
{
InitializeComponent();
}
private void TestForm_MouseClick(object sender, MouseEventArgs e)
{
}
private void TestForm_MouseDoubleClick(object sender, MouseEventArgs e)
{
}
}
}
this
关键字代表当前窗体的实例,BackColor 属性类型是 Color 枚举类型的:using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WinFormLearning
{
public partial class TestForm : Form
{
public TestForm()
{
InitializeComponent();
}
private void TestForm_MouseClick(object sender, MouseEventArgs e)
{
this.BackColor = Color.Red; // 设置窗体背景颜色为红色
}
private void TestForm_MouseDoubleClick(object sender, MouseEventArgs e)
{
this.BackColor = Color.Black; // 设置窗体背景颜色为红色
}
}
}
自定义的窗体都继承自 System.Windows.Form 类,能使用 Form 类中已有的成员,包括属性、方法、事件等。
窗体中也有一些从 System.Windows.Form 类继承的方法,如下表所示:
方法 | 作用 |
---|---|
void Show() | 显示窗体 |
void Hide() | 隐藏窗体 |
DialogResult ShowDialog() | 以对话框模式显示窗体 |
void CenterToParent() | 使窗体在父窗体边界内居中 |
void CenterToScreen() | 使窗体在当前屏幕上居中 |
void Activate() | 激活窗体并给予它焦点 |
void Close() | 关闭窗体 |
目标效果:使用上述创建的两个窗体Form1和TestForm,在 Form1 窗体中单击,弹出一个新窗体 TestForm。在新窗体中单击,将 TestForm 窗体居中,双击,关闭 TestForm 窗体。
Form1.cs:
// 设置Form1为工程启动窗体
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WinFormLearning
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_MouseClick(object sender, MouseEventArgs e) // 鼠标单击事件
{
//创建TestForm窗体实例
TestForm newForm = new TestForm();
//打开TestForm窗体
newForm.Show();
}
}
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WinFormLearning
{
public partial class TestForm : Form
{
public TestForm()
{
InitializeComponent();
}
private void TestForm_MouseClick(object sender, MouseEventArgs e)
{
this.CenterToScreen();
}
private void TestForm_MouseDoubleClick(object sender, MouseEventArgs e)
{
this.Close();
}
}
}
窗体的消息框通过 MessageBox 类来实现,在 MessageBox 类中仅定义了 Show 的多个重载方法,该方法的作用就是弹出一个消息框。由于 Show 方法是一个静态的方法,因此调用该方法只需要使用MessageBox.Show( 参数 )
的形式即可弹出消息框。消息框在显示时有不同的样式, 例如标题、图标、按钮等。
Show方法的重载和参数如下:
方法 | 说明 |
---|---|
DialogResult Show(string text) | 指定消息框中显示的文本(text) |
DialogResult Show(string text, string caption) | 指定消息框中显示的文本(text)以及消息框的标题(caption) |
DialogResult Show(string text, string caption, MessageBoxButtons buttons) | 指定消息框中显示的文本(text)、消息框的 标题(caption)以及消息框中显示的按钮 (buttons) |
DialogResult Show(string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon) | 指定消息框中显示的文本(text)、消息框的 标题(caption )、消息框中显示的按钮 (buttons)以及消息框中显示的图标(icon) |
在上面所列出方法的参数中还涉及两个枚举类型,一个是 MessageBoxButtons,一个是 MessageBoxIcon.
MessageBoxButtons 枚举类型主要用于设置消息框中显示的按钮,具体的枚举值如下:
MessageBoxIcon 枚举类型主要用于设置消息框中显示的图标,具体的枚举值如下:
调用 MessageBox 类中的 Show 方法将返回一个 DialogResult 类型的值。DialogResult 也是一个枚举类型,是消息框的返回值,通过单击消息框中不同的按钮得到不同的消息框返回值。
创建一个名为MessageForm的新窗体,配置主窗体的鼠标单击事件如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WinFormLearning
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_MouseClick(object sender, MouseEventArgs e) // 鼠标单击事件
{
//弹出消息框,并获取消息框的返回值
DialogResult dr = MessageBox.Show("是否打开新窗体?", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
//如果消息框返回值是Yes,显示新窗体
if (dr == DialogResult.Yes)
{
MessageForm messageForm = new MessageForm();
messageForm.Show();
}
//如果消息框返回值是No,关闭当前窗体
else if (dr == DialogResult.No)
{
//关闭当前窗体
this.Close();
}
}
}
}
由于在窗体中无法直接编写文本,通常使用标签控件来显示文本。在 Windows 窗体应用程序中,标签控件王要分为普通标签 (Label) 和超链接形式标签 (LinkLabel) 。
普通标签控件 (Label) 中的事件与窗体的事件类似,常用的事件主要有鼠标单击事件、 鼠标双击事件、标签上文本改变的事件等。与普通标签控件类似,超链接标签控件 (LinkLabel) 也具有相同的属性和事件。超链接标签主要应用的事件是鼠标单击事件,通过单击标签完成不同的操作,也即是超链接的操作。
点击窗体内的一个超链接,它的内容与另一个连接内容对调。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Diagnostics;
namespace WinFormLearning
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void label1_MouseClick(object sender, MouseEventArgs e)
{
//交换标签上的信息。
string temp = label1.Text;
label1.Text = label2.Text;
label2.Text = temp;
//Process.Start("http://www.baidu.com"); // 使用系统默认浏览器打开网址
}
}
}
文本框 (TextBox) 是在窗体中输入信息时最常用的控件,通过设置文本框属性可以实现多行文本框、密码框等。除了前面Label、LinkLabel一节介绍的控件属性以外,文本框还有一些不同的属性, 如下表所示:
属性名 | 作用 |
---|---|
Text | 文本框对象中显示的文本 |
MaxLength | 在文本框中最多输入的文本的字符个数 |
WordWrap | 文本框中的文本是否自动换行,如果是 True,则自动换行,如果是 False,则不能自动换行 |
PasswordChar | 将文本框中出现的字符使用指定的字符替换,通常会使用“*”字符 |
Multiline | 指定文本框是否为多行文本框,如果为 True,则为多行文本框,如果 为 False,则为单行文本框 |
ReadOnly | 指定文本框中的文本是否可以更改,如果为 True,则不能更改,即只读文本框,如果为 False,则允许更改文本框中的文本 |
Lines | 指定文本框中文本的行数 |
ScrollBars | 指定文本框中是否有滚动条,如果为 True,则有滚动条,如果为 False, 则没有滚动条 |
文本框控件最常使用的事件是文本改变事件 (TextChange),即在文本框控件中的内容改变时触发该事件。
在窗体中添加一个TextBox控件,在其事件属性中的TextChange事件中编写代码。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Diagnostics;
namespace WinFormLearning
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void label1_MouseClick(object sender, MouseEventArgs e)
{
Process.Start("http://www.baidu.com"); // 使用系统默认浏览器打开网址
}
private void label2_Click(object sender, EventArgs e)
{
// 交换标签上的信息。
string temp = label1.Text;
label1.Text = label2.Text;
label2.Text = temp;
}
private void textBox1_TextChanged(object sender, EventArgs e) //
{
// 将文本框中的文本值显示在标签中
label2.Text = textBox1.Text;
}
}
}
实际开发中可能需要在读取文本信息时需要保留原有的文本格式,这时候就不能使用普通的文本控件 (TextBox) 了,而需要使用富文本框控件 (RichTextBox) 来完成。
RichTextBox 控件在使用时与 TextBox 控件非常类似,除具有TextBox 控件的所有功能外,还能设定文字颜色、字体和段落格式,支持字符串查找功能,支持rtf格式等功能。
此外,在 RichTextBox 控件中还提供了文件加载和保存的方法,不需要使用文件流即可完成对文件的读写操作。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Diagnostics;
using System.IO;
namespace WinFormLearning
{
public partial class Form1 : Form
{
public Form1() // 窗体初始化函数
{
InitializeComponent();
}
private void button5_Click(object sender, EventArgs e)
{
DialogResult dr = openFileDialog1.ShowDialog();
//获取打开文件的文件名
string filename = openFileDialog1.FileName;
if (dr == System.Windows.Forms.DialogResult.OK && !string.IsNullOrEmpty(filename))
{
richTextBox1.LoadFile(filename, RichTextBoxStreamType.PlainText);
}
}
private void button6_Click(object sender, EventArgs e)
{
DialogResult dr = saveFileDialog1.ShowDialog();
//获取所保存文件的文件名
string filename = saveFileDialog1.FileName;
if (dr == System.Windows.Forms.DialogResult.OK && !string.IsNullOrEmpty(filename))
{
richTextBox1.SaveFile(filename, RichTextBoxStreamType.PlainText);
}
}
}
}
双击设计器中的按钮,即可跳转到该按钮被按下的函数内;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Diagnostics;
namespace WinFormLearning
{
public partial class Form1 : Form
{
public Form1() // 窗体初始化函数
{
InitializeComponent();
}
private void confirmButton_Click(object sender, EventArgs e)
{
string name = textBox1.Text;
string pwd = textBox2.Text;
string repwd = textBox3.Text;
if (string.IsNullOrEmpty(name))
{
MessageBox.Show("用户名不能为空!");
return;
}
else if (string.IsNullOrEmpty(textBox2.Text))
{
MessageBox.Show("密码不能为空!");
return;
}
else if (!textBox2.Text.Equals(textBox3.Text))
{
MessageBox.Show("两次输入的密码不一致!");
return;
}
//将用户名和密码传递到另一个窗体中
Form2 mainForm = new Form2(name,pwd);
mainForm.Show();
}
}
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WinFormLearning
{
public partial class Form2 : Form
{
public Form2(string name, string pwd) // 窗体初始化函数
{
InitializeComponent();
label2.Text = name;
label4.Text = pwd;
}
}
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Diagnostics;
namespace WinFormLearning
{
public partial class Form1 : Form
{
public Form1() // 窗体初始化函数
{
InitializeComponent();
radioButton1.Text = "选项一";
radioButton2.Text = "选项二";
radioButton3.Text = "选项三";
}
private void button12_Click(object sender, EventArgs e)
{
string msg = "";
if (radioButton1.Checked) // 若radioButton1被选中
{
msg = radioButton1.Text; // 将radioButton中的Text传递给消息框
}
else if (radioButton2.Checked)
{
msg = radioButton2.Text;
}
else if (radioButton3.Checked)
{
msg = radioButton3.Text;
}
MessageBox.Show("你选择的选项是:" + msg, "提示");
}
}
}
相对于RadioButton 单选框而言,CheckBox是可多选的复选框。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Diagnostics;
namespace WinFormLearning
{
public partial class Form1 : Form
{
public Form1() // 窗体初始化函数
{
InitializeComponent();
checkBox1.Text = "篮球";
checkBox2.Text = "羽毛球";
checkBox3.Text = "游泳";
checkBox4.Text = "跑步";
checkBox5.Text = "健身";
checkBox6.Text = "足球";
}
private void button12_Click(object sender, EventArgs e)
{
string msg = "";
if (checkBox1.Checked) // 若checkBox1被选中
{
msg = msg + " " + checkBox1.Text;
}
if (checkBox2.Checked)
{
msg = msg + " " + checkBox2.Text;
}
if (checkBox3.Checked)
{
msg = msg + " " + checkBox3.Text;
}
if (checkBox4.Checked)
{
msg = msg + " " + checkBox4.Text;
}
if (checkBox5.Checked)
{
msg = msg + " " + checkBox5.Text;
}
if (checkBox6.Checked)
{
msg = msg + " " + checkBox6.Text;
}
if (msg != "")
{
MessageBox.Show("您选择的爱好是:" + msg, "提示");
}
else
{
MessageBox.Show("您没有选择爱好", "提示");
}
}
}
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Diagnostics;
namespace WinFormLearning
{
public partial class Form1 : Form
{
public Form1() // 窗体初始化函数
{
InitializeComponent();
checkBox1.Text = "篮球";
checkBox2.Text = "羽毛球";
checkBox3.Text = "游泳";
checkBox4.Text = "跑步";
checkBox5.Text = "健身";
checkBox6.Text = "足球";
}
private void button12_Click(object sender, EventArgs e)
{
string msg = "";
foreach (Control c in Controls)
{
//判断控件是否为复选框控件
if (c is CheckBox)
{
if (((CheckBox)c).Checked) // 复选框被选中
{
msg = msg + " " + ((CheckBox)c).Text;
}
}
}
if (msg != "")
{
MessageBox.Show("您选择的爱好是:" + msg, "提示");
}
else
{
MessageBox.Show("您没有选择爱好", "提示");
}
}
}
}
复选列表框显示的效果与复选框类似,但在选择多个选项时操作比一般的复选框更方便。
关于复选列表框的内容在其属性中的items中添加。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Diagnostics;
namespace WinFormLearning
{
public partial class Form1 : Form
{
public Form1() // 窗体初始化函数
{
InitializeComponent();
}
private void button12_Click(object sender, EventArgs e)
{
string msg = "";
for (int i = 0; i < checkedListBox1.CheckedItems.Count; i++)
{
msg = msg + " " + checkedListBox1.CheckedItems[i].ToString();
}
if (msg != "")
{
MessageBox.Show("您购买的商品有:" + msg, "提示");
}
else
{
MessageBox.Show("您没有选购商品!", "提示");
}
}
}
}
列表框控件中有一些属性与前面介绍的控件不同,如下表所示:
属性名 | 作用 |
---|---|
MultiColumn | 获取或设置列表框是否支持多列,如果设置为 True,则表示支持多列; 如果设置为 False,则表示不支持多列,默认为 False |
Items | 获取或设置列表框控件中的值 |
SelectedItems | 获取列表框中所有选中项的集合 |
SelectedItem | 获取列表框中当前选中的项 |
SelectedIndex | 获取列表框中当前选中项的索引,索引从 0 开始 |
SelectionMode | 获取或设置列表框中选择的模式,当值为 One 时,代表只能选中一项, 当值为 MultiSimple 时,代表能选择多项,当值为 None 时,代表不能选 择,当值为 MultiExtended 时,代表能选择多项,但要在按下 Shift 键后 再选择列表框中的项 |
列表框还提供了一些方法来操作列表框中的选项,由于列表框中的选项是一个集合形式的,列表项的操作都是用 Items 属性进行的。
使用列表框列出所需的商品。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Diagnostics;
namespace WinFormLearning
{
public partial class Form1 : Form
{
public Form1() // 窗体初始化函数
{
InitializeComponent();
}
private void button12_Click(object sender, EventArgs e)
{
string msg = "";
for (int i = 0; i < listBox1.SelectedItems.Count; i++)
{
msg = msg + " " + listBox1.SelectedItems[i].ToString();
}
if (msg != "")
{
MessageBox.Show("您选择的商品是:" + msg, "提示");
}
else
{
MessageBox.Show("您没有选择商品", "提示");
}
}
}
}
在上述实例的基础上添加两个按钮,一个负责向列表框中添加爱好,一个负责删除选中的列表项。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Diagnostics;
namespace WinFormLearning
{
public partial class Form1 : Form
{
public Form1() // 窗体初始化函数
{
InitializeComponent();
}
private void button12_Click(object sender, EventArgs e) // “开始下单”按钮
{
string msg = "";
for (int i = 0; i < listBox1.SelectedItems.Count; i++)
{
msg = msg + " " + listBox1.SelectedItems[i].ToString();
}
if (msg != "")
{
MessageBox.Show("您选择的商品是:" + msg, "提示");
}
else
{
MessageBox.Show("您没有选择商品", "提示");
}
}
private void button4_MouseClick(object sender, MouseEventArgs e) // “删除”按钮
{
//由于列表框控件中允许多选所以需要循环删除所有已选项
int count = listBox1.SelectedItems.Count; // 获取listBox内被选中的元素数量
List<string> itemValues = new List<string>(); // 定义一个字符串从列表
if (count != 0)
{
for (int i = 0; i < count; i++)
{
itemValues.Add(listBox1.SelectedItems[i].ToString());
}
foreach (string item in itemValues)
{
listBox1.Items.Remove(item);
}
}
else
{
MessageBox.Show("请选择需要删除的商品!");
}
}
private void button3_MouseClick(object sender, MouseEventArgs e) // “添加”按钮
{
// 当文本框中的值不为空时将其添加到列表框中
if (textBox1.Text != "")
{
listBox1.Items.Add(textBox1.Text);
}
else
{
MessageBox.Show("请添加商品!");
}
}
}
}
下拉列表框ComboBox也称组合框,用于选择所需的选项。使用组合框可以有效地避免非法值的输入。在组合框中常用的事件是改变组合框中的值时发生的,即组合框中的选项改变事件 SelectedlndexChanged。
在组合框中常用的属性如下表所示:
属性名 | 作用 |
---|---|
DropDownStyle | 获取或设置组合框的外观,如果值为 Simple,同时显示文本框和列表框,并且文本框可以编辑;如果值为 DropDown,则只显示文本框,通过鼠标或键盘的单击事件展开文本框,并且文本框可以编辑;如果值为 DropDownList,显示效果与 DropDown 值一样,但文本框不可编辑。默认情况下为 DropDown |
Items | 获取或设置组合框中的值 |
Text | 获取或设置组合框中显示的文本 |
MaxDropDownltems | 获取或设置组合框中最多显示的项数 |
Sorted | 指定是否对组合框列表中的项进行排序,如果值为 True,则排序, 如果值为 False,则不排序。默认情况下为 False |
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Diagnostics;
namespace WinFormLearning
{
public partial class Form1 : Form
{
public Form1() // 窗体初始化函数
{
InitializeComponent();
comboBox1.Items.Add("计算机应用");
comboBox1.Items.Add("英语");
comboBox1.Items.Add("会计");
comboBox1.Items.Add("软件工程");
comboBox1.Items.Add("网络工程");
}
private void button12_MouseClick_1(object sender, MouseEventArgs e)
{
//判断文本框中是否为空,不为空则将其添加到组合框中
if (textBox1.Text != "")
{
//判断文本框中的值是否与组合框中的的值重复
if (comboBox1.Items.Contains(textBox1.Text))
{
MessageBox.Show("该专业已存在!");
}
else
{
comboBox1.Items.Add(textBox1.Text);
}
}
else
{
MessageBox.Show("请输入专业!", "提示");
}
}
private void button3_MouseClick_1(object sender, MouseEventArgs e)
{
//判断文本框是否为空
if (textBox1.Text != "")
{
//判断组合框中是否存在文本框中输入的值
if (comboBox1.Items.Contains(textBox1.Text))
{
comboBox1.Items.Remove(textBox1.Text);
}
else
{
MessageBox.Show("您输入的专业不存在", "提示");
}
}
else
{
MessageBox.Show("请输入要删除的专业", "提示");
}
}
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
//当组合框中选择的值发生变化时弹出消息框显示当前组合框中选择的值
MessageBox.Show("您选择的专业是:" + comboBox1.Text, "提示");
}
}
}
在 Windows 窗体应用程序中显示图片时要使用 PictureBox,图片的设置方式与背景图片的设置方式相似。图片控件中图片的设置除了可以直接使用 ImageLocation 属性指定图片路径以外,还可以在代码中通过 Image.FromFile 方法来设置,语法如下:
图片控件的名称 .Image = Image. FromFile( 图像的路径 );
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Diagnostics;
namespace WinFormLearning
{
public partial class Form1 : Form
{
public Form1() // 窗体初始化函数
{
InitializeComponent();
}
private void button12_Click(object sender, EventArgs e)
{
//定义中间变量存放图片地址,用于交换图片地址
PictureBox pictureBox = new PictureBox();
pictureBox.Image = pictureBox1.Image;
pictureBox1.Image = pictureBox2.Image;
pictureBox2.Image = pictureBox.Image;
}
}
}
在 Windows 窗体应用程序中,定时器控件(Timer)与其他的控件略有不同,它并不直接显示在窗体上,而是与其他控件连用,表示每隔一段时间执行一次 Tick 事件
。定时器控件常用的方法为启动定时器(Start)、停止定时器(Stop).
// Tick 方法,根据`Interval` 参数,定时进入Tick 函数
private void timer1_Tick(object sender, EventArgs e)
{
//...
}
timer1.Start();//开始定时
timer1.Stop();//停止定时
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Diagnostics;
namespace WinFormLearning
{
public partial class Form1 : Form
{
//设置当前图片空间中显示的图片的flag
//如果是图片1 flag的值为FALSE
//如果是图片2 flag的值为TRUE
bool flag = false;
public Form1() // 窗体初始化函数
{
InitializeComponent();
timer1.Interval = 2000; // 设置每隔x毫秒调用一次定时器Tick事件,单位ms
}
private void timer1_Tick(object sender, EventArgs e)
{
//当flag的值为TRUE时将图片控件的Image属性切换到Timer1.jpg
//否则将图片的Image属性切换到Timer2.jpg
if (flag)
{
pictureBox1.Image = Image.FromFile(@"C:\\Users\\xx\\Desktop\\微信截图_20210104135037.png");
flag = false;
}
else
{
pictureBox1.Image = Image.FromFile(@"C:\\Users\\xx\\Desktop\\微信截图_20210105144222.png");
flag = true;
}
}
private void button12_Click(object sender, EventArgs e)
{
timer1.Start(); // 启动定时器
}
private void button3_Click(object sender, EventArgs e)
{
timer1.Stop(); // 关闭定时器
}
}
}
日期时间DateTimePicker控件用于在界面上显示当前的时间。日期时间控件中常用的属性是设置其日期显示格式的 Format 属性。
注:如果将 Format 属性设置为 Custom 值,则需要通过设置 CustomFormat 属性值来自定义显示日期时间的格式。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Diagnostics;
namespace WinFormLearning
{
public partial class Form1 : Form
{
public Form1() // 窗体初始化函数
{
InitializeComponent();
//设置日期时间控件中仅显示时间
dateTimePicker1.Format = DateTimePickerFormat.Time;
// 设置每隔x毫秒调用一次定时器Tick事件,单位ms
timer1.Interval = 1000;
//启动定时器
timer1.Start();
}
private void timer1_Tick(object sender, EventArgs e)
{
//重新设置日期时间控件的文本
dateTimePicker1.ResetText();
}
}
}
日历控件(MonthCalendar)用于显示日期。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Diagnostics;
namespace WinFormLearning
{
public partial class Form1 : Form
{
string msg;
public Form1() // 窗体初始化函数
{
InitializeComponent();
//显示日历控件
monthCalendar1.Show();
}
private void button3_MouseClick(object sender, MouseEventArgs e)
{
MessageBox.Show("你的入职时间是:" + msg, "提示");
}
private void monthCalendar1_DateSelected(object sender, DateRangeEventArgs e)
{
//将选择的日期显示在文本框中
textBox1.Text = monthCalendar1.SelectionStart.ToShortDateString();
msg = monthCalendar1.SelectionStart.ToShortDateString();
//隐藏日历控件
//monthCalendar1.Hide();
}
}
}
在窗体上添加菜单栏控件 MenuStrip到窗体,然后按需求进行编辑,添加一级菜单后还能添加二级菜单。如下图,其中:
关于MenuStrip的应用基本上与ContextMenuStrip相同。
右键菜单ContextMenuStrip即右击某个控件或窗体时出现的菜单。上下文菜单在设置时直接与控件的 ContextMenuStrip 属性绑定即可。
在工具箱中添加ContextMenuStrip控件到窗体,下拉选择添加右击菜单的内容,其中:
点击菜单内容即可编辑,弹出的新子菜单可创建二集菜单。
点击”编辑项“,也可查看比较详细的编辑内容。
实例:ContextMenuStrip应用
通过添加groupbox,将ContextMenuStrip绑定在该groupbox中(groupbox属性中的ContextMenuStrip选择对应ContextMenuStrip),还可以实现该右击菜单只能在groupbox中有效。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Diagnostics;
namespace WinFormLearning
{
public partial class Form1 : Form
{
public Form1() // 窗体初始化函数
{
InitializeComponent();
}
private void 打开窗口ToolStripMenuItem_Click(object sender, EventArgs e)
{
ContextMenuStrip menu1 = new ContextMenuStrip();
menu1.Show();
MessageBox.Show("你打开了窗口" , "提示");
}
private void 关闭窗口ToolStripMenuItem_Click(object sender, EventArgs e)
{
this.Close();
}
}
}
在 Windows 窗体应用程序中,状态栏菜单(StatusStrip)用于在界面中给用户一些提示。就像office中的状态栏一样。
在窗体中添加StatusStrip后,点击下拉菜单,其中包括标签(StatusLabel)、进度条(ProgressBar)、下拉列表按钮(DropDownButton)、分割按钮(SplitButton)。
ToolStrip可以理解成一个占位符,就像是占着一个区域的位置,然后在其上面再添加功能按钮。
在窗体中添加ToolStrip后,点击下拉菜单即可添加对应控件。
MDI (Multiple Document Interface) 窗体被称为多文档窗体,它是很多 Windows 应用程序中常用的界面设计。MDI窗体的应用是在原窗体的属性 IsMdiContainer 设置为 True. 也可以通过代码设置,代码如下:
this.IsMdiContainer = True;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Diagnostics;
namespace WinFormLearning
{
public partial class Form1 : Form
{
public Form1() // 窗体初始化函数
{
InitializeComponent();
Form3 t = new Form3();
t.MdiParent = this;
t.Show();
}
}
}
颜色控件(ColorDialog)用于对界面中的文字设置颜色。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Diagnostics;
namespace WinFormLearning
{
public partial class Form1 : Form
{
public Form1() // 窗体初始化函数
{
InitializeComponent();
}
private void button3_Click(object sender, EventArgs e)
{
//显示颜色对话框
DialogResult dr = colorDialog1.ShowDialog();
//如果选中颜色,单击“确定”按钮则改变文本框的文本颜色
if (dr == DialogResult.OK)
{
textBox1.ForeColor = colorDialog1.Color;
}
}
}
}
字体控件 (FontDialog) 用于设置在界面上显示的字体。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Diagnostics;
namespace WinFormLearning
{
public partial class Form1 : Form
{
public Form1() // 窗体初始化函数
{
InitializeComponent();
}
private void button4_Click(object sender, EventArgs e)
{
//显示字体对话框
DialogResult dr = fontDialog1.ShowDialog();
//如果在对话框中单击“确认”按钮,则更改文本框中的字体
if (dr == DialogResult.OK)
{
textBox1.Font = fontDialog1.Font;
}
}
}
}
文件对话框(FileDialog)主要包括文件浏览对话框,以及用于查找、打开、保存文件的功能,与 Windows 中的文件对话框类似。
在窗体中添加openFileDialog和saveFileDialog控件。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Diagnostics;
using System.IO;
namespace WinFormLearning
{
public partial class Form1 : Form
{
public Form1() // 窗体初始化函数
{
InitializeComponent();
}
private void button5_Click(object sender, EventArgs e)
{
DialogResult dr = openFileDialog1.ShowDialog();
//获取所打开文件的文件名
string filename = openFileDialog1.FileName;
if (dr == System.Windows.Forms.DialogResult.OK && !string.IsNullOrEmpty(filename))
{
StreamReader sr = new StreamReader(filename); // StreamReader()定义在System.IO中
textBox1.Text = sr.ReadToEnd();
sr.Close();
}
}
private void button6_Click(object sender, EventArgs e)
{
DialogResult dr = saveFileDialog1.ShowDialog();
string filename = saveFileDialog1.FileName;
if (dr == System.Windows.Forms.DialogResult.OK && !string.IsNullOrEmpty(filename))
{
StreamWriter sw = new StreamWriter(filename, true, Encoding.UTF8); // StreamWriter()定义在System.IO中
sw.Write(textBox1.Text);
sw.Close();
}
}
}
}
FlowLayoutPanel 是一个容器,它将其他控件按顺序排列在一行中;
https://learn.microsoft.com/zh-cn/visualstudio/get-started/csharp/tutorial-windows-forms-math-quiz-customize-ui?view=vs-2022&tabs=csharp