Windows Forms (一)
导读
1、什么是 Windows Forms
2、需要学Windows Forms 么?
3、如何手写一个简单的Windows Forms 程序
4、对上面程序的说明
5、Form 类与Control类
6、Windows Forms 中的事件处理及手写一个带鼠标移动事件的窗体
什么是Windows Forms
通常我们的说的Windows Forms 指的是一类GUI(图形用户界面)程序的统称,Windows Forms 是随着 .NET 1.0 一起发布的,但市面上的 Windows Forms 程序主要还是 .NET 2.0 以上版本的,.NET 3.5 后主推的GUI程序变为 WPF,Windows Forms 退居2线。
需要学Windows Forms 么?
这个问题的答案因人而异,如果对于学生而言,我建议直接跳过Windows Forms 学WPF,WPF的思维模式比Windows Forms的事件处理模式要优秀不少。对于找工作(或已工作)的程序员而言,这个就要取决于公司的需求,在很多做行业软件的公司,用Windows Form 比 WPF多,虽然WPF的界面比原生Windows Forms炫太多了,但是Windows Forms 第三方的控件库弥补了这个问题。
如何手写一个简单的Windows Forms 程序
直接上代码: FirstWinForm.cs
using System;
using System.Windows.Forms; namespace DemoWinForm
{
class App : Form
{
static void Main()
{
Application.Run(new App());
}
}
}
编译命令: csc /t:winexe FirstWinForm.cs
运行 效果

可以看到一个简单得不能再简单的Windows Form 程序跑起来了。
对上面程序的说明
从上面的代码可以看出,Windows Forms 是一个类(其实应该是Windows Forms 窗体类是一个类),一个类要运行得有一个 Main 方法,上面Main方法中有一个 Application.Run(new App()); 这句话貌似是让 Windows Forms 跑起来的语句(Run)。再看引用,System.Windows.Forms 从这命名上看这应该是 Windows Forms的程序集。好下面我们正式揭开谜底
Windows 窗体 是任何继承 Form 的类叫窗体
System.Windows.Forms 命名空间包含了Windows Forms 程序的核心内容,它包括Windows Forms 的核心架构、可视化控件(设计时可见且运行时也可见)、组件(有设计时和运行是都可见的组件如ToolTip和仅设计时可见运行时不可见的组件如Timer)、对话框(公共对话框如OpenFileDialog)
System.Windows.Forms 命名空间中的核心类型
1、Application 该类封装了Windows 窗体应用程序运行时操作
2、常用控件类(Button、ComboBox、CheckBox、TextBox、Label、DateTimePicker、ListBox、PictureBox、TreeView)
3、Form 窗体类
4、布局控件类(Panel、Splitter 、GroupBox、TabControl)
5、菜单控件 (Menu、MenuItem 、ContextMenu)
6、各种对话框
System.Windows.Forms.Application 类需关注的方法
Run() 运行Windows Forms 窗体
DoEvents() 提供应用程序在冗长的操作期间处理当前排在消息队列里的信息的能力
Exit() 终止窗口应用程序并从承载的应用程序域中卸载
EnableVisualStyles() 配置应用程序以支持 Windows XP 界面外观
现在我们分析下上面的程序:
1、上面的代码写的是一个可执行程序(exe),所以它有一个Main方法。
2、App类是一个窗体类,因为它继承了 System.Windows.Forms.Form类
3、通过 Application.Run(Windows 窗体实例); 运行得到我们看到的Windows Forms 程序
上面的代码耦合度太强了,应用程序的运行(创建AppDomian)和窗体逻辑耦合到一起(说白了窗体类应该只关注窗体逻辑,不关注谁来加载这个窗体到AppDomain中运行)所以上面的代码最好改为如下的代码:
using System;
using System.Windows.Forms; namespace DemoWinForm
{
// 注意这里我用静态类
static class App
{
static void Main()
{
Application.Run(new MainForm());
}
} public class MainForm : Form{}
}
Form 类与Control类
我们先看下 System.Windows.Forms.Form 的继承关系图
System.Object
System.MarshalByRefObject
System.ComponentModel.Component
System.Windows.Forms.Control
System.Windows.Forms.ScrollableControl
System.Windows.Forms.ContainerControl
System.Windows.Forms.Form
标红的是我认为需要重点关注的类,所有可视化控件(如 Button 之类)都是继承自 System.Windows.Forms.Control,而组件则是继承自 System.ComponentModel.Component。
System.Windows.Forms.Control 类提供了一个可视化控件的绝大多数成员(控件名、Size、字体、前景和背景色、父容器、常用事件如鼠标相关、键盘相关等)详细内容参见MSDN
使用Control类的例子:
using System;
using System.Windows.Forms;
using System.Drawing; namespace DemoWinForm
{
static class App
{
static void Main()
{
Application.Run(new MainForm());
}
} public class MainForm : Form
{
public MainForm()
{
Text = "一个窗口";
Height = ;
Width = ;
BackColor = Color.Green;
Cursor = Cursors.Hand;
}
}
}
编译 csc /t:winexe UseControlDemo.cs

