暑假花了一个多月自学了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、然后键入以下代码:(后面有讲解)

  1. //WinForm版的"Hello,World"(无注释)
  2. using System;
  3. using System.Drawing;
  4. using System.Windows.Forms;
  5.  
  6. class FirstWinForm: Form
  7. {
  8. private string str;
  9.  
  10. public FirstWinForm()
  11. {
  12. Text = "FirstWinForm";
  13. StartPosition = FormStartPosition.CenterScreen;
  14.  
  15. str = "Hello, WinForm";
  16. }
  17.  
  18. protected override void OnCreateControl()
  19. {
  20. base.OnCreateControl();
  21.  
  22. MessageBox.Show("创建窗口");
  23.  
  24. Show();
  25. }
  26.  
  27. protected override void OnPaint(PaintEventArgs e)
  28. {
  29. base.OnPaint(e);
  30. Graphics grfx = e.Graphics;
  31. SizeF sizef = grfx.MeasureString(str, Font);
  32.  
  33. grfx.DrawString(str, Font, Brushes.Black,
  34. (ClientSize.Width - sizef.Width) / 2,
  35. (ClientSize.Height - sizef.Height) / 2);
  36. }
  37.  
  38. protected override void OnClosing(System.ComponentModel.CancelEventArgs cea)
  39. {
  40. base.OnClosing(cea);
  41.  
  42. if (DialogResult.No == MessageBox.Show(
  43. "确定离开吗?", "FirstWinForm", MessageBoxButtons.YesNo))
  44. cea.Cancel = true;
  45. }
  46.  
  47. static void Main()
  48. {
  49. Application.EnableVisualStyles();
  50. Application.Run(new FirstWinForm());
  51. }
  52. }

三、来看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"

  1. //WinForm版的"Hello,World"(注释版本)
  2.  
  3. using System;
  4. using System.Drawing;
  5. using System.Windows.Forms;
  6.  
  7. class FirstWinForm: Form
  8. {
  9. private string str;
  10.  
  11. //构造
  12. public FirstWinForm()
  13. {
  14. //窗口标题
  15. Text = "FirstWinForm";
  16. //窗口居中显示
  17. StartPosition = FormStartPosition.CenterScreen;
  18.  
  19. str = "Hello, WinForm";
  20. }
  21.  
  22. //响应CreateControl事件——等价于Win32 SDK中的WM_CREATE消息
  23. protected override void OnCreateControl()
  24. {
  25. base.OnCreateControl();
  26.  
  27. MessageBox.Show("创建窗口");
  28.  
  29. Show();
  30. }
  31.  
  32. //响应Paint事件——等价于Win32 SDK中的WM_PAINT消息
  33. protected override void OnPaint(PaintEventArgs e)
  34. {
  35. base.OnPaint(e);
  36. Graphics grfx = e.Graphics;
  37. SizeF sizef = grfx.MeasureString(str, Font);
  38.  
  39. //居中显示字符串
  40. grfx.DrawString(str, Font, Brushes.Black,
  41. (ClientSize.Width - sizef.Width) / 2,
  42. (ClientSize.Height - sizef.Height) / 2);
  43. }
  44.  
  45. //响应Closing事件——等价于Win32 SDK中的WM_CLOSE消息
  46. protected override void OnClosing(System.ComponentModel.CancelEventArgs cea)
  47. {
  48. base.OnClosing(cea);
  49.  
  50. if (DialogResult.No == MessageBox.Show(
  51. "确定离开吗?", "FirstWinForm", MessageBoxButtons.YesNo))
  52. cea.Cancel = true;
  53. }
  54.  
  55. //程序入口点Main——你可以把它理解为Win32 SDK中的WinMain入口点函数
  56. static void Main()
  57. {
  58. //这个没什么说的,就是启用可视化样式
  59. Application.EnableVisualStyles();
  60.  
  61. //等价于Win32 SDK中的消息循环
  62. Application.Run(new FirstWinForm());
  63. }
  64. }

看到这里,你是否觉得C#创建窗口的流程和Win32一模一样呢?

呵呵,当然,都是微软整的,并且基于windows,那么思想流程也就理所应当一模一样了

