在C#中,万事万物皆对象。窗体是一个类,是继承于Form的一个类,在这个类中,如果添加了很多的控件,这些控件就都是该窗体类的属性,当创建了窗体的实例的时候,才会去调用构造函数来创建这些控件的实例。控件、窗体都是类,这些类的实例才是具体的对象。
因为窗体是一个类,所以在窗体类中还可以有很多的字段、属性、函数、事件。在类的内部可以相互调用,在类的外部只能调用public、internal。
在C#2005中,因为有了partial类概念,窗体类中的各个控件的声明和创建初始化是放在一个partial类中完成的,而窗体的执行部分则是放在另外一个部分完成的。
不管是在windows应用程序中还是在控制台应用程序中,启动函数都是main函数,如下:staticvoid Main()
这个函数可以出现在任何类中,任何窗体中,不依赖对象而存在。
A、Location属性
获取该窗体相对于它的容器的位置,容器的坐标系是以容器的左上方顶点为坐标原点,向右为X轴的正方向,向下为Y轴的正方向,这个属性在窗体的属性窗口里面可以设置值,但是在程序中是只读的。普通的窗体的容器就是电脑屏幕,对于其他的控件,比如按钮等,用法基本一样,只是按钮的容器是窗体而已。
this.Location.X
this.Location.Y
B、MaximumSize属性
这个属性是窗体最大的时候,它的高度和宽度是多少。这个属性在窗体的属性窗口里面可以设置值,但是在程序中是只读的。一般默认是占满整个屏幕,不会去设置。点击窗体右上角的方框就会显示此属性下的窗体。
this.MaximumSize.Height
this.MaximumSize.Width
C、MinimumSize属性
这个属性是窗体最小的时候,它的高度和宽度是多少。这个属性在窗体的属性窗口里面可以设置值,但是在程序中是只读的。一般默认就是在屏幕上无法显示了,因为高度和宽度都是0,不会去设置这个值的。点击窗体右上角的减号就会显示此属性下的窗体。
this.MinimumSize.Height
this.MinimumSize.Width
D、Size属性
这个属性是窗体普通状态下的高度和宽度是多少。这个属性在窗体的属性窗口里面可以设置值,但是在程序中是只读的。一般在设计窗体的时候,拖放窗体的宽度和高度就可以确定这个值。最大化后双击,然后显示出来的就是该属性下的窗体。
this.Size.Width
this.Size.Height
E、WindowState属性
这个属性是windows窗体的初始可视状态或者以后的可视状态,有三个枚举值:FormWindowState.Maximized、FormWindowState.Minimized、FormWindowState.Normal分别对应MaximumSize属性、MinimumSize属性、Size属性三个属性。初始值是在属性窗口中设置的,默认为normal,是可读写的,可以通过改变该属性的值,来设置该窗体的显示类型:
this.WindowState = FormWindowState.Maximized;
this.WindowState = FormWindowState.Minimized;
this.WindowState = FormWindowState.Normal;
F、StartPosition属性
这个属性是windows窗体初始显示的时候,显示的位置。设置一定要在初始显示出来之前完成。否则已经显示出来再设置值就没有意义了。
this.StartPosition = FormStartPosition.CenterScreen; 表示位于整个屏幕的正中间。
this.StartPosition = FormStartPosition.Manual; 表示位于Location属性值的位置。
this.StartPosition = FormStartPosition.WindowsDefaultLocation;
起始位置在windows默认位置。大小由size属性决定。
this.StartPosition = FormStartPosition.WindowsDefaultBounds;
起始位置在windows默认位置。大小由windows决定。
this.StartPosition = FormStartPosition.CenterParent;
该属性是应用于子窗体的,位于父窗体的中间。
A、ControlBox属性
该属性的值是bool类型的,可以读写该值,默认是true。表示该窗体是否有“控件\系统”菜单框。
this.ControlBox = true:
this.ControlBox = false:
B、Icon属性
该属性指定窗体的图标。
C、IsMdiContainer属性
指定当前的窗体是否为MDI容器,为bool值。
this.IsMdiContainer = true;
D 、MinimizeBox、MaximizeBox
指定当前的窗体右上角是否显示最大化框和最小化框。
this.MinimizeBox = false;
this.MaximizeBox = false;
E、ShowIcon属性
指定是否在当前的窗体中显示图标。可读写。
this.ShowIcon = false;
F、TopMost属性
指定该窗体是否始终显示在其他没有设置该属性为true的窗体之上。可读写。
this.TopMost = true;
A、Name属性
指定该窗体的名字,这个名字是在程序中唯一标示该窗体的名字,程序就是通过这个名字来调用窗体的。可读写。
B、Locked属性
指定该窗体是否会被锁定,如果被锁定,那么在设计的时候,就不能改变该窗体大小了,这个只是针对设计,不针对运行,即使被锁住了,运行的时候也可以被拖动。对于每一个控件,该属性都是相互独立的,某个控件被锁住,其它的控件是不会被锁住的。但是在窗体中【格式】à【锁定】就是锁定这个窗体上的所有控件了,包括窗体。可读写。
A、BackColor、BackgroundImage、BackgroundImageLayout属性
this.BackColor = Color.CadetBlue;指定该控件的背景颜色。
this.BackgroundImage = "";指定该控件的背景图案。
this.BackgroundImageLayout = ImageLayout.Stretch;指定图案在控件上的布局方式。
B、Cursor
指针移过该控件的时候显示的图标。
C、Font、ForeColor
这两个属性分别是控件上文本的字体和颜色。
D、FormBorderStyle
读写窗体的边框样式,可以通过这个属性来控制窗体是否可以伸缩。
this.FormBorderStyle = FormBorderStyle.None;//没有边框
this.FormBorderStyle = FormBorderStyle.Sizable;//默认的可以变化尺寸的
this.FormBorderStyle = FormBorderStyle.Fixed3D;//固定的三维边框
this.FormBorderStyle = FormBorderStyle.FixedDialog;//固定的对话框样式的粗边框
this.FormBorderStyle = FormBorderStyle.FixedSingle;//固定的单行边框
E、Text
窗体的文本属性,即标题栏中的文字。
this.ContextMenuStrip 右键该控件的时候显示的菜单。
Enable表示该属性控制该控件是否灰掉,即是否能够活动,如果是普通的控件,那么只影响单个控件,如果是窗体,那么就要影响窗体上的所有的控件。
Visible表示该控件是否可见。
如果某个按钮得到焦点,如果按键盘的Enter,那么就会触发这个按钮的Click事件,而不会去触发按钮的MouseClick;但是如果用鼠标去点击的话,那么Click、MouseClick都会触发。
设置了AcceptButton的按钮就表示当按下Enter的时候,会触发这个按钮的Click事件,而不会去触发按钮的MouseClick。设置了CancelButton的按钮就表示当按下Esc的时候,会触发这个按钮的Click事件,而不会去触发按钮的MouseClick。
如果某个按钮得到焦点,那么即使设置了AcceptButton,当按Enter的时候,也不会触发AcceptButton对应的按钮,而是触发得到焦点的那个按钮。
this.AcceptButton = button1;
this.CancelButton = button2;
A、move
移动窗体之后发生。
B、ResizeBegin 、Resize 、ResizeEnd
分别对应窗体尺寸开始变化、变化过程中、变化后发生。
A、Click 、DoubleClick
包括Enter单击和鼠标单击。
B、MouseClick 、 MouseDoubleClick
包括Enter双击和鼠标双击。
KeyDown、KeyPress、KeyUp
这个分别对应着键盘按下的过程中、压住键盘、释放键盘的时候发生。是有发生顺序的。通过这几个事件,可以捕捉到用户输入的信息。扫描的时候,就相当于是用键盘输入的,扫描一个字符就就相当于按了一下键盘,所以扫描的一个标签含有一串字符,就相当于多次按下了键盘,那么就触发了对应次数的KeyPress事件,扫描最后会在扫描的信息后面加上一个Enter键结束扫描,相当于是按下Enter结束的。可以在这些事件的输入参数里面捕获到用户输入的字符。
针对窗体的:
Activated:窗体变成活动窗体的时候发生。
Deactivate:窗体变成非活动窗体的时候发生。
针对窗体上的控件的:
Enter:控件成为该窗体的活动控件时发生。
Leave:控件不再是该窗体的活动控件时发生。
MouseEnter:鼠标进入该控件的时候触发该事件
MouseLeave:鼠标离开该控件的时候触发该事件
MouseDown:鼠标按下该控件的时候触发该事件
MouseUp:鼠标释放该控件的时候触发该事件
MouseMove:鼠标在控件上面移动的时候触发该事件,不需要按下
MouseHover:当鼠标在该控件上停留一段时间后触发该事件
FormClosing:窗体正在关闭的过程中触发
FormClosed:窗体关闭之后触发
Load:窗体加载的时候,即在显示之前触发
当form .show的时候显示出来的窗体就是非模态的窗体。非模态窗体显示之后,之前的窗体与该非模态窗体之间是相互独立的,两个窗体可以独立的执行各自的功能。Show是没有返回值的。
当form . ShowDialog的时候显示出来的窗体就是模态的窗体。模态窗体显示出来之后,它在关闭之前都只能操作它自己而不能操作它的上一级窗体(弹出它的窗体)。直到它关闭为止。ShowDialog是有返回值的。
窗体有一个 DialogResult属性,该属性的值是一个枚举值,窗体模态方式显示之前,这个值默认为DialogResult.None,当窗体ShowDialog显示之后,如果窗体调用close方法,或者直接叉掉窗体,窗体会返回DialogResult.Cancel,很显然,就是关闭的这个操作导致窗体的DialogResult属性值发生了改变。
每一个窗体都有IsMdiContainer属性,该属性指定当前的窗体是否为MDI容器,为bool值。如果指定该属性为true:this.IsMdiContainer = true;那么该窗体就是MDI容器了,可以容纳子窗体了。
每一个窗体都有MdiParent属性,这个属性是用来指定该窗体的父窗体的,一旦指定了父窗体,该窗体就是那个父窗体的子窗体了。子窗体的显示是不能超过父窗体范围的。
这个属性是windows窗体的初始可视状态或者以后的可视状态,可以通过调整该属性的值来设置子窗体显示的状态。比如可以设置成:f.WindowState =FormWindowState.Maximized;
这个属性可以控制控件的哪个边框停靠父控件,并随着父控件的变化而变化。比如:f.Dock = DockStyle.Top;//该控件的上边缘靠近父控件的顶部,随父控件左右扩充
f.Dock = DockStyle.Bottom;//该控件的下边缘靠近父控件的底部,随父控件左右扩充
f.Dock = DockStyle.Left;//该控件的左边缘靠近父控件的左边,随父控件上下扩充
f.Dock = DockStyle.Right;//该控件的右边缘靠近父控件的右边,随父控件上下扩充
f.Dock = DockStyle.None;//该控件的边缘未靠近父控件的各边缘
f.Dock = DockStyle.Fill;//该控件的各个边缘靠近父控件的各个边缘,随父控件上下左右扩充
这个属性是控制,当父控件大小发生变化的时候,该控件向上、下、左、右四个方向延伸。
可以在类中定义很多的窗体,然后在菜单事件中去判断,如果为null就创建,不为null就显示出来:f.WindowState =FormWindowState.Maximized;。
A、属性:
Name:该控件的唯一标示符号,在程序中用的。
Icon:这个属性是用来设置NotifyIcon控件在屏幕右下角显示的图标的。
Text:当鼠标悬浮在小图标上时显示的文本。
ContextMenuStrip:右键该小图标的时候显示的菜单。
注意:往窗体上添加一个NotifyIcon控件,这个就是窗体的一个成员了。
B、 事件:
MouseDoubleClick:双击该图标的时候触发的事件。
点击窗体的最大化、最小化图标都会改变窗体的尺寸,特别是最小化之后,窗体在桌面就不显示了,但是在托盘上还是有显示的,点击之后会恢复的。但是如果将窗体隐藏,即调用窗体的hide函数,那么不仅桌面看不到,托盘上也不会有的。
A、先点击窗体的最小化图标,然后会触发窗体的Resize事件,在事件中去判断:
private void Form1_Resize(object sender, EventArgs e)
{
if (this.WindowState ==FormWindowState.Minimized)
{
this.Hide();
}
}
B、在窗体被隐藏之后,双击小图标:
private void notifyIcon1_MouseDoubleClick(object sender,MouseEventArgs e)
{
this.Show();
this.WindowState = FormWindowState.Normal;
}
绝大多数的窗体登录都是先写一个登录页面,在登录页面中有显示主窗体的代码,如果成功登录了,就将登录窗体隐藏,主窗体显示。这种方式的问题是第一个窗体一直隐藏,可能会带来一些问题。
有一种更好的方法,程序启动之后,先加载的是主窗体,在主窗体加载的时候,模态的显示登录窗体,如果登录成功,登录窗体关闭,主窗体成功加载;如果没有成功登录,用户将登录窗体关闭了,那么主窗体也关闭:
namespace WindowsFormsApplication1
{
public enum LoginStatus { NotLogin,LoginOK, LoginNG }
public partial class MainForm : Form
{
public LoginStatus loginStatus = LoginStatus.NotLogin;
public MainForm()
{
InitializeComponent();
}
private void MainForm_Load(object sender, EventArgs e)
{
LoginForm loginForm =newLoginForm(this);
if (loginForm.ShowDialog() ==DialogResult.Cancel)
{
if (loginStatus ==LoginStatus.LoginNG)
{
this.Close();
}
}
}
private void MainForm_FormClosed(object sender, FormClosedEventArgs e)
{
}
private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
{
}
}
}
namespace WindowsFormsApplication1
{
public partial class LoginForm : Form
{
MainForm mainForm = null;
public LoginForm()
{
InitializeComponent();
}
public LoginForm(MainForm mainForm)
{
this.mainForm = mainForm;
InitializeComponent();
}
private void LoginForm_Load(object sender, EventArgs e)
{
}
private void btnLogin_Click(object sender, EventArgs e)
{
if ("登录失败" !="登录失败")
{
MessageBox.Show("登录失败!");
}
else//登录成功
{
this.Close();
mainForm.loginStatus = LoginStatus.LoginOK;
}
}
private void btnCancel_Click(object sender, EventArgs e)
{
this.Close();
mainForm.loginStatus = LoginStatus.LoginNG;
}
private void LoginForm_FormClosing(object sender, FormClosingEventArgs e)
{
mainForm.loginStatus = LoginStatus.LoginNG;
}
}
}