Windows Forms 中的事件处理及手写一个带鼠标移动事件的窗体
System.EventHandler
原型为
public delegate void EventHandler(object sender,EventArgs e);
它是 WinForm程序事件处理的最原始委托,sender 表示发送事件的对象,e 表示事件相关信息
Windows Forms 事件的相关委托定义都类似与System.EventHandler,如鼠标相关的委托MouseEventHandler,它的原型如下
public delegate void MouseEventHandler(object sender,MouseEventArgs e)
我们看下 MouseMove事件
所有与鼠标相关的事件(MouseMove MouseUp 等)与MouseEventHandler 委托结合工作,MouseEventArgs 扩展了EventArgs增加了一下属性
Button 获取哪个鼠标被单击
Clicks 获取鼠标被按下和释放的次数
X 鼠标单击处的 x 坐标
Y 鼠标单击处的 y 坐标
看代码
using System;
using System.Windows.Forms;
using System.Drawing; namespace DemoWinForm
{
static class App
{
static void Main()
{
Application.Run(new MainForm());
}
} public class MainForm : Form
{
public MainForm()
{
this.Text = "一个窗口";
this.Height = ;
this.Width = ;
BackColor = Color.Green;
Cursor = Cursors.Hand; this.MouseMove += new MouseEventHandler(MainForm_MouseMove);
} void MainForm_MouseMove(object sender, MouseEventArgs e)
{
this.Text = string.Format("当前鼠标坐标: [{0},{1}]",e.X,e.Y);
}
}
}
编译 csc /t:winexe MouseMoveDemo.cs
运行效果

