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 = 300;
            Width = 500;
            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 = 300;
            this.Width = 500;
            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

运行效果

本文完

时间: 2024-11-07 02:35:02

Windows Forms (一)的相关文章

Catch Application Exceptions in a Windows Forms Application

You need to handle the System.Windows.Forms.Application.ThreadException event for Windows Forms. This article really helped me: http://bytes.com/forum/thread236199.html. Application.ThreadException += new ThreadExceptionEventHandler(MyCommonException

DotNetBar for Windows Forms 14.0.0.3_冰河之刃重打包版原创发布

关于 DotNetBar for Windows Forms 14.0.0.3_冰河之刃重打包版 --------------------11.8.0.8_冰河之刃重打包版---------------------------------------------------------基于 官方原版的安装包 + http://www.cnblogs.com/tracky 提供的补丁DLL制作而成.安装之后,直接就可以用了.省心省事.不必再单独的打一次补丁包了.本安装包和补丁包一样都删除了官方自带

System.Diagnostic.Process.Start vs System.Windows.Forms.Help.ShowHelp 打开CHM文件

CHM文件,Microsoft Compiled HTML Help,即"已编辑的帮助文件",包含一系列的HTML文件,index文件和其它的导航工具,经常作为产品的帮助文件[1]. 在.Net程序中,打开这种文件最简单的方式就是调用System.Windows.Forms.Help.ShowHelp()方法.根据MSDN,重载了四种调用方式[2].Control为父控件,string为Help文件的URL,HelpNavigator是一个枚举类型,可以采用Index或者Topic或者

Windows Forms编程实战学习:第一章 初识Windows Forms

初识Windows Forms 1,用C#编程 using System.Windows.Forms; ? [assembly: System.Reflection.AssemblyVersion("1.0")] ? namespace MyNamespace { public class MyForm : Form { public MyForm() { this.Text = "Hello Form"; } [System.STAThread] public s

可编程的文字处理引擎TX Text Control .NET Server for Windows Forms

TX Text Control .NET Server for Windows Forms控件是一个完全可编程的,用于ASP.NET服务器环境与 Microsoft Internet Explorer的文字处理引擎.它的设计理念就是在服务器端集中文字处理过程. 具体功能: 直接在浏览器中以所见即所得方式编辑文档 TX Text Control .NET Server为您提供了一个浏览器控件,通过它可以在微软IE中以进行所见即所得模式进行文本处理,甚至使用来自不同源的数据从零开始通过编程生成文档.

Essential Diagram for Windows Forms绘图控件图解及下载地址

Essential Diagram for Windows Forms是一款可扩展的.高性能的.NET平台下的绘图控件,可用于开发像Microsoft Visio一样的交互式地绘图和图解应用程序,在节点存储图形对象,支持矢量和光栅图形. 具体功能: 支持多种导出格式:如位图.增强的元文件.SVG文件格式 控件采用清晰的MVC设计,把数据层.表现层和用户层分离 子节点属性可以从父节点继承,开发人员可以应用属性值到一个节点或所有子节点 支持在运行时添加自定义属性 多种线条节点和连接器,支持多种连接线

System.Windows.Forms

1 File: winforms\Managed\System\WinForms\DataGridView.cs 2 Project: ndp\fx\src\System.Windows.Forms.csproj (System.Windows.Forms) 3 4 //------------------------------------------------------------------------------ 5 // <copyright file="DataGridVi

System.Windows.Forms.Timer、System.Timers.Timer、System.Threading.Timer的差别和分别什么时候用

一.System.Windows.Forms.Timer 1.基于Windows消息循环,用事件方式触发,在界面线程执行:是使用得比较多的Timer,Timer Start之后定时(按设定的Interval)调用挂接在Tick事件上的EvnetHandler.在这种Timer的EventHandler中可 以直接获取和修改UI元素而不会出现问题--因为这种Timer实际上就是在UI线程自身上进行调用的. 2.它是一个基于Form的计时器3.创建之后,你可以使用Interval设置Tick之间的跨

错误 128 无法将类型“string”隐式转换为“System.Windows.Forms.DataGridViewTextBoxColumn”

原因是DataGridView中列的Name属性值和DataPropertyName属性值一样,比如Name="CardID",DataPropertyName="CardID",这样会出现 :错误 128 无法将类型"string"隐式转换为"System.Windows.Forms.DataGridViewTextBoxColumn"

System.Windows.Forms.Control : Component, IOleControl, IOleObject, IOleInPlaceObject, IOleInPlaceActiveObject....

#region 程序集 System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 // C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Windows.Forms.dll #endregion using System.Collections; using System.ComponentModel; using Syst