MFC与.NET互操作中的控件绑定和消息映射

    最近开发工作比较忙,所以没有来得及上网,今天看到有朋友询问MFC 与.NET互操作的消息映射 的问题,其实MSDN帮助中有非常详细的说明,我这里将有关内容粘贴过来:
数据绑定
 

DDX_ManagedControl 调用 CWinFormsControl::CreateManagedControl 以创建一个与资源控件 ID 匹配的控件。如果对 CWinFormsControl 控件使用 DDX_ManagedControl(在向导生成的代码中),则不应对同一控件显式调用 CreateManagedControl。

在 CWnd::DoDataExchange 中调用 DDX_ManagedControl 可以根据资源 ID 来创建控件。对于数据交换,不需要对 Windows 窗体控件使用 DDX/DDV 函数。可以在对话框(或视图)类的 DoDataExchange 方法中插入代码以访问托管控件的属性,如下例所示。

下面的示例演示如何将本机 C++ 字符串绑定到 .NET 用户控件。

示例

下面的示例为 MFC 字符串 m_str 与 .NET 用户控件的用户定义的 NameText 属性进行 DDX/DDV 数据绑定。

当 CDialog::OnInitDialog 第一次调用 CMyDlg::DoDataExchange 时创建该控件,因此,引用 m_UserControl 的任何代码都必须在 DDX_ManagedControl 调用之后。

可以在从如何:创建用户控件并将它承载在对话框中中创建的 MFC01 应用程序中实现此代码。

将以下代码放在 CMFC01Dlg 的声明中:

  CopyCode image复制代码
class CMFC01Dlg : public CDialog
{
CWinFormsControl<WindowsControlLibrary1::UserControl1> m_MyControl;
CString m_str;
};

将以下代码放在 CMFC01Dlg 的实现中:

  CopyCode image复制代码
void CMFC01Dlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_ManagedControl(pDX, IDC_CTRL1, m_MyControl);

if (pDX->m_bSaveAndValidate) {
m_str = m_MyControl->textBox1->Text;
} else
{
m_MyControl->textBox1->Text = gcnew System::String(m_str);
}
}

现在,我们将为“确定”按钮的单击添加处理程序方法。单击“资源视图”选项卡。在“资源视图”中,双击 IDD_MFC01_DIALOG。对话框资源将显示在“资源编辑器”中。然后双击“确定”按钮。

按如下方式定义处理程序。

  CopyCode image复制代码
void CMFC01Dlg::OnBnClickedOk()
{
AfxMessageBox(CString(m_MyControl.GetControl()->textBox1->Text));
OnOK();
}

并将下行添加到 BOOL CMFC01Dlg::OnInitDialog() 的实现中。

  CopyCode image复制代码
   m_MyControl.GetControl()->textBox1->Text = "hello";

现在可以生成并运行应用程序。请注意,当应用程序关闭时,文本框中的任何文本将显示在弹出消息框中。

消息映射

 

可以启用本机 C++ 类从 Windows 窗体控件或其他具有 MFC 宏映射格式的窗体所引发的托管事件中接收回调。接收视图或对话框中的事件类似于接收控件中的事件。

为此,必须:

  • 使用 MAKE_DELEGATE 将 OnClick 事件处理程序附加到该控件。

  • 使用 BEGIN_DELEGATE_MAP 、 END_DELEGATE_MAP 和 EVENT_DELEGATE_ENTRY 创建委托映射。

示例

此示例继续执行您在如何:使用 Windows 窗体执行 DDX/DDV 数据绑定中完成的工作。

现在,将 MFC 控件 (m_MyControl) 与托管 Click 事件的名为 OnClick 的托管事件处理程序委托相关联。

将第一行代码添加到 BOOL CMFC01Dlg::OnInitDialog 的实现中。

将委托映射和 OnClick 定义添加到 CMFC01Dlg 类声明中的 public 节中:public CDialog。

  CopyCode image复制代码
m_MyControl.GetControl()->button1->Click += MAKE_DELEGATE( System::EventHandler, OnClick );

// delegate map
BEGIN_DELEGATE_MAP( CMFC01Dlg )
EVENT_DELEGATE_ENTRY( OnClick, System::Object^, System::EventArgs^ )
END_DELEGATE_MAP()

void OnClick( System::Object^ sender, System::EventArgs^ e ) {}


实际上关于互操作的问题在MSDN中有详细的解释,只需在MSDN的索引中输入“互操作”三个字,就可以找到与互操作有关的所有文章和说明。自己只要按照MSDN的说明编写一个例子程序,就可以理解有关内容。

对于我接下来的时间,因为要完成一个新的产品的开发,其中有一个报表程序控件是使用C#编写的,我需要在MFC多文档主程序中调用,因此需要使用互操作的问题,而且将来还希望程序支持脚本和二次开发,也需要互操作来实现。


你可能感兴趣的:(C++,.net,windows,object,System,mfc)