C#最基础窗体剖析

原创 2015年11月18日 13:05:35

C#基础窗体程序剖析

Microsoft Visual Studio 2015 C# Windows Form Application 创建系统默认生成程序剖析

一.[Program.cs] -> 程序入口代码(Main函数所在的代码)

1.[STAThread]
[STAThread]是一种线程模型,用在程序的入口方法上(在C#和VB.NET里是
Main()方法),来指定当前线程的ApartmentState 是STA。
[STAThread]是声明开始线程用的。有时候要用一个第三方组件,如果不加[STAThread]的话,组件上有一些功能是无法使用的。加上[STAThread]就可以用了。
2.Application.EnableVisualStyles()
Application.EnableVisualStyles()的作用定义:
publicstaticvoidEnableVisualStyles();
此方法为应用程序启用可视样式。如果控件和操作系统支持视觉样式,则控件将以视觉样式进行绘制。若要使 EnableVisualStyles生效,必须在应用程序中创建任何控件之前调用它;EnableVisualStyles 通常是 Main 函数的第一行。当调用 EnableVisualStyles时,无需单独的清单即可启用可视化样式。
3.Application.SetCompatibleTextRenderingDefault(false)
(1).作用:在应用程序范围内设置控件显示文本的默认方式(可以设为使用新的GDI+,还是旧的GDI)
true使用GDI+方式显示文本,
false使用GDI方式显示文本.
(2).只能在单独运行窗体的程序中调用该方法;不能在插件式的程序中调用该方法.
(3).只能在程序创建任何窗体前调用该方法,否则会引发
InvalidOperationException异常.
4.Application.Run()
Application.Run(new Form1());
这句话一般出现在WinForm程序的启动代码里表示在当前线程上开始运行标准应用程序消息循环,并使指定窗体可见.

二.Form1.cs[Design] -> 窗体控件,有控件工具,可以方便的拖入控件

这里写图片描述

三.[Form1.cs] -> 实现空间功能代码,包括自定义方法和事件

1.Partial
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
}

*Partial是局部类型的意思,允许我们将一个类、结构或接口分成几个部分,分别实现在几个不同的.cs文件中。C#编译器在编译的时候仍会将各个部分的局部类型合并成一个完整的类
局部类型适用于以下情况:
(1) 类型特别大,不宜放在一个文件中实现。
(2) 一个类型中的一部分代码为自动化工具生成的代码,不宜与我们自己编写的代码混合在一起。
(3) 需要多人合作编写一个类。
局部类型的限制:
(1) 局部类型只适用于类、接口、结构,不支持委托和枚举。
(2) 同一个类型的各个部分必须都有修饰符 partial。
(3) 使用局部类型时,一个类型的各个部分必须位于相同的命名空间中。
(4) 一个类型的各个部分必须被同时编译。
2.InitializeComponent()
public Form1()
{
InitializeComponent();
}

InitializeComponent()是有.NET平台自动执行的,是做一些初始化的工作,例如:初始化Form1,上面的控件,加载资源,分配资源等.
3.消息相应函数
private void btn_Get(object sender, EventArgs e)中关于[object sender], [EventArgs e]的相关问题:
private void btn_Get_Click_(object sender, EventArgs e)
{
}

(1)object sender
假如这个方法是button按键的事件反应方法那么,其中的sender,就是你点击的button.可以通过类型转换得到这个button的引用:
Button sendButton = (Button)sender; 简单的说sender就是按钮,在事件处理中就可以用sender代替button.
(2)EventArgs e
EventArgs是事件参数,该事件传入的参数,比如说你用鼠标点击窗体那么EventArgs是会包含点击的位置等等,它用来辅助你处理事件.

四.[Form1.Designer.cs] -> 画面设计代码

1.IContainer
System.ComponentModel.IContainer components = null;
以上代码是窗体设计器自动生成的代码,作为组件的容器。当窗体上没有组件时,把它删掉了也“无所谓”,但是当窗体上有组件时就不能删了,删了会出现错误的。也就是说,这串代码是管理组件的一个容器。为了深刻理解,举个例子:
(1).新建个窗体,删除了component,这时没问题的
(2).再往窗体拖拽个一个任意组件,再看是不是有自动生成了个component?回答是肯定的。
(3).再把component删了,看看还有没“所谓”,出错了吧!
(4).这时其实component已经不是null了,它已经被new了:
this.components = new System.ComponentModel.Container();
[对.IContainer]的详细解释
① 控制外部资源
IComponent 接口继承自 System.IDisposable 接口,这样可以控制对象的释放。
②设计时支持
只要是支持IComponent接口,都可以看见一个设计器,并且拖入到这个组件中的子组件都会自动产生以下代码:
this.errorProvider1 = new System.Windows.Forms.ErrorProvider(this.components);以便加入站点。
③承载组件
所有的子组件都是通过 IContainer 管理的,所以你的子组件都是被管理的。
2.Dispose()函数
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}

