第九章、Windows应用程序(9.1节:Form窗体:属性、事件、模态窗体、多文档窗体)

C#中,万事万物皆对象。窗体是一个类,是继承于Form的一个类,在这个类中,如果添加了很多的控件,这些控件就都是该窗体类的属性,当创建了窗体的实例的时候,才会去调用构造函数来创建这些控件的实例。控件、窗体都是类,这些类的实例才是具体的对象。

因为窗体是一个类,所以在窗体类中还可以有很多的字段、属性、函数、事件。在类的内部可以相互调用,在类的外部只能调用publicinternal

C#2005中,因为有了partial类概念,窗体类中的各个控件的声明和创建初始化是放在一个partial类中完成的,而窗体的执行部分则是放在另外一个部分完成的。

不管是在windows应用程序中还是在控制台应用程序中,启动函数都是main函数,如下:staticvoid Main()

这个函数可以出现在任何类中,任何窗体中,不依赖对象而存在。

9.1、窗体Form

9.1.1、属性

9.1.1.1、关于窗体的布局

ALocation属性

获取该窗体相对于它的容器的位置,容器的坐标系是以容器的左上方顶点为坐标原点,向右为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;

该属性是应用于子窗体的,位于父窗体的中间。

9.1.1.2、关于窗体的样式

AControlBox属性

该属性的值是bool类型的,可以读写该值,默认是true。表示该窗体是否有“控件\系统”菜单框。

this.ControlBox = true:

this.ControlBox = false:

BIcon属性

该属性指定窗体的图标。

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;

9.1.1.3、关于窗体的设计

A、Name属性

指定该窗体的名字,这个名字是在程序中唯一标示该窗体的名字,程序就是通过这个名字来调用窗体的。可读写。

B、Locked属性

指定该窗体是否会被锁定,如果被锁定,那么在设计的时候,就不能改变该窗体大小了,这个只是针对设计,不针对运行,即使被锁住了,运行的时候也可以被拖动。对于每一个控件,该属性都是相互独立的,某个控件被锁住,其它的控件是不会被锁住的。但是在窗体中【格式】à【锁定】就是锁定这个窗体上的所有控件了,包括窗体。可读写。

9.1.1.4、关于窗体的外观

ABackColorBackgroundImageBackgroundImageLayout属性

this.BackColor = Color.CadetBlue;指定该控件的背景颜色。

this.BackgroundImage = "";指定该控件的背景图案。

this.BackgroundImageLayout = ImageLayout.Stretch;指定图案在控件上的布局方式。

BCursor

指针移过该控件的时候显示的图标。

CFontForeColor

这两个属性分别是控件上文本的字体和颜色。

DFormBorderStyle

读写窗体的边框样式,可以通过这个属性来控制窗体是否可以伸缩。

this.FormBorderStyle = FormBorderStyle.None;//没有边框

this.FormBorderStyle = FormBorderStyle.Sizable;//默认的可以变化尺寸的

this.FormBorderStyle = FormBorderStyle.Fixed3D;//固定的三维边框

this.FormBorderStyle = FormBorderStyle.FixedDialog;//固定的对话框样式的粗边框

this.FormBorderStyle = FormBorderStyle.FixedSingle;//固定的单行边框

EText

窗体的文本属性,即标题栏中的文字。

9.1.1.5ContextMenuStrip

this.ContextMenuStrip 右键该控件的时候显示的菜单。

9.1.1.6EnableVisible

Enable表示该属性控制该控件是否灰掉,即是否能够活动,如果是普通的控件,那么只影响单个控件,如果是窗体,那么就要影响窗体上的所有的控件。

Visible表示该控件是否可见。

9.1.1.7AcceptButtonCancelButton

如果某个按钮得到焦点,如果按键盘的Enter,那么就会触发这个按钮的Click事件,而不会去触发按钮的MouseClick;但是如果用鼠标去点击的话,那么ClickMouseClick都会触发。

设置了AcceptButton的按钮就表示当按下Enter的时候,会触发这个按钮的Click事件,而不会去触发按钮的MouseClick。设置了CancelButton的按钮就表示当按下Esc的时候,会触发这个按钮的Click事件,而不会去触发按钮的MouseClick

如果某个按钮得到焦点,那么即使设置了AcceptButton,当按Enter的时候,也不会触发AcceptButton对应的按钮,而是触发得到焦点的那个按钮。

this.AcceptButton = button1;

this.CancelButton = button2;

9.1.2、事件

9.1.2.1、布局

Amove

移动窗体之后发生。

BResizeBegin 、Resize 、ResizeEnd

分别对应窗体尺寸开始变化、变化过程中、变化后发生。

9.1.2.2、鼠标操作

AClick 、DoubleClick

包括Enter单击和鼠标单击。

B、MouseClick 、 MouseDoubleClick

包括Enter双击和鼠标双击。

9.1.2.3、键盘操作

KeyDown、KeyPress、KeyUp

这个分别对应着键盘按下的过程中、压住键盘、释放键盘的时候发生。是有发生顺序的。通过这几个事件,可以捕捉到用户输入的信息。扫描的时候,就相当于是用键盘输入的,扫描一个字符就就相当于按了一下键盘,所以扫描的一个标签含有一串字符,就相当于多次按下了键盘,那么就触发了对应次数的KeyPress事件,扫描最后会在扫描的信息后面加上一个Enter键结束扫描,相当于是按下Enter结束的。可以在这些事件的输入参数里面捕获到用户输入的字符。

