<WinForm_1>初识WinForm编程
暑假花了一个多月自学了Win32 SDK编程,不敢说成为了高手,但是还是颇具收获——windows的消息机制(著名的消息循环)、一切控件均是窗口……
曾经有一位网友(和我一个专业的)向我吐槽:Win32 SDK都是那么老的"老古董"了,你怎么还学它呢,岂不是浪费时间?
其实当时我听到这句话,内心比较感慨,我没做什么回应——想必大家应该知道什么是经典,什么是根源——当你知其所以然时,必是你真正知其然之时
Ok,步入今天(也是未来一段时间的)的主题——初识一下WinForm
一、初识WinForm
WinForm是.net平台中对Windows Form的一种称谓,基于C#编程语言,属于C#的三大分支之一(另外两个是Web和WP),WinForm主要用于桌面应用的开发。
WinForm的开发可以基于微软提供的集成开发环境Visual Studio2005、2008、2010==,另外VS强大到可以让开发人员可以采用Visual——可视的方式来开发
WinForm应用——请注意,这是为了方便开发人员,对于WinForm的初学者来说,不适合使用这种方式——受IT编程界大师P先生(Charles Petzold)的影响,我个
人已经很习惯自行编码的方式了,比较反感很多书中采用Visual的方式教学。不过很巧合,P先生所著书籍<<Microsoft C# Windows程序设计>>是采用自行编码方式的,有幸可以继续拜读他的大作。以后,我也就可以采用自行编码的方式来学习WinForm了。
二、来看看如何创建一个简单的WinForm程序(vs2008)
1、创建一个C#的空项目(快捷方式:Ctrl + Shift + N)
2、选择"其它语言" -> "Visual C#" -> "Windows" -> "空项目",输入和项目名后,就可点击"确定了"
3、添加必要的引用: 右键解决方案管理器中项目的"引用" -> "添加引用"
4、找到以下三个引用,然后添加:
5、新建一个C#的源文件(代码文件属于空文件,我建议初学者建立空文件,自行编写属于自己风格的代码)
6、然后键入以下代码:(后面有讲解)
//WinForm版的"Hello,World"(无注释)
using System;
using System.Drawing;
using System.Windows.Forms; class FirstWinForm: Form
{
private string str; public FirstWinForm()
{
Text = "FirstWinForm";
StartPosition = FormStartPosition.CenterScreen; str = "Hello, WinForm";
} protected override void OnCreateControl()
{
base.OnCreateControl(); MessageBox.Show("创建窗口"); Show();
} protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
Graphics grfx = e.Graphics;
SizeF sizef = grfx.MeasureString(str, Font); grfx.DrawString(str, Font, Brushes.Black,
(ClientSize.Width - sizef.Width) / 2,
(ClientSize.Height - sizef.Height) / 2);
} protected override void OnClosing(System.ComponentModel.CancelEventArgs cea)
{
base.OnClosing(cea); if (DialogResult.No == MessageBox.Show(
"确定离开吗?", "FirstWinForm", MessageBoxButtons.YesNo))
cea.Cancel = true;
} static void Main()
{
Application.EnableVisualStyles();
Application.Run(new FirstWinForm());
}
}
三、来看WinForm版的"Hello , Wolrd"与Win32 SDK版的"Hello , World"的联系
(我姑且以个人观点觉得对比一下这两个版本,对以后学习WinForm会有帮助^_^)
(以下是鄙人经过测试后得出的结论,若有遗漏或疏忽之处,还望见谅^_^)
1、先来看看Win32 SDK中创建窗口的过程:
(1). 书写窗口类(WNDCLASS)
(2). 注册窗口类
(3). 创建窗口
(4). 显示窗口和更新窗口
(5). 消息循环
(6). 回调函数
2、WinForm版的与之对应
(1). 其中(1)~(4)均有C#中的System.Windows.Forms.Form这个类包办
(2). 消息循环有System.Windows.Forms.Application这个类的静态方法Run包办
(3). 回调函数类似的功能就有C#中一个名为"事件委托"的机制来完成
3、再来看看我加以注释的WinForm版的"Hello , World"
//WinForm版的"Hello,World"(注释版本) using System;
using System.Drawing;
using System.Windows.Forms; class FirstWinForm: Form
{
private string str; //构造
public FirstWinForm()
{
//窗口标题
Text = "FirstWinForm";
//窗口居中显示
StartPosition = FormStartPosition.CenterScreen; str = "Hello, WinForm";
} //响应CreateControl事件——等价于Win32 SDK中的WM_CREATE消息
protected override void OnCreateControl()
{
base.OnCreateControl(); MessageBox.Show("创建窗口"); Show();
} //响应Paint事件——等价于Win32 SDK中的WM_PAINT消息
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
Graphics grfx = e.Graphics;
SizeF sizef = grfx.MeasureString(str, Font); //居中显示字符串
grfx.DrawString(str, Font, Brushes.Black,
(ClientSize.Width - sizef.Width) / 2,
(ClientSize.Height - sizef.Height) / 2);
} //响应Closing事件——等价于Win32 SDK中的WM_CLOSE消息
protected override void OnClosing(System.ComponentModel.CancelEventArgs cea)
{
base.OnClosing(cea); if (DialogResult.No == MessageBox.Show(
"确定离开吗?", "FirstWinForm", MessageBoxButtons.YesNo))
cea.Cancel = true;
} //程序入口点Main——你可以把它理解为Win32 SDK中的WinMain入口点函数
static void Main()
{
//这个没什么说的,就是启用可视化样式
Application.EnableVisualStyles(); //等价于Win32 SDK中的消息循环
Application.Run(new FirstWinForm());
}
}
看到这里,你是否觉得C#创建窗口的流程和Win32一模一样呢?
呵呵,当然,都是微软整的,并且基于windows,那么思想流程也就理所应当一模一样了
<WinForm_1>初识WinForm编程的更多相关文章
- WinForm编程数据视图之DataGridView浅析
学习C#语言的朋友们肯定或多或少地接触到了WinForm编程,在C#语言的可视化IDE中(如VS.NET中)使用设计器可以让我们轻松地完成窗体.按钮.标签.图片框等等控件的组合,我们可以轻易地做出界面 ...
- C# winform编程中多线程操作控件方法
private void Form1_Load(object sender, EventArgs e) { Thread newthread = new Thread(new ThreadStart( ...
- Java基础-初识面向对象编程(Object-Oriented-Programming)
Java基础-初识面向对象编程(Object-Oriented-Programming) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Java是一门面向对象的程序设计语言.那么什 ...
- c# winform编程之多线程ui界面资源修改总结篇【转】
c# winform编程之多线程ui界面资源修改总结篇 单线程的winfom程序中,设置一个控件的值是很easy的事情,直接 this.TextBox1.value = "Hello Wor ...
- python递归 及 面向对象初识及编程思想
递归 及 面向对象初识及编程思想 一.递归 1.定义: 在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数. (1)递归就是在过程或函数里调用自身: (2)在使用递 ...
- 泛型的几种类型以及初识winform
今天学习的可以分为两类吧,但是学习的都是比较抽象的,不太容易掌握吧.首先我们大部分时间学习了泛型,泛型的委托,泛型接口以及枚举器,迭代器,扩展方法:最后简单的认识了webform,实现了一个简单的功能 ...
- c# winform编程之多线程ui界面资源修改总结篇
单线程的winfom程序中,设置一个控件的值是很easy的事情,直接 this.TextBox1.value = "Hello World!";就搞定了,但是如果在一个新线程中这么 ...
- 初识shell编程
1.shell编程之为什么学.怎么学 为什么学shell编程 Linux系统批量管理 提升工作效率,减少重复工作 学好shell编程所需要的基础知识 熟悉使用vim编辑器 熟悉SSH终端 熟练掌握Li ...
- 初识并发编程 MPI
MPI是一个跨语言的通讯协议,用于并发编程.MPI标准定义了一组具有可移植性的编程接口. 安装环境 MPICH 是开源的消息传递接口(MPI)标准的实现. 下载地址 # 解压文件 tar -xzvf ...
随机推荐
- linux 网络状态工具ss命令
ss命令用于显示socket状态. 他可以显示PACKET sockets, TCP sockets, UDP sockets, DCCP sockets, RAW sockets, Unix dom ...
- 美洽SDK
简介 GitHub地址:https://github.com/Meiqia/MeiqiaSDK-Android 开发文档:http://meiqia.com/docs/meiqia-android-s ...
- 监听视图树 OnGlobalLayoutListener
背景 我们都知道在onCreate()里面获取控件的高度是0,这是为什么呢?我们来看一下示例: 首先我们写一个控件 public class MyImageView extends ImageView ...
- 《photoshop cc 新功能 生成图像资源》智能切图逆天啦!
作为一个前端工程师切图这个步骤是必不可少的,方式多种多样,有和切图工具的,也有是把要切的图层元素或者组直接新建保存成文件的,现在photoshop cc2015,可以让你轻松切图,摆脱繁琐的切图步骤. ...
- [Linux]三种方案在Windows系统下安装ubuntu双系统(转)
在学习linux的过程中,ubuntu无疑是初学者的最佳选择. 下面来列举给Windows系统安装ubuntu双系统的三种方法. 一.虚拟机安装(不推荐) 使用工具:Vmware 如果不是因为迫不得已 ...
- Java请求参数类QueryParameter
import java.util.HashMap; import java.util.Map; import org.apache.commons.lang.StringUtils; /** * 请求 ...
- java多线程心得
多并发的时候,在什么情况下必须加锁?如果不加锁会产生什么样的后果. 加锁的场景跟java的new thread和Runnable的关系是什么? 看看java的concurrentMap源码. 还有sp ...
- Java的native关键字---JAVA下调用其他语言的关键词
今天研究Java基础类库,Object类的时候,发现了一个关键字:native 咦?这是个什么东东?它认识我,我可不认识它! 嘿嘿,没关系,baidu一下. java native关键字 一. 什么是 ...
- C# linq的学习及使用
linq可以对多种数据源和对象进行查询,如数据库.数据集.XML文档.数组等. 通过对linq的使用,可以减少代码量并优化检索操作. LINQ关键字 from 指定数据源和范围变量 where 根据布 ...
- 【转】Debug和Release区别
VC下Debug和Release区别 最近写代码过程中,发现 Debug 下运行正常,Release 下就会出现问题,百思不得其解,而Release 下又无法进行调试,于是只能采用printf方式逐步 ...