<WinForm_1>初识WinForm编程的更多相关文章

  1. WinForm编程数据视图之DataGridView浅析

    学习C#语言的朋友们肯定或多或少地接触到了WinForm编程,在C#语言的可视化IDE中(如VS.NET中)使用设计器可以让我们轻松地完成窗体.按钮.标签.图片框等等控件的组合,我们可以轻易地做出界面 ...

  2. C# winform编程中多线程操作控件方法

    private void Form1_Load(object sender, EventArgs e) { Thread newthread = new Thread(new ThreadStart( ...

  3. Java基础-初识面向对象编程(Object-Oriented-Programming)

    Java基础-初识面向对象编程(Object-Oriented-Programming) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Java是一门面向对象的程序设计语言.那么什 ...

  4. c# winform编程之多线程ui界面资源修改总结篇【转】

    c# winform编程之多线程ui界面资源修改总结篇 单线程的winfom程序中,设置一个控件的值是很easy的事情,直接 this.TextBox1.value = "Hello Wor ...

  5. python递归 及 面向对象初识及编程思想

    递归 及 面向对象初识及编程思想   一.递归 1.定义: 在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数. (1)递归就是在过程或函数里调用自身: (2)在使用递 ...

  6. 泛型的几种类型以及初识winform

    今天学习的可以分为两类吧,但是学习的都是比较抽象的,不太容易掌握吧.首先我们大部分时间学习了泛型,泛型的委托,泛型接口以及枚举器,迭代器,扩展方法:最后简单的认识了webform,实现了一个简单的功能 ...

  7. c# winform编程之多线程ui界面资源修改总结篇

    单线程的winfom程序中,设置一个控件的值是很easy的事情,直接 this.TextBox1.value = "Hello World!";就搞定了,但是如果在一个新线程中这么 ...

  8. 初识shell编程

    1.shell编程之为什么学.怎么学 为什么学shell编程 Linux系统批量管理 提升工作效率,减少重复工作 学好shell编程所需要的基础知识 熟悉使用vim编辑器 熟悉SSH终端 熟练掌握Li ...

  9. 初识并发编程 MPI

    MPI是一个跨语言的通讯协议,用于并发编程.MPI标准定义了一组具有可移植性的编程接口. 安装环境 MPICH 是开源的消息传递接口(MPI)标准的实现. 下载地址 # 解压文件 tar -xzvf ...

随机推荐

  1. RSA加密解密及数字签名Java实现--转

    RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rivest).阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的.当时他们三人都在麻省理工学院 ...

  2. IntelliJIdea快捷键

    Ctrl+Shift+方向键Up/Down 代码向上/下移动. Ctrl+X 删除行 Ctrl+Y 也是删除行,不知道有啥区别 Ctrl+D 复制行 Ctrl+Alt+L 格式化代码 Ctrl+N 查 ...

  3. PYCURL ERROR 22 - "The requested URL returned error: 403 Forbidden"

    RHEL6.5创建本地Yum源后,发现不可用,报错如下: [root@namenode1 html]# yum install gcc Loaded plugins: product-id, refr ...

  4. [CSAPP笔记][第九章虚拟存储器][吐血1500行]

    9.虚拟存储器 为了更加有效地管理存储器且少出错,现代系统提供了对主存的抽象概念,叫做虚拟存储器(VM). 虚拟存储器是硬件异常,硬件地址翻译,主存,磁盘文件和内核软件的完美交互. 为每个进程提供一个 ...

  5. 使用多线程完成Socket

    public class Service { //服务器 public static void main(String[] args) { ServerSocket serverSocket=null ...

  6. 批量执行插入的sql和自动补零

    DECLARE @invoice_no int SET @invoice_no=3 WHILE @invoice_no<=100 --需要插入的次数 BEGIN --此处需要执行的插入sql文 ...

  7. JAVA打印类(带预览)

    package tool; import java.awt.*; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; ...

  8. LINQ对List列表随机排序,取N条数据

    List<Art_Search> artList=new List<Art_Search>(); artList=artList.OrderBy(s => Guid.Ne ...

  9. Eclipse换背景

    http://tieba.baidu.com/p/2128040173 1.打开Eclipse的Help->Eclipse Marketplace 2.在Find里搜索Eclipse Color ...

  10. MOOTOOLS和JQUERY如何同时存在,解决冲突

    mootools-jquery 今天在做EcStore前台的做效果时,由于Jquery的插件比较多,于是就使用了Jquery的插件,但是发现会引起Mootools的冲突. 于是猛找资料,终于找到了,现 ...