当前位置: 首页 > news >正文

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,那么思想流程也就理所应当一模一样了

相关文章:

  • 变参函数——stdarg——printf——variable and function
  • 新视野OJ 2818: Gcd
  • 微软云技术Windows Azure专题(四):如何利用Mobile Service的计划程序连接到Service Bus定时推送消息...
  • Python 入门教程 16 ---- Introduction to Bitwise Operators
  • table与div对待边框的一点儿区别
  • 浅析人脸检测之Haar分类器方法
  • 震撼!!
  • Linux基本操作 7----- vi操作的详细信息
  • 基准电压——Reference voltage
  • linux下alias命令
  • 黑马程序员_properties,打印流,合并流,分割流
  • 软件架构师的12项修炼_读书纪要_P3商务技能修炼
  • 内存对齐规则
  • 【Deep Learning学习笔记】Deep learning for nlp without magic_Bengio_ppt_acl2012
  • 不用外部JAR包,自己实现JSP文件上传!
  • 分享一款快速APP功能测试工具
  • (三)从jvm层面了解线程的启动和停止
  • 【347天】每日项目总结系列085(2018.01.18)
  • Apache Spark Streaming 使用实例
  • Brief introduction of how to 'Call, Apply and Bind'
  • Java 实战开发之spring、logback配置及chrome开发神器(六)
  • Javascript 原型链
  • javascript从右向左截取指定位数字符的3种方法
  • JavaScript学习总结——原型
  • java中的hashCode
  • Python 反序列化安全问题(二)
  • Python学习之路13-记分
  • Vue官网教程学习过程中值得记录的一些事情
  • Webpack入门之遇到的那些坑,系列示例Demo
  • 对超线程几个不同角度的解释
  • 构建工具 - 收藏集 - 掘金
  • 检测对象或数组
  • 免费小说阅读小程序
  • 如何实现 font-size 的响应式
  • 如何使用Mybatis第三方插件--PageHelper实现分页操作
  • 双管齐下,VMware的容器新战略
  • 无服务器化是企业 IT 架构的未来吗?
  • gunicorn工作原理
  • LIGO、Virgo第三轮探测告捷,同时探测到一对黑洞合并产生的引力波事件 ...
  • 分布式关系型数据库服务 DRDS 支持显示的 Prepare 及逻辑库锁功能等多项能力 ...
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • ​卜东波研究员:高观点下的少儿计算思维
  • ​水经微图Web1.5.0版即将上线
  • #在 README.md 中生成项目目录结构
  • (1)(1.11) SiK Radio v2(一)
  • (android 地图实战开发)3 在地图上显示当前位置和自定义银行位置
  • (Repost) Getting Genode with TrustZone on the i.MX
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (十)DDRC架构组成、效率Efficiency及功能实现
  • (学习日记)2024.04.04:UCOSIII第三十二节:计数信号量实验
  • (转)Oracle存储过程编写经验和优化措施
  • (转)程序员技术练级攻略
  • (转)可以带来幸福的一本书
  • ******IT公司面试题汇总+优秀技术博客汇总
  • *1 计算机基础和操作系统基础及几大协议