正在阅读:经典与现代的结合:在MFC中集成RAD .NET框架经典与现代的结合:在MFC中集成RAD .NET框架

2005-07-14 09:59 出处: 作者:孙辉 责任编辑:moningfeng

  注意,testControl类继承自UserControl类,用户控件是开发者创建的任何控件,您可以将多个.NET控件组织在一起,添加功能代码,然后把它作为一个更综合一些的控件来使用,使用每一个用户控件和使用其他的.NET标准控件的步骤都是没有区别的。在上面的代码中,我们自定义的用户控件仅包含了一个.NET Label控件。

  到目前为止,我们已经可以在原生MFC项目中成功插入.NET控件。然而,因为上面的.NET控件的插入是纯手工方式的,不直观且很难驾驭,一个聪明的办法是实现一个集成在Visual Studio .NET IDE中的Wizard,以使得MFC工程中可以直接使用可视设计器,在随机光盘中,我们提供了相关的Wizard,安装后您就可以直接在MFC项目中插入并可视化设计.NET用户控件了。

  通过集成的Wizard,传统的MFC可以与现代的.NET RAD机制完美的结合在一起,使得你既可以得到传统C++的优雅,又可以享有现代RAD机制的风韵,对资源的整合力度也极大地扩展了。

使用CUserCtrlView类创建、显示.NET控件

  我们为每个MFC文档类增加一个与之对偶的托管对象类,从而得到了一对对偶对。这个与MFC文档对偶的托管对象维护一个托管对象字典,每一个需要在文档中创建的托管控件会根据一个别名添加到这个字典中备查。当文档对象被实例化的时候,其对偶的托管对象也将被实例化,而且有待创建的控件也会被实例化并插入到相关的字典中,同时该对偶托管对象被传递给MFC应用程序对象中的指针变量m_pManagedCnnObj,CUserCtrlView类在调用OnInitialUpdate时,会通过全局变量theApp得到m_pManagedCnnObj,m_pManagedCnnObj就是与MFC文档对偶的托管对象,然后用.NET机制根据别名检索从m_pManagedCnnObj得到所要创建的控件的实例,之后调用SetControl函数将该控件创建出来:

void CUserCtrlView::SetControl(
System::Object *control
)
{
m_Control.pUnkControl =
reinterpret_cast
(System::Runtime::InteropServices::
Marshal::GetIUnknownForObject(
control).ToPointer());
CRect clientRect;
GetClientRect(&clientRect);
CLSID clsid =
{ 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0 } };
m_Control.CreateControl(
clsid, 0, WS_VISIBLE|WS_CHILD,
clientRect, this, 0);
m_Control.ModifyStyleEx(
0, WS_EX_CONTROLPARENT);
}



CUserCtrlView的OnInitialUpdate代码如下:

void CUserCtrlView::OnInitialUpdate()
{
if(!m_bCtrlCreated&&m_strWinCtrlID!=_T(""))
{
Type *t =
theApp.m_pManagedCnnObj->GetType();
MethodInfo *mi = t->GetMethod(S"Connect");
Object *p[] = new Object*[2];
try
{
Object *pObj = NULL;
String *pString[] = new String*[1];
pString[0] = m_strWinCtrlID;
PropertyInfo *m_pPropertyInfo =
t->GetProperty(S"PrjItem");
pObj = m_pPropertyInfo->GetValue(
theApp.m_pManagedCnnObj,pString);
if(pObj)
{
p[0] = pObj;
p[1] = pString[0];
//?????o
mi->Invoke(
theApp.m_pManagedCnnObj, p);
SetControl(pObj);
m_bCtrlCreated = true;
}
}
catch (Exception *exp)
{
CString strInfo = exp->Message;
AfxMessageBox(strInfo);
return;
}
}
CView::OnInitialUpdate();
}

键盘也能翻页,试试“← →”键

相关文章

关注我们

最新资讯离线随时看 聊天吐槽赢奖品