using System.Windows.Forms;class MyForm : Form
{
    static void Main()
    {
       Button btn = new Button();
       btn.Parent = this;
       btn.Click = new EventHandler(OnBtnClick);           Application.Run(new MyForm);
    }    protected void OnBtnClick(Object Sender, EventArgs)
    {
         ...
    }
}在这里,按钮的点击响应由一个时间委托来完成,响应函数用的是MyForm类的成员函数,用static也可以。请问:1: 它通过什么手段来回调类的成员函数,因为类的成员函数的地址在运行时才知道,不同于static函数;2: 如果我要用C++自己实现一套这样的事件响应应该怎么做?就是我也可以用我的类的成员函数作为回调函数;3: .NET里面的消息处理和父子窗体的通信是如何进行的? 谢谢! 提供相关资料也可以。

解决方案 »

  1.   

    1。就是同时过事件句柄定义中的  btn.Click = new EventHandler(OnBtnClick);    
    OnBtnClick 标志2。C++ 不太清楚。3. .NET里面的消息处理和父子窗体的通信是如何进行的? 
    ——————————————————————————
    这两者似乎没有关联性吧。
      

  2.   

    问题源于以前我想改进MFC的消息处理方式,但改来改去不是很理想,用了一段时间的.NET, 觉得.NET使用委托技术简化了消息分发和处理,所以想请教它的具体实现方式。.NET架构真的博大精深,值得我们好好学习啊
      

  3.   

    btn.Parent = this;
    static方法中也可以使用this?
    1: 它通过什么手段来回调类的成员函数,因为类的成员函数的地址在运行时才知道,不同于static函数;
    事实上所有的方法都是在编译时完成地址计算的,静态成员属性是编译时计算地址的,而非静成属性只有运行时才能知道地址。2: 如果我要用C++自己实现一套这样的事件响应应该怎么做?就是我也可以用我的类的成员函数作为回调函数;
    在你的类中定义函数指针,然后将外面的函数对其赋值即可。
    3: .NET里面的消息处理和父子窗体的通信是如何进行的? 
    消息处理和MFC中还是差不多的。只是看起来可能更舒服一些了。如果想知道更多,可以反编译后的
    System.Window.Forms
      

  4.   

    对main方法上缺少了STAThread属性标识。
    btn.Parent = this;
      

  5.   

    对main方法上缺少了STAThread属性标识。
    btn.Parent = this;
    都有错误
      

  6.   

    //见笑了代码的确有问题,修正一下;using System.Windows.Forms;class MyForm : Form
    {
        static void Main()
        {
           Application.Run(new MyForm);
        }    public MyForm()
        {
            Button btn = new Button();
            btn.Parent = this;
            btn.Click = new EventHandler(OnBtnClick);        }    protected void OnBtnClick(Object Sender, EventArgs)
        {
             ...
        }
    }//To begincsdn:class A
    {public:   virtual void vfunc1();
       
       virtual void func2();   typedef (A::*FUNC)();   FUNC func;}class B
    {
    public:
       virtual void vfunc1();
     
    }B b = B();b.func = &B::vfunc1; (编译通不过)2: 如果定义了一个基类的函数指针, 就象上面的示例,它不能指向派生类的虚函数;3: 你说的还是差不多是指什么? 父窗口什么时候来创建子窗口,如果查找子窗口?调用哪些函数来做这些动作? 你能用C++实现委托技术么?如果仅仅使用函数指针,不但象上面的写法很奇怪,而且使用起来也有问题,调用这个函数的时候需要实例化类的参与。我觉得.NET应该是使用了反射技术, 不知道哪位能用C++实现一下这套机制。
      

  7.   

    哪位知道有什么好的反编译器除了ILDASM和Reflactor, 这两个工具好像都没法导出完整的代码;
      

  8.   

    btn.Click = new EventHandler(OnBtnClick);
    在静态方法里面不能直接引用非静态的方法(成员),必须通过实例对象引用。烦劳楼主编译通过了再来问哈,编译都通不过的东西就是无法实现。
      

  9.   

    个人以为:
    1、从代理的构造来看
    public class FeedBack:System.MulticastDelegate{
    public FeedBack(Object target,Int32 methodPtr);
    成员:System.Object _target;
    System.Int32 _methodPtr;
    System.MulticastDelegate _prev;
    方法:
    combine,
    remove
    ……
    }
    利用_target和_methodPtr,找到方法地址调用。
    当然是知道了对象的成员地址才调用的。这个调用过程应该是使用了reflection吧
    2、C++中可以使用回调方法的指针链表,我觉得就能理解这里的事件响应了吧,
    b.func = &B::vfunc1; (编译通不过),
    这里应该是b.func=&b.vfunc1吧
    3、.NET里面的父子消息机制,与mfc是类似的吧,我觉得根本都是windows的窗体通信机制,mfc和.net都只是封装了而已
      

  10.   

    我只知道C++,所以以下都是从C++方面回答这个问题
    1.C++在编译时就知道类成员函数的地址。
    2.主要用到模版偏特化,具体实现可以参见boost::function。
    3.net不像MFC,因为不是派生结构,所以不需要父子互相传递消息。
    消息直接发到对应的控件就可以了,下一代的操作系统直接就没消息这个概念了。