从.Net Framework 1.1开始,.Net控件可以以ActiveX的方式被集成到非托管宿主中——但是官方的支持只对于使用托管C++的MFC程序。Chris Sells在2003年3月份的MSDN杂志中描述了这样一个示例(http://msdn.microsoft.com/msdnmag/issues/03/03/WindowsForms/default.aspx)。这个示例使用的代码稍微繁琐,而且没有描述如何处理控件的事件。MFC 8.0增加了一系列这方面的支持来把这个集成过程简单化(参考http://msdn2.microsoft.com/library/ahdd1h97.aspx)。这使得在MFC程序中使用.Net中的一些比较好用的类,例如System::Windows::Forms::PropertyGrid比以前容易多了。
举例来说,要在MFC的基于对话框的程序中使用System::Windows::Forms::PropertyGrid控件,首先创建一个基于对话框的程序,添加必要的引用:
#include <afxwinforms.h>// MFC Windows Forms support
#using <system.dll>
#using <Microsoft.VisualC.Dll>
#using <System.Drawing.dll>
#using <System.Windows.Forms.dll>
#using <mscorlib.dll>
using namespace System;
using namespace System::Drawing;
using namespace System::Windows::Forms;
using namespace System::ComponentModel;
using namespace Microsoft::VisualC::MFC;
using namespace stdcli::language;
之后添加代码(下面这个类是从MSDN中的充分利用.NET 框架的PropertyGrid 控件这篇文章里面借过来的,关于此控件的更加高级的使用方法也可以参考这篇文章)。
public ref class AppSettings
{
public:
[Description("文档设置"), Category("文档设置"), DefaultValue(false)]
property Boolean saveOnClose ;
[Description("文档设置"),Category("全局设置"), ReadOnly(true),DefaultValue("欢迎使用应用程序!")]
property String^ greetingText ;
[Category("全局设置"), DefaultValue(4)]
property Int32 itemsInMRU ;
[Description("以毫秒表示的文本重复率。"), Category("全局设置"),DefaultValue(10)]
property Int32 maxRepeatRate ;
[Browsable(false), DefaultValue(false)]
property Boolean settingsChanged ;
[Category("版本"), DefaultValue("1.0"), ReadOnly(true)]
property String^ appVersion ;
AppSettings()
{
this->saveOnClose = true;
this->greetingText = gcnew String("欢迎使用应用程序!");
this->maxRepeatRate = 10;
this->itemsInMRU = 4;
this->settingsChanged = false;
this->appVersion = gcnew String("1.0");
}
};
class CPropertyGridTestDlg : public CDialog
{
//为了偷懒起见,向导生成的默认代码省略
CWinFormsControl<System::Windows::Forms::PropertyGrid> m_wndPropertyGrid;
BEGIN_DELEGATE_MAP( CPropertyGridTestDlg )
EVENT_DELEGATE_ENTRY( PropertyValueChanged , Object, PropertyValueChangedEventArgs )
EVENT_DELEGATE_ENTRY( HandleDestroyed , Object, EventArgs )
END_DELEGATE_MAP()
public:
void PropertyValueChanged ( Object^ sender, PropertyValueChangedEventArgs ^ e )
{
TRACE("PropertyValueChanged %S\n", marshal_as<CString>(e->ToString()));
}
void HandleDestroyed( Object^ sender, EventArgs ^ e )
{
TRACE("PropertyValueChanged %S\n", marshal_as<CString>(e->ToString()));
}
};
BOOL CPropertyGridTestDlg::OnInitDialog()
{
//为了偷懒起见,向导生成的默认代码再次省略
// TODO: 在此添加额外的初始化代码
CRect rect;
GetDlgItem(IDC_PLACEHOLDER)->GetWindowRect(rect);//IDC_PLACEHOLDER是一个用来占地方的Static控件
GetDlgItem(IDC_PLACEHOLDER)->DestroyWindow();
ScreenToClient(rect);
m_wndPropertyGrid.CreateManagedControl( WS_VISIBLE|WS_CHILD, rect, this, IDC_PLACEHOLDER );
System::Windows::Forms::PropertyGrid^ pGrid=m_wndPropertyGrid.GetControl();
AppSettings^ appSettings=gcnew AppSettings;
pGrid->SelectedObject=appSettings;
pGrid->PropertyValueChanged += MAKE_DELEGATE( PropertyValueChangedEventHandler ,PropertyValueChanged );
pGrid->HandleDestroyed += MAKE_DELEGATE( System::EventHandler , HandleDestroyed );
}
在VC2005二月份的CTP中使用这个功能还有一些小问题:启动的时候输出窗口有几个警告:还有一个Assert窗口,可以简单地忽略。退出的时候有一个原因不明的内存泄漏。
题外话:尽管我确定marshal_as这个函数2004年4月就在可用(在2004年4月的全球MVP峰会上,我亲眼看见对这个函数的引用在Visual C++ 2005中通过了编译),但是到目前为止我还没发现这家伙到底在哪个头文件或者名称空间里面。为了平时偷懒起见,我不得不自己写了一个模板函数。
template<typename T>
interior_ptr<T> marshal_as (String^ s)
{
interior_ptr<const System::Char> txt=PtrToStringChars (s);
return interior_ptr<T>(txt);
}
这个模板函数在微软的MSDN里面也是语焉不详,或许这个函数现在还没有启用吧。
分享到:
相关推荐
3. **系统Demo分析**:书中可能包含的系统Demo展示了如何在MFC应用中嵌入.NET控件、如何调用.NET服务或者如何将.NET的特性(如事件驱动编程)引入MFC。通过分析这些示例,开发者可以学习到实际操作中的技巧和最佳...
开发者可能需要在MFC应用中集成.NET组件,从而需要理解如何在MFC环境中捕获和处理.NET事件。 在文件名列表中,只有一个“MFC”,这可能是一个包含MFC相关代码的文件夹或者文件,可能包含了示例代码、项目文件或者...
文件列表中的"VTK .Net.pdf"可能包含了详细步骤、示例代码和最佳实践,对于学习如何在MFC中使用VTK.NET非常有帮助。通过阅读这份文档,开发者可以深入理解VTK.NET与MFC结合的实现细节,以及如何在实际项目中应用这些...
在Visual C++ 2008中,MFC已经发展得相当成熟,支持包括C++标准模板库在内的多种功能,同时也集成了对.NET Framework的支持,使得MFC程序可以利用.NET的一些特性。这本书稿可能会涉及以下几个关键知识点: 1. **MFC...
2. **集成到MFC**:将绘图控件添加到MFC工程中,可能需要包含对应的头文件,链接相应的库,并在对话框或视图类中创建控件实例。确保控件在MFC的消息处理机制中正确响应。 3. **数据绑定**:将程序中的数据与绘图...
本教程将详细探讨如何在MFC应用中集成和调用WPF组件,以利用WPF的强大功能。 **1. MFC与WPF的差异** MFC基于C++,提供了一套面向对象的API来处理Windows API,而WPF则是.NET Framework的一部分,使用XAML语言定义UI...
6. **资源管理**:在程序运行过程中,要注意正确管理.NET对象的生命周期,确保在不再需要时释放它们,避免内存泄漏。 通过以上步骤,你就可以在MFC应用中充分利用WPF的现代图形和布局能力,同时保留MFC的C++性能和...
在本文中,我们将深入探讨一个名为"CListImageCtrl"的自定义MFC控件,它专为实现图片的缩略图浏览而设计。这个控件是Windows应用程序开发中的一个重要工具,尤其是在创建类似Windows资源管理器的图片查看功能时。...
参考链接中的博客文章(https://blog.csdn.net/kuisi95/article/details/106613006)可能会提供更具体的实现细节和代码示例,可以帮助你深入理解如何在MFC工程中结合OpenCV划定和处理ROI。这个压缩包文件“ROI”可能...
这个"STK 与 MFC通信示例"的程序旨在教用户如何在MFC应用中与STK进行交互,实现数据的交换和控制。以下是对这两个技术以及它们之间通信的详细解释。 首先,让我们了解STK。STK提供了丰富的功能,包括轨道分析、仿真...
这个项目为初学者提供了一个很好的起点,让他们了解如何在MFC应用程序中集成进度条控件并处理用户交互。同时,对于经验丰富的开发者来说,这也是一个复习基础知识和优化用户界面的好例子。通过学习和实践这个示例,...
在本文中,我们将深入探讨如何使用Microsoft ...这个例子可能涉及到了自定义视图类来处理图像显示,以及如何在MFC框架中集成图像查看功能。你可以通过分析和学习这个示例代码来进一步理解和实践MFC中图片显示的技术。
本示例“MFC中调用WPF的例子”旨在演示如何在MFC应用中嵌入并交互WPF控件,实现C++与C#之间的数据交换和事件通知。 1. **MFC与WPF的集成** MFC应用通常基于Win32 API,而WPF基于.NET Framework。将WPF控件嵌入到...
在VC++.NET中,开发人员可以利用Microsoft的Visual Studio IDE(集成开发环境)进行应用程序的构建。这个IDE提供了丰富的工具集,包括代码编辑器、调试器、项目管理器等,使得开发者能够高效地编写、测试和调试C++...
- **MFC与.NET的集成**:随着.NET Framework的发展,可能还会涉及到如何在MFC应用中调用.NET组件,或者反之。 通过阅读《深入浅出MFC第二版》并实践其中的示例,你将能够熟练掌握MFC的使用,从而更加高效地开发...
本篇文章将深入探讨如何利用MSChart控件在MFC(Microsoft Foundation Classes)环境中构建一个网络流量监控程序。 ### 一、MSChart概述 MSChart是微软提供的一个图表组件,主要应用于.NET Framework,但也可以通过...