VC ++中的代理和事件处理程序 [英] Delegates and Event Handlers in VC++

查看:96
本文介绍了VC ++中的代理和事件处理程序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

好吧,我正在编写我的最后一年项目,因为我把大部分时间都花在了游戏机上。我个人想要用c ++编写代码,尽管目前c#中提供了大量的在线帮助,c#将是一个更好的选择。我需要一种方法来重写c ++中的c#代码块



 使用系统; 
使用 System.Collections.Generic;
使用 System.ComponentModel;
使用 System.Data;
使用 System.Drawing;
使用 System.Text;
使用 System.Windows.Forms;

命名空间 PassBetweenForms
{
public partial class frmMain:表格
{
// 默认构造函数
public frmMain()
{
InitializeComponent();
}

private void frmMain_Load( object sender,EventArgs e)
{
// 无事可做
}

私人 无效 btnSetName_Click( object sender,EventArgs e)
{
frmID f = new frmID ();

// 添加事件处理程序以更新此表单
更新ID表单时(当IdentityUpdated触发时) //
f.IdentityUpdated + = new frmID.IdentityUpdateHandler(IdForm_ButtonClicked);

f.Show();

}

// 从frmId处理事件
private void IdForm_ButtonClicked( object sender,IdentityUpdateEventArgs e)
{
// 更新活动中的表单值args
txtFirstName.Text = e.FirstName;
txtMiddleName.Text = e.MiddleName;
txtLastName.Text = e.LastName;
}


私有 void btnSetAddress_Click(< span class =code-keyword> object sender,EventArgs e)
{
frmAddress f = new frmAddress();

// 添加事件处理程序以更新此表单
地址表单更新时(当AddressUpdated触发时) //
f.AddressUpdated + = new frmAddress.AddressUpdateHandler(AddressForm_ButtonClicked);

f.Show();
}


// 处理来自frmAddress的事件
private void AddressForm_ButtonClicked( object sender,AddressUpdateEventArgs e)
{
// 更新活动中的表单值args
txtStreet.Text = e.Street;
txtCity.Text = e.City;
txtState.Text = e.State;
txtZipCode.Text = e.ZipCode;
}


private void btnExit_Click(< span class =code-keyword> object sender,EventArgs e)
{
Application.Exit();
}
}
}















 使用系统; 
使用 System.Collections.Generic;
使用 System.ComponentModel;
使用 System.Data;
使用 System.Drawing;
使用 System.Text;
使用 System.Windows.Forms;

命名空间 PassBetweenForms
{
public partial class frmID:表格
{

// 添加代理
public 委托 void IdentityUpdateHandler( object sender,IdentityUpdateEventArgs e);

// 添加委托类型的事件
< span class =code-keyword> public event IdentityUpdateHandler IdentityUpdated;


// 默认构造函数
public frmID()
{
InitializeComponent();
}

// 关闭表单而不举起活动
private void btnCancel_Click( object sender,EventArgs e)
{
this .Dispose();
}

// 举起活动
private void btnOkay_Click( object sender,EventArgs e)
{
// 此按钮点击事件处理程序将提升
// 事件,然后可以被任何听众拦截

< span class =code-comment> // 读取文本框并设置成员变量
string sNewFirst = txtFirstName.Text;
string sNewMiddle = txtMiddleName.Text;
string sNewLast = txtLastName.Text;

// 实例事件args并传递每个值
IdentityUpdateEventArgs args = new IdentityUpdateEventArgs(sNewFirst,
sNewMiddle,sNewLast);

// 使用更新的参数引发事件
IdentityUpdated ( this ,args);

this .Dispose();
}
}


public class IdentityUpdateEventArgs:System.EventArgs
{
// 添加本地成员变量以保存文本
private string mFirstName;
private string mMiddleName;
private string mLastName;

// 类构造函数
public IdentityUpdateEventArgs( string sFirstName, string sMiddleName, string sLastName)
{
this .mFirstName = sFirstName;
this .middleName = sMiddleName;
this .mLastName = sLastName;
}

// 属性 - 听众可以访问

public string FirstName
{
get
{
return mFirstName;
}
}

public string MiddleName
{
get
{
return mMiddleName;
}
}


public string LastName
{
get
{
return mLastName;
}
}
}
}

解决方案

真的应该不大如果你使用MFC作为GUI,它的CString类用于字符串。唯一的问题是回调及其处理程序。



