zoukankan      html  css  js  c++  java
  • <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,那么思想流程也就理所应当一模一样了

  • 相关阅读:
    ThinkPHP---thinkphp视图(V)
    PHP封装文件上传
    小数据池、深浅拷贝、集合
    字典、字典嵌套
    列表、元组、range
    字符串详解:整型、可变数据类型和不可变数据类型、进制转换、索引、切片、步长、字符串方法、进制转换
    while循环、break、格式化、运算符、编码初始
    强烈推荐一款CSS导航菜单
    解决WEB页面上"焦点控制"一法
    新闻发布项目——后台JSP界面adminManage/manageTopic.jsp
  • 原文地址:https://www.cnblogs.com/keanuyaoo/p/3353216.html
Copyright © 2011-2022 走看看