编写一个写字板初步了解Winform编程(一)——Winform程序结构

来源:互联网 发布:sql日期取年月日 编辑:程序博客网 时间:2024/05/16 17:29

以编写完的NotePad为例:


1.程序的入口任然为ProGram.cs中Program类的Main函数

using System;using System.Collections.Generic;using System.Linq;using System.Threading.Tasks;using System.Windows.Forms;namespace WindowsFormsApplicationNotePad{    static class Program    {        /// <summary>        /// 应用程序的主入口点。        /// </summary>        [STAThread]        static void Main()        {            Application.EnableVisualStyles();            Application.SetCompatibleTextRenderingDefault(false);            Application.Run(new Form1());        }    }}

其中,[STAThread]表示指示程序的COM线程模型是单线程单元(STA),这里我们不用管它

接下来的Application类是一个管理应用程序的类,该类不能继承。管理应用程序包括:启动、停止、处理Windows消息、获取应用程序信息等

EnableVisualStyles()是启用应用程序的可视样式

SetCompatibleTextRenderingDefault(false)是不将某些控件上定义的UseCompatibleTextRendering属性设置成应用程序范围内的默认值

Run()表示在当前窗体上运行标准应用程序消息循环,并使指定的窗体可见

Form1是我们自定义的继承Form类的类。就是Windows的窗体。

主函数中的代码都是自动生成的,这次编写写字板的时候不用改动。


2.Form1.cs代码,对于窗体的设计

Form1.cs是我们需要设计的代码的放置部分。比如我们单击一个按钮,那么这个相关的代码就要放在这里。有时候我们需要一些相对于Form1公共的变量,这要放在这里。Form1.cs就是一个普通的类,放置着各种我们自定义的函数,自定义的全局变量,自定义的委托。


我们通过一小段代码来看:

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.Drawing.Text;namespace WindowsFormsApplicationNotePad{    public partial class Form1 : Form    {        float ZoomFactor = 1;        bool IsModify = false;        string CurFileName = string.Empty;        int Start = 0;        public Form1()        {            InitializeComponent();        }        private void buttonBold_Click(object sender, EventArgs e)        {            SetFontStyle(FontStyle.Bold);        }    }}
这里Form1类的类型为partial,这是局部类型,局部类型一般在以下几种情况应用:

  1. 类型特别大,不宜放在一个文件中实现。
  2. 一个类型中的一部分代码为自动化工具生成的代码,不宜与我们自己编写的代码混合在一起。
  3. 需要多人合作编写一个类。

这里是由于第二个原因。我们的Form1类被分为了Form1.cs和Form1.Designer.cs两个文件中,Form1.Designer.cs就是由VS的自动化工具,窗口设计的可视化工具生成的。这个文件我们之后再讲。


回到Form1.cs。我么可以看到他的构造函数,里面只有一个函数InitializeComponent(),这是设计器所支持的方法,微软建议不要手工修改,而使用设计器来修改。事实上,用代码编辑器也是可以修改这个方法的,但是要符合设计器的格式,否则设计器就不能正常工作。有时候会遇到设计器出现问题的情况,比如委托被删除,而Designer.cs文件仍然把这个委托加入了控件的方法,这个时候就要手动的编辑Designer.cs文件。


InitializeComponent()这个方法用于初始化在所有组件,包括Form1这个窗体。我们会在稍后讲Designer.cs的时候介绍这个函数到底是怎么工作的。


其他的方法都是由设计器生成或者你自己添加的,比如buttonBold_Click方法,这个方法就是设计器添加的,但是你也可以自己写,函数命名规则一般都是组件名_组件方法(消息发送者,消息);不同的组件EventArgs e可能不同,比如Form的FormClosing方法的事件消息就是FormClosingEventArgs类型,而不是EventArgs类型,但是大多数组件都与代码中的buttonBold_Click方法的参数一样,为object sengder,EventArgs e。


当你在这写完方法后,系统不会根据函数名自动的与组件绑定的,也就是说凡是你写的都是自定义的函数,你需要手动的绑定到组件上。


当然是用设计器对组件双击就能生成一个设计器生成的函数,这个函数设计器会帮你和组件绑定。


3.Form1.Designer.cs窗口设计代码

我先贴一段窗体设计的代码:

namespace WindowsFormsApplicationNotePad{    partial class Form1    {        /// <summary>        /// 必需的设计器变量。        /// </summary>        private System.ComponentModel.IContainer components = null;        /// <summary>        /// 清理所有正在使用的资源。        /// </summary>        /// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>        protected override void Dispose(bool disposing)        {            if (disposing && (components != null))            {                components.Dispose();            }            base.Dispose(disposing);        }        #region Windows 窗体设计器生成的代码        /// <summary>        /// 设计器支持所需的方法 - 不要修改        /// 使用代码编辑器修改此方法的内容。        /// </summary>        private void InitializeComponent()        {            this.button1 = new System.Windows.Forms.Button();            this.Controls.Add(this.button1);            this.button1.Click += new System.EventHandler(this.button1_Click);        }        private System.Windows.Forms.Button button1;    }}

我们可以看到Designer.cs文件也是实现Form1类,所以它也使用了partial关键字

它实现了一个Dispose方法,用于释放资源

然后就是InitializeComponent()方法了,这个方法的函数全是由设计器生成的,虽然不建议修改,但是也可以看看它到底是怎么实现的。如果有过Java Swing设计基础和有过Eclipse上的WindowsDesigner插件使用经验的话,马上就可以知道这些代码是干嘛用的。没错,他们是如此的相似。


注意:上面贴的这段代码只贴了一部分并且做了一部分修改,只是用于演示。

想要把一个控件加到窗体上就使用方法Controls.Add(控件).如果要修改窗体的一些属性也非常简单,比如修改标题,只需要对this.Text进行修改就可以了

这些组件全是Form1类的值。组件之间的嵌套也是如此,只是把一个组件用Add方法加到另一个组件上而已,只不过每个组件的Add方法可能表现形式不同。


还有一个关键点是委托的绑定,比如这里的代码

this.button1.Click += new System.EventHandler(this.button1_Click);
就是表示在button1的Click事件中加委托,后面就是你在Form1.cs中写的方法,所以方法名自己取也没有关系,大不了到这来改就是了。





0 0