我喜欢它,就像在旧的方式一样示例代码。一些摘录:

  //  声明函数类型 
typedef int (* CallbackType )( float );
// 它可用作变量
CallbackType callback =& DoWork ; // 将其分配给一个函数(具有匹配的签名)


Okay, i'm writing my final year project after spending most of my time programming in consoles.My dilemna is i personally want to code in c++ even though at present with the abundance of online help in c#, c# would be a better option.I need a way to rewrite this block of c# code in c++

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace PassBetweenForms
{
    public partial class frmMain : Form
    {
        // default constructor
        public frmMain()
        {
            InitializeComponent();
        }

        private void frmMain_Load(object sender, EventArgs e)
        {
            // nothing to do
        }

        private void btnSetName_Click(object sender, EventArgs e)
        {
            frmID f = new frmID();

            // Add an event handler to update this form
            // when the ID form is updated (when IdentityUpdated fires).
            f.IdentityUpdated += new frmID.IdentityUpdateHandler(IdForm_ButtonClicked);

            f.Show();

        }

        // handles the event from frmId
        private void IdForm_ButtonClicked(object sender, IdentityUpdateEventArgs e)
        {
            // update the forms values from the event args
            txtFirstName.Text = e.FirstName;
            txtMiddleName.Text = e.MiddleName;
            txtLastName.Text = e.LastName;
        }


        private void btnSetAddress_Click(object sender, EventArgs e)
        {
            frmAddress f = new frmAddress();

            // Add an event handler to update this form
            // when the address form is updated (when AddressUpdated fires).
            f.AddressUpdated += new frmAddress.AddressUpdateHandler(AddressForm_ButtonClicked);

            f.Show();
        }


        // handles the event from frmAddress
        private void AddressForm_ButtonClicked(object sender, AddressUpdateEventArgs e)
        {
            // update the forms values from the event args
            txtStreet.Text = e.Street;
            txtCity.Text = e.City;
            txtState.Text = e.State;
            txtZipCode.Text = e.ZipCode;
        }


        private void btnExit_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }
    }
}








using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace PassBetweenForms
{
    public partial class frmID : Form
    {

        // add a delegate
        public delegate void IdentityUpdateHandler(object sender, IdentityUpdateEventArgs e);

        // add an event of the delegate type
        public event IdentityUpdateHandler IdentityUpdated;


        // default constructor
        public frmID()
        {
            InitializeComponent();
        }

        // close the form without raising the event
        private void btnCancel_Click(object sender, EventArgs e)
        {
            this.Dispose();
        }

        // raise the event
        private void btnOkay_Click(object sender, EventArgs e)
        {
            // this button click event handler will raise the
            // event which can then intercepted by any listeners

            // read the textboxes and set the member variables
            string sNewFirst = txtFirstName.Text;
            string sNewMiddle = txtMiddleName.Text;
            string sNewLast = txtLastName.Text;

            // instance the event args and pass it each value
            IdentityUpdateEventArgs args = new IdentityUpdateEventArgs(sNewFirst,
                sNewMiddle, sNewLast);

            // raise the event with the updated arguments
            IdentityUpdated(this, args);

            this.Dispose();
        }
    }


    public class IdentityUpdateEventArgs : System.EventArgs
    {
        // add local member variable to hold text
        private string mFirstName;
        private string mMiddleName;
        private string mLastName;

        // class constructor
        public IdentityUpdateEventArgs(string sFirstName, string sMiddleName, string sLastName)
        {
            this.mFirstName = sFirstName;
            this.mMiddleName = sMiddleName;
            this.mLastName = sLastName;
        }

        // Properties - Accessible by the listener

        public string FirstName
        {
            get
            {
                return mFirstName;
            }
        }

        public string MiddleName
        {
            get
            {
                return mMiddleName;
            }
        }


        public string LastName
        {
            get
            {
                return mLastName;
            }
        }
    }
}

解决方案

It really should be no big deal if you use MFC for the GUI and its CString class for the strings. The only problem will be the callback and its handlers.

I prefer it like in the old way like in this sample code. Some excerpt:

//declare a function type
typedef int (*CallbackType)(float); 
//it is useable as a variable
CallbackType callback = &DoWork;//assign it to a function (with matching signature)


这篇关于VC ++中的代理和事件处理程序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