Winform编程研究.入门基础.01.窗体

 

任务描述:为了后续章节内容的展开和延续性,我们将指定如下编程任务作为贯穿本文的项目工程:构造一个计算器,模...



任务描述:为了后续章节内容的展开和延续性,我们将指定如下编程任务作为贯穿本文的项目工程:构造一个计算器,模拟Windows计算器的所有功能。

我们从上一章节创建的“iCalc.Win.Agent”工程开始这个任务。首先,我们修改一下“iCalc.Win.Agent”工程默认窗口Form1的窗体文件名称,在Visual Studio上“iCalc.Win.Agent”项目结构下右键单击“Form1.cs”,在右键菜单中选择“重命名”:

窗体文件名称“Form1.cs”呈高亮显示(待修改状态),输入新的窗体文件名称“MainForm.cs”(表示是程序的主窗口),敲回车确定:

1.标题与图标

双击“MainForm.cs”打开主窗口的窗体设计器,可以观察到窗体的标题依然是“Form1”,重新生成项目并运行发现,主窗口的标题是“Form1”,这不是我们所期望的结果。

单击“MainForm.cs”的窗体设计器,在Visual Studio属性窗口找到Text属性,将其属性值修改为“计算器”,敲回车确定:

窗体能够显示图标的前提是ShowIcon属性设置为true(默认值为true),接下来我们才能考虑更改窗体的图标。

首先准备图标文件(注意,窗体图标只能支持.ico格式的图像文件),将准备好的图标文件拷贝到“iCalc.Win.Agent”的工程目录(右击工程名称,在右键菜单选择“在Windows资源管理器打开文件夹”,即可打开工程目录),然后在属性窗口找到Icon属性,单击Icon属性值,在属性值栏末端出现“…”按钮:
单击该按钮,弹出“打开”文件对话框,在“打开”文件对话框打开“iCalc.Win.Agent”的工程目录:
在该工程目录选中图标文件(如图,iCalc.ico),在对话框上单击“打开”按钮,完成图标更改:
运行一下程序,观察主窗口的标题和图标确实已经更改了:

2.大小与位置

考虑一下计算器软件界面的两个问题:第一,窗口能够容纳计算器所需要的元素(数字0~9,运算符+-*/等,还有一些辅助符号),显然,当前的窗口大小是不足以容纳这么多内容的;第二,我们尝试着多运行几次程序,可以发现主窗口相对屏幕的位置是不确定的,这会给用户带来不太友好的体验。

窗体的初始大小可以在窗体设计器中通过拖拽窗体边界的方式改变,也可以通过属性窗口更改,在属性窗口找到Size属性,点开Size属性的折叠按钮,Size属性下包含了两个子属性,分别为Width属性和Height属性,修改Width属性改变窗体的宽带,修改Height属性改变窗体的高度。我们直接将Size属性值修改为“300,330”,即宽度300像素,高度330像素。



窗体的位置必须通过StartPosition属性设置(注意,不是Location属性,Location属性设置的控件相对外层容器的位置,窗体外层没有容器,因而Location属性是无效的)。在属性窗口找到StartPosition属性,其默认值为WindowsDefaultLocation,单击其属性值栏,发现其属性值栏是一个下拉列表框,下拉列表框包含了Manual,CenterScreen,WindowsDefaultLocation,WindowsDefaultBounds和CenterParent,一共5个选项,对于主窗口而言,一般来说相对屏幕居中是比较合适的,所以,我们选择CenterScreen。

在程序运行初始,窗体的外观形态除了大小和位置,其初始状态也是非常重要的,这个由窗台的WindowState属性决定,这也是一个下拉列表式的属性值栏,取值分别为:

Normal,普通模式,以Size属性定义的大小显示;

Maximized,最大化模式,全屏显示;

Minimized,最小化模式,停靠在任务栏(前提是ShowInTaskBar属性必须为true,否则任务栏无显示)

对于计算器这样的小程序而言,选择Normal模式是合适的。

3.背景风格

窗体的背景可以通过BackColor属性(通过颜色设置背景)和BackgroundImge属性(通过图片设置背景),但是要注意,BackgroundImge属性的效果会覆盖BackColor属性的效果。

在属性窗口找到BackColor属性,单击BackColor属性栏可以发现其属性取值是一个由三个标签页组合而成的下拉面板,三个标签页分别为“自定义”,“Web”,“系统”,每个标签页都包含了若干颜色取值:

我们可以通过单击某一颜色值选定BackColor属性的值,对于计算器而言,背景色最好是白色的或者浅蓝色,这里,我们取浅蓝色,单击“Web”标签页,选定AliceBlue:
通过图片设置背景并不适合“计算器”这样的小程序,在此仅作介绍。