IDisposable接口里面的方法原型是:void Dispose().
void Dispose()这个方法要干的事情就是释放资源。
3.#region #endregion
#region #endregion这是区域的意思,你可以把代码或者注释放到这个里面。以使代码简洁。
Windows Form Designer generated code 指的是Windows Form设计器代码,也就是当前项目中你所用的控件的一些代码。
SuspendLayout() ResumeLayout() Layout() PerformLayout()
(1).什么时候会触发Control.Layout事件?
当控件本身的大小(size)改变时会发生本控件的Layout事件,或者当其子控件的位置(position)和大小(size)改变也会触发它的Layout事件。添加或删除子控件也会引起它的Layout事件。
(2).SuspendLayout作何用?
在添加或移除子控件,控件的边界改变,以及在发生其他可影响控件布局的变化时,会发生 Layout 事件。可以使用 SuspendLayout 挂起布局,可以在控件上执行多个操作,而无需为每次更改执行一次布局操作。也就是说,有了这个语句之后,紧接着下面的添加,删除子控件,或者改变子控件的大小,位置,以及改变它自身的位置的这些操作,都不在引发Layout事件了。
(3). ResumeLayout 方法取消布局事件。通过ResumeLayout取消挂起的布局。以后布局改变的时候就会引发layout事件了。
(4).PerformLayout事件 : 强制布局。

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

TSP问题之分支限界法

分支限界法原理与回溯算法类似,是一种基于解空间搜索问题的求解策略。 解题的一般步骤是: 1.按宽度优先策略遍历解空间树; 2.在遍历过程中,对处理的每个结点vi,根据界限函数,估计沿该结点向下搜索所可...

C++链表学习笔记

如果要保存一些数据类型相同的变量,比如过n个int类型的变量,就可以存放在一个数组中,然后通过下标方便的访问。可是数组的缺点也比较多,第一个就是在声明数组的时候,数组的长度必须是明确的,即便是动态声明...

一味盲从是懦弱无能的表现

晋文公的时候,厨官让人献上烤肉 ,肉上却缠着头发。文公叫来厨 官,大声责骂他说:“你存心想让我噎死吗?他周围的烧烤头发?  ”厨官叩着响头,拜了两拜,装着认罪,说:“小臣有死罪三条:我找来细磨刀石磨刀...

【C/C++】链表的理解与使用

转载自:http://blog.csdn.NET/xubin341719/article/details/7091583/ 最近不是太忙,整理些东西,工作也许用得到。 1,为什么要用到链表...

c之输入数组判断结束

从刚接触代码到现在,见过各种各样的输入要求,比如: 1.输入一行数字,以-1为结束 2.输入字符串,以回车结束 3.输入10个数字 等等 有时候就是这些基本的输入问题,阻挠了解题的脚步 其...

C++实现链表基本操作

前几天找实习的时候,一个面试官给我留了一个题,做一个链表demo,要求实现创建、插入、删除等操作。 链表是一种常见的数据结构,它是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链...

c++链表 建立 输入 输出 删除结点 插入结点 释放链表 的函数

Description 编写一个函数creatlink,用来建立一个动态链表。(包含学号和成绩) 编写一个函数printlink,用来输出一个链表。 编写一个函数dellink,用来删除动态链表中一...

(C++版)链表(一)——实现单向链表创建、插入、删除等相关操作

前段时间用C

链表C++实现

节点定义:typedef struct node { int data; struct node *next; }NODE;类定义class LinkList { private: ...

C++链表使用完整代码

/**//*    练习使用链表:创建链表、遍历链表、查找节点、添加节点、删除节点*/#include "stdio.h"#include "string.h"#include "...
  • hizxc
  • hizxc
  • 2008-03-01 00:29
  • 56477
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)