本文完
Windows Forms (一)的更多相关文章
- Wizard Framework:一个自己开发的基于Windows Forms的向导开发框架
最近因项目需要,我自己设计开发了一个基于Windows Forms的向导开发框架,目前我已经将其开源,并发布了一个NuGet安装包.比较囧的一件事是,当我发布了NuGet安装包以后,发现原来已经有一个 ...
- windows forms 上一个类似于wpf snoop 的工具: Hawkeye
windows forms 上一个类似于wpf snoop 的工具: Hawkeye 周银辉 WPF上有snoop这样的run time object editor让人用着很爽, 今天搜到了一个for ...
- WPF中实例化Com组件,调用组件的方法时报System.Windows.Forms.AxHost+InvalidActiveXStateException的异常
WPF中实例化Com组件,调用组件的方法时报System.Windows.Forms.AxHost+InvalidActiveXStateException的异常 在wpf中封装Com组件时,调用组件 ...
- DotNetBar for Windows Forms 12.9.0.0_冰河之刃重打包版及制作Visual Studio C#项目模板文件详解
关于 DotNetBar for Windows Forms 12.9.0.0_冰河之刃重打包版 --------------------11.8.0.8_冰河之刃重打包版-------------- ...
- DotNetBar for Windows Forms 12.7.0.10_冰河之刃重打包版原创发布-带官方示例程序版
关于 DotNetBar for Windows Forms 12.7.0.10_冰河之刃重打包版 --------------------11.8.0.8_冰河之刃重打包版------------- ...
- DotNetBar for Windows Forms 12.5.0.2_冰河之刃重打包版原创发布-带官方示例程序版
关于 DotNetBar for Windows Forms 12.5.0.2_冰河之刃重打包版 --------------------11.8.0.8_冰河之刃重打包版-------------- ...
- DotNetBar for Windows Forms 12.2.0.7_冰河之刃重打包版原创发布-带官方示例程序版
关于 DotNetBar for Windows Forms 12.2.0.7_冰河之刃重打包版 --------------------11.8.0.8_冰河之刃重打包版-------------- ...
- DotNetBar for Windows Forms 12.1.0.0_冰河之刃重打包版 原创发布
关于 DotNetBar for Windows Forms 12.1.0.0_冰河之刃重打包版 --------------------11.8.0.8_冰河之刃重打包版-------------- ...
- 用Advanced Installer制作DotNetBar for Windows Forms 12.0.0.1_冰河之刃重打包版详解
关于 DotNetBar for Windows Forms 12.0.0.1_冰河之刃重打包版 --------------------11.8.0.8_冰河之刃重打包版-------------- ...
- DotNetBar for Windows Forms 11.8.0.8冰河之刃重打包版
关于 DotNetBar for Windows Forms 11.8.0.8_冰河之刃重打包版 基于 官方原版的安装包 + http://www.cnblogs.com/tracky 提供的补丁DL ...
随机推荐
- Template模式
在开发时,有时会遇到对于一个算法的实现,在不同的对象中有不同的实现,可是这个算法的框架是同样的.这时能够使用Template模式或Strategy模式. Template是採用继承的方式来实现这一点, ...
- JavaScript DOM对象和JQuery对象相互转换
1.分析源代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www ...
- 瑞丽的SQL-基于窗体的排名计算
在SQL Server中,窗体被定义为用户指定的一组行. 之所以要提出窗体这个概念,由于这种基于窗体或分区的又一次计算在实际工作应用范围比較广泛.比如.假设我们要对每一个班级中的学生按成绩进行排序,在 ...
- Chrome插件开发 尝试1
1.新建文件夹 如图:整个项目的结构 2.新建一个名为manifest.json的文件,编码模式为utf-8,(可以先建好txt文件然后再将文件后缀txt改为json) 3.用记事本写入代码如下:(m ...
- BW知识点总结及面试要点
1. 如何理解数据仓库? 数据仓库 是 一个面向主题的,集成的,相对稳定的,反应历史变化的数据集合,用于支持管理决策. 2. OLAP 和 OLTP的基本概念 和 区别? Ol ...
- codeforces Gym 100500H A. Potion of Immortality 简单DP
Problem H. ICPC QuestTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100500/a ...
- 通过GitHub和Hexo搭建个人博客
LinEvan个人博客 最终有自己的个人博客,逼格一下子提高说不少. 网上一搜教程一大堆,非常多已经写得非常好了,我就不凑这个热闹了.推荐一篇博文:怎样搭建一个独立博客--简明Github Pages ...
- 关于try...catch...finally中return的疑惑
原文:http://www.cnblogs.com/and_he/archive/2012/04/17/2453703.html 关于try...catch...finally里面的return一直是 ...
- 判断手机andriod还是iphone
手机识别:var isAndroid = navigator.appVersion.toLowerCase().indexOf(‘android’) >= 0,isIphone = naviga ...
- 用Linux安装光盘修复GRUB
转载:http://lgn21st.iteye.com/blog/179455 需要开视频会议,我不得零时从Ubuntu切换回去百年难道用一次的WinXP...发现自己的XP系统很混乱...决定重新装 ...