单击属性窗口“BackgroundImage”属性的属性栏末端“…”按钮,弹出“选择资源”对话框(选择资源有两种方式,本地资源和项目资源,图片作为资源会以二进制方式写入可执行文件,在程序运行的时候载入内存,本地资源会随着其所在窗体的载入而载入内存,而项目资源会在软件运行的时候就载入内存,所以,如果不是项目全局使用的资源,一般以本地资源的方式加载),选择本地资源:
单击“导入”按钮,弹出“打开”文件对话框,在“打开”文件对话框选定图片文件,
在对话框上单击“打开”按钮,回到“选择资源”对话框,对话框右侧呈现选定的图片文件:
在对话框上单击确定按钮,BackgroundImage属性设置完毕:



效果非常诡异,这个因为BackgroundImageLayout属性设置Tile的缘故,它表示当图片大小不足以覆盖背景的时候,以复制的方式平铺背景区域。我们将BackgroundImageLayout属性设置为Stretch时,图片就会以拉伸的方式覆盖背景:(效果同样非常诡异,所以,使用图片作为窗口的背景,更重要的工作在于选择一张合适的图片)。



4.外观样式

回到“计算器”的程序上来,现在我们在其主窗体添加一些控件,比如按钮。单击“MainForm.cs”窗体设计器,在“解决方案管理器”窗口单击“工具箱”标签页,打开“工具箱”面板,在“工具箱”面板的“公共控件”找到“Button”控件:
鼠标拖动“Button”控件到“MainForm.cs”窗体设计器,反复拖动多次,在窗体上添加多个按钮:



运行程序,界面呈现效果:
但是我们发现,计算器的主窗口可以缩小,拉伸以及最大化,这些操作会破坏计算器程序给用户的观感:


所以我们在这里必须定义“计算器”程序主窗口的外观样式行为规范,首先,它不能通过拖拽鼠标进行缩放,其次,它不能被最大化。下面,我们就来实现上述行为规范。

拖拽鼠标进行缩放由窗体的FormBorderStyle属性控制,它的属性栏是一个下拉列表框,它被用于定义窗体Border的样式,默认值为Sizable,即大小可变化,由于“计算器”程序主窗口是一个单窗体应用程序,所以我们把FormBorderStyle属性设置为FixedSingle或者Fixed3D,二者差别不大,只是设置Fixed3D之后,窗体看上去有凹凸的3D效果。运行一下程序,拖拽主窗口的边界,大小不会发生变化:
窗体的最大化和最小化由窗体标题上的最大化按钮和最小化按钮控制,而ControlBox属性,MaximizeBox属性,MinimizeBox属性是用来控制最大化按钮和最小化按钮的显示和隐藏的,它们都是布尔型的属性:

ControlBox属性:

True,显示标题栏控制箱,包括最大化按钮,最小化按钮和关闭按钮,默认值;

False,隐藏标题栏控制箱,包括最大化按钮,最小化按钮和关闭按钮;

MaximizeBox属性:

True,显示/使能最大化按钮,默认值;

False,隐藏/禁用最大化按钮;

MinimizeBox属性

True,显示/使能最小化按钮,默认值;

False,隐藏/禁用最小化按钮;

依据之前定义的样式规范,我们将MaximizeBox属性设置为false。运行程序,可以发现窗体的最大化按钮已经被禁用了:

5.显示与Load事件

窗体的显示可以使用窗体的Show方法控制,比如:

var oForm = new MainForm();

oForm.Show();

但是主窗体的显示是由Program.cs中的代码Application.Run(new MainForm())完成。当主窗口加载并要显示时,会触发窗体的Load事件,我们可以在Load事件的事件处理函数实现一些在窗口显示前的操作。

在“属性”窗口单击
按钮,切换“事件”面板,在“事件”面板上找到Load事件,双击Load事件的处理函数栏(Load右侧单元格),Visual Studio为Load事件注册事件处理函数MainForm_Load:

并自动在窗体代码文件MainForm.cs创建事件处理函数MainForm_Load的模板:
在事件处理函数MainForm_Load中添加代码如下:

//MainForm.Load事件

privatevoid MainForm_Load(objectsender, EventArgs e)

{

MessageBox.Show("欢迎使用计算器!",

"温馨提示",

MessageBoxButtons.OK,

MessageBoxIcon.Information);

}

运行程序,可以发现,主窗口在显示之前,先弹出提示对话框:
单击提示框“确定”按钮,提示框关闭,显示程序主窗口。

6.关闭与FormClosed事件

窗体的关闭可以使用窗体的Close方法完成,也可以由用户直接单击窗口的关闭按钮完成。不论使用哪种方式关闭窗口,必然触发窗口的FormClosed事件,我们可以在FormClosed事件中实现窗口关闭后的处理工作。

按照如上Load事件的方式,为FormClosed事件注册事件处理函数,然后在事件处理函数中添加代码如下:

//MainForm.Closed事件

privatevoid MainForm_FormClosed(object sender, FormClosedEventArgse)

{

MessageBox.Show("谢谢使用!",

"温馨提示",

MessageBoxButtons.OK,

MessageBoxIcon.Information);

}

运行程序发现,主窗口在关闭之前弹出提示对话框:
单击提示框“确定”按钮,提示框关闭,主窗口关闭,计算器停止运行。


    关注 代码工房


微信扫一扫关注公众号

0 个评论

要回复文章请先登录注册