在MFC中集成RAD .NET框架

http://tech.ddvip.com   2007年06月21日    社区交流

内容摘要:关于是MFC还是.NET的讨论时隐时现,不绝于耳。CLR是个充满魅力的世界,这种魅力,使得C#、VB.NET等变得光彩夺目。然而,MFC并没有衰老,如果你深入的了解MFC,你会发现,MFC完全可以与C#、VB.NET争奇斗艳……

  到目前为止,我们已经可以在原生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<IUnknown*>
    (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代码如下:

来源:microsoft    作者:孙辉    责编:豆豆技术应用

正在加载评论...