9.1.2.4、失去、获得焦点

针对窗体的:

Activated:窗体变成活动窗体的时候发生。

Deactivate:窗体变成非活动窗体的时候发生。

针对窗体上的控件的:

Enter:控件成为该窗体的活动控件时发生。

Leave:控件不再是该窗体的活动控件时发生。

9.1.2.5、鼠标

MouseEnter:鼠标进入该控件的时候触发该事件

MouseLeave:鼠标离开该控件的时候触发该事件

MouseDown:鼠标按下该控件的时候触发该事件

MouseUp:鼠标释放该控件的时候触发该事件

MouseMove:鼠标在控件上面移动的时候触发该事件,不需要按下

MouseHover:当鼠标在该控件上停留一段时间后触发该事件

9.1.2.6、窗体的行为

FormClosing:窗体正在关闭的过程中触发

FormClosed:窗体关闭之后触发

Load:窗体加载的时候,即在显示之前触发

9.1.3、关于模态窗体和非模态窗体

9.1.3.1、模态窗体和非模态窗体简介

form .show的时候显示出来的窗体就是非模态的窗体。非模态窗体显示之后,之前的窗体与该非模态窗体之间是相互独立的,两个窗体可以独立的执行各自的功能。Show是没有返回值的。

form . ShowDialog的时候显示出来的窗体就是模态的窗体。模态窗体显示出来之后,它在关闭之前都只能操作它自己而不能操作它的上一级窗体(弹出它的窗体)。直到它关闭为止。ShowDialog是有返回值的。

9.1.3.2、窗体的DialogResult属性

窗体有一个 DialogResult属性,该属性的值是一个枚举值,窗体模态方式显示之前,这个值默认为DialogResult.None,当窗体ShowDialog显示之后,如果窗体调用close方法,或者直接叉掉窗体,窗体会返回DialogResult.Cancel,很显然,就是关闭的这个操作导致窗体的DialogResult属性值发生了改变。

9.1.4、关于多文档窗体

9.1.4.1、父窗体

每一个窗体都有IsMdiContainer属性,该属性指定当前的窗体是否为MDI容器,为bool值。如果指定该属性为truethis.IsMdiContainer = true;那么该窗体就是MDI容器了,可以容纳子窗体了。

9.1.4.2、子窗体

每一个窗体都有MdiParent属性,这个属性是用来指定该窗体的父窗体的,一旦指定了父窗体,该窗体就是那个父窗体的子窗体了。子窗体的显示是不能超过父窗体范围的。

9.1.4.3WindowState属性

这个属性是windows窗体的初始可视状态或者以后的可视状态,可以通过调整该属性的值来设置子窗体显示的状态。比如可以设置成:f.WindowState =FormWindowState.Maximized;

9.1.4.4Dock属性

这个属性可以控制控件的哪个边框停靠父控件,并随着父控件的变化而变化。比如:f.Dock = DockStyle.Top;//该控件的上边缘靠近父控件的顶部,随父控件左右扩充

f.Dock = DockStyle.Bottom;//该控件的下边缘靠近父控件的底部,随父控件左右扩充

f.Dock = DockStyle.Left;//该控件的左边缘靠近父控件的左边,随父控件上下扩充

f.Dock = DockStyle.Right;//该控件的右边缘靠近父控件的右边,随父控件上下扩充

f.Dock = DockStyle.None;//该控件的边缘未靠近父控件的各边缘

f.Dock = DockStyle.Fill;//该控件的各个边缘靠近父控件的各个边缘,随父控件上下左右扩充

9.1.4.5Anchor属性

这个属性是控制,当父控件大小发生变化的时候,该控件向上、下、左、右四个方向延伸。

9.1.4.6、多次点击一个菜单只显示一个窗体

可以在类中定义很多的窗体,然后在菜单事件中去判断,如果为null就创建,不为null就显示出来:f.WindowState =FormWindowState.Maximized;

9.1.5、关于窗体的隐藏和再显示

9.1.5.1NotifyIcon控件

A、属性:

Name该控件的唯一标示符号,在程序中用的。

Icon这个属性是用来设置NotifyIcon控件在屏幕右下角显示的图标的。

Text:当鼠标悬浮在小图标上时显示的文本。

ContextMenuStrip:右键该小图标的时候显示的菜单。

注意:往窗体上添加一个NotifyIcon控件,这个就是窗体的一个成员了。

B、 事件:

MouseDoubleClick:双击该图标的时候触发的事件。

9.1.5.2、窗体的隐藏和显示

点击窗体的最大化、最小化图标都会改变窗体的尺寸,特别是最小化之后,窗体在桌面就不显示了,但是在托盘上还是有显示的,点击之后会恢复的。但是如果将窗体隐藏,即调用窗体的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;

}

9.1.6、关于窗体登录的处理

绝大多数的窗体登录都是先写一个登录页面,在登录页面中有显示主窗体的代码,如果成功登录了,就将登录窗体隐藏,主窗体显示。这种方式的问题是第一个窗体一直隐藏,可能会带来一些问题。

有一种更好的方法,程序启动之后,先加载的是主窗体,在主窗体加载的时候,模态的显示登录窗体,如果登录成功,登录窗体关闭,主窗体成功加载;如果没有成功登录,用户将登录窗体关闭了,那么主窗体也关闭:

9.1.6.1、主窗体代码

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)

{

}

}

}

9.1.6.2、登录窗体代码

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;

}

}

}

你可能感兴趣的:(windows)