博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#中消息的工作流程
阅读量:6230 次
发布时间:2019-06-21

本文共 1557 字,大约阅读时间需要 5 分钟。

C#中的消息被Application类从应用程序消息队列中取出,然后分发到消息对应的窗体,窗体对象的第一个响应函数是对象中的protected override void WndProc(ref System.Windows.Forms.Message e)方法。

    它再根据消息的类型调用默认的消息响应函数(如OnMouseDown),默认的响应函数然后根据对象的事件字段(如this.MouseDown )中的函数指针列表,调用用户所加入的响应函数(如Form1_MouseDown1和Form1_MouseDown2),而且调用顺序和用户添加顺序一致

根据这个流程,我做了个模仿程序,有不足的地方还请大家提供更完善的补充。

 

using System;

 

//创建一个委托,返回类型void,两个参数

public delegate void KeyDownEventHandler(object sender, KeyEventArgs e);

//数据参数类

class KeyEventArgs : EventArgs  

{

    private char keyChar;

    public KeyEventArgs(char keyChar)

        : base()

    {

        this.keyChar = keyChar;

    }

    public char KeyChar

    {

        get { return keyChar; }

    }

}

 

//模仿Application类

class M_Application

{

 

    public static void Run(M_Form form)

    {

        bool finished = false;

        do

        {

            Console.WriteLine("Input a char");

            string response = Console.ReadLine();

            char responseChar = (response == "") ? ' ' : char.ToUpper(response[0]);

            switch (responseChar)

            {

                case 'X':

                    finished = true;

                    break;

                default:

                    //得到按键信息的参数

                    KeyEventArgs keyEventArgs = new KeyEventArgs(responseChar);

                    //向窗体发送一个消息

                    form.WndProc(keyEventArgs);

                    break;

 

            }

        } while (!finished);

    }

}

//模仿窗体类

class M_Form

{

 

    //定义事件

    public event KeyDownEventHandler KeyDown;

    public M_Form()

    {

        this.KeyDown += new KeyDownEventHandler(this.M_Form_KeyDown);

    }

 

    //事件处理函数

    private void M_Form_KeyDown(object sender, KeyEventArgs e)

    {

        Console.WriteLine("Capture key:{0}", e.KeyChar);

    }

 

    //窗体处理函数

    public void WndProc(KeyEventArgs e)

    {

        KeyDown(this, e);

    }

 

}

 

//主程序运行

class MainEntryPoint

{

    static void Main()

    {

        M_Application.Run(new M_Form());

    }

}

转载于:https://www.cnblogs.com/wwwzzg168/p/3569979.html

你可能感兴趣的文章
EBS多语言
查看>>
多线程系列五:并发工具类和并发容器
查看>>
POJ 3077 Rounders
查看>>
springMVC源码分析
查看>>
解决VS2010无法新建项目的问题
查看>>
彻底终结MySQL同步延迟问题
查看>>
cxGrid使用汇总3
查看>>
sqlserver 导入excel数据
查看>>
Android IOS WebRTC 音视频开发总结(五十)-- 技术服务如何定价?
查看>>
MyEclipse如何配置Struts2源码的框架压缩包
查看>>
数据系列:通过Windows Azure SQL数据库防火墙规则控制数据库访问
查看>>
Windows Azure 社区新闻综述(#72 版)
查看>>
git 删除文件
查看>>
GAN-生成对抗网络原理
查看>>
单片机
查看>>
liveshow回顾
查看>>
yii2中的场景使用
查看>>
AES加密,解密方法
查看>>
NOIP 2014 提高组 Day1
查看>>
bzoj千题计划254:bzoj2286: [Sdoi2011]消耗战
查看>>