在C#中,万事万物皆对象。窗体是一个类,是继承于Form的一个类,在这个类中,如果添加了很多的控件,这些控件就都是该窗体类的属性,当创建了窗体的实例的时候,才会去调用构造函数来创建这些控件的实例。控件、窗体都是类,这些类的实例才是具体的对象。
因为窗体是一个类,所以在窗体类中还可以有很多的字段、属性、函数、事件。在类的内部可以相互调用,在类的外部只能调用public、internal。
在C#2005中,因为有了partial类概念,窗体类中的各个控件的声明和创建初始化是放在一个partial类中完成的,而窗体的执行部分则是放在另外一个部分完成的。
不管是在windows应用程序中还是在控制台应用程序中,启动函数都是main函数,如下:staticvoid Main()
这个函数可以出现在任何类中,任何窗体中,不依赖对象而存在。
9.1、窗体Form
9.1.1、属性
9.1.1.1、关于窗体的布局
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;
该属性是应用于子窗体的,位于父窗体的中间。
9.1.1.2、关于窗体的样式
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;
9.1.1.3、关于窗体的设计
A、Name属性
指定该窗体的名字,这个名字是在程序中唯一标示该窗体的名字,程序就是通过这个名字来调用窗体的。可读写。
B、Locked属性
指定该窗体是否会被锁定,如果被锁定,那么在设计的时候,就不能改变该窗体大小了,这个只是针对设计,不针对运行,即使被锁住了,运行的时候也可以被拖动。对于每一个控件,该属性都是相互独立的,某个控件被锁住,其它的控件是不会被锁住的。但是在窗体中【格式】à【锁定】就是锁定这个窗体上的所有控件了,包括窗体。可读写。
9.1.1.4、关于窗体的外观
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
窗体的文本属性,即标题栏中的文字。
9.1.1.5、ContextMenuStrip
this.ContextMenuStrip 右键该控件的时候显示的菜单。
9.1.1.6、Enable、Visible
Enable表示该属性控制该控件是否灰掉,即是否能够活动,如果是普通的控件,那么只影响单个控件,如果是窗体,那么就要影响窗体上的所有的控件。
Visible表示该控件是否可见。
9.1.1.7、AcceptButton、CancelButton
如果某个按钮得到焦点,如果按键盘的Enter,那么就会触发这个按钮的Click事件,而不会去触发按钮的MouseClick;但是如果用鼠标去点击的话,那么Click、MouseClick都会触发。
设置了AcceptButton的按钮就表示当按下Enter的时候,会触发这个按钮的Click事件,而不会去触发按钮的MouseClick。设置了CancelButton的按钮就表示当按下Esc的时候,会触发这个按钮的Click事件,而不会去触发按钮的MouseClick。
如果某个按钮得到焦点,那么即使设置了AcceptButton,当按Enter的时候,也不会触发AcceptButton对应的按钮,而是触发得到焦点的那个按钮。
this.AcceptButton = button1;
this.CancelButton = button2;
9.1.2、事件
9.1.2.1、布局
A、move
移动窗体之后发生。
B、ResizeBegin 、Resize 、ResizeEnd
分别对应窗体尺寸开始变化、变化过程中、变化后发生。
9.1.2.2、鼠标操作
A、Click 、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值。如果指定该属性为true:this.IsMdiContainer
= true;那么该窗体就是MDI容器了,可以容纳子窗体了。
9.1.4.2、子窗体
每一个窗体都有MdiParent属性,这个属性是用来指定该窗体的父窗体的,一旦指定了父窗体,该窗体就是那个父窗体的子窗体了。子窗体的显示是不能超过父窗体范围的。
9.1.4.3、WindowState属性
这个属性是windows窗体的初始可视状态或者以后的可视状态,可以通过调整该属性的值来设置子窗体显示的状态。比如可以设置成:f.WindowState =FormWindowState.Maximized;
9.1.4.4、Dock属性
这个属性可以控制控件的哪个边框停靠父控件,并随着父控件的变化而变化。比如: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.5、Anchor属性
这个属性是控制,当父控件大小发生变化的时候,该控件向上、下、左、右四个方向延伸。
9.1.4.6、多次点击一个菜单只显示一个窗体
可以在类中定义很多的窗体,然后在菜单事件中去判断,如果为null就创建,不为null就显示出来:f.WindowState =FormWindowState.Maximized;。
9.1.5、关于窗体的隐藏和再显示
9.1.5.1、NotifyIcon控件
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;
}
}
}
分享到:
相关推荐
C# 非模态窗体(show)实现模态窗体(ShowDialog)的效果
实验模态分析及其应用,李德葆编写, 科学出版社出版,2001年2月 ...第九章至第十一章叙述模态分析方法和技术的具体工程应用. 特点为:既论述理论、方法,又有工程实际;既注重物理概念清晰,又不失数学的严谨.
Q760642.zip windows程序设计 编写Windows窗口应用程序实现对话框与菜单的应用 https://ask.csdn.net/questions/760642 编写Windows窗口应用程序实现对话框与菜单的应用 1)编程实现如下应用程序,含有菜单,单击...
这个问题会让一些初学者感到困惑,一方面模态窗体在打开之后(Form.ShowDialog).主线程无法继续执行下面的事务;另一方面,又要在处理事务的时候来同步这个窗体里面的进度条。这两件事情都必须做,却都不能先做
上海证券-20230416-传媒应用篇(一):AIGC系列专题:国外AIGC各模态产品梳理.pdf
这需要2个frxReport,其中一个的Preview属性需设为自定义的这个,另一个默认就行,然后在自定义那个的PrintBClick事件中再回调另一个就行了。 直接改fastreport的源代码也行,但只能用于某个程序,当编译别的程序...
VC 制作一个可以折叠、展开窗体部分工具栏的窗体,可自定义隐藏或显示窗口中某部分的内容,形成一种多模态的窗口类型,可以隐藏菜单栏、隐藏主窗体,隐藏状态栏等,让窗口只剩下一个工具条。面向VC 初、中级用户,...
C# 非模态窗体(show)实现模态窗体(ShowDialog)的效果 .rar
第9章 多媒体技术 第10章 数据库技术 第11章 综合实例开发 第三篇 Windows系统程序设计篇 第12章 进程与线程 第13章 内存管理 第14章 进程间通信 第15章 线程同步 第16章 动态链接库 第17章 结构化异常处理 第18章 ...
即“大模型+应用及内容”或“大模型+小模型+应用或内容”其中具备特定功能的AIGC软件产品我们理解为“小模型”+“应用”的技术范式,本身具备较高质量的AI能力,若接入匹配的多模态大模型,有望实现能力上的质变突破...
模态窗体的多种打开方式,及关闭时的各种对话框,适宜开发网页增加客户友好性
Delphi 模态窗体下更新另一个窗体内容,更方便多选内容在新窗体更新
jquery 弹出模态窗体
第9章 多媒体技术 第10章 数据库技术 第11章 综合实例开发 第三篇 Windows系统程序设计篇 第12章 进程与线程 第13章 内存管理 第14章 进程间通信 第15章 线程同步 第16章 动态链接库 第17章 结构化异常处理 第18章 ...
第9章 多媒体技术 第10章 数据库技术 第11章 综合实例开发 第三篇 Windows系统程序设计篇 第12章 进程与线程 第13章 内存管理 第14章 进程间通信 第15章 线程同步 第16章 动态链接库 第17章 结构化异常处理 第18章 ...
第九章 子商口控制 9.1 按钮类 9.1.1 创建于窗口 9.1.2 子窗口向父窗口发送消息 9.1.3 父窗口向子窗口发送消息 9.1.4 下压按钮 9.1.5 复选框 9.1. 6 单选按钮 9.1.7 分组框 9.1.8 更改按钮...
9 2.1.2 实例:使用Win32 API实现模态对话框 10 2.2 非模态对话框 12 2.2.1 实例:使用MFC实现非模态对话框 12 2.2.2 实例:使用Win32 API实现非模态对话框 13 2.3 属性对话框 14 2.3.1 实例:多页面切换程序 14 ...