经典与现代的结合:在MFC中集成RAD.NET框架
2008-03-08 21:40:24 来源:WEB开发网 【

核心提示:MFC已经有十几年的历史了,然而直到今天,经典与现代的结合:在MFC中集成RAD.NET框架,他仍然是Visual C++的要害组成部分,从1996年的Visual C++ 4.2至今将近8年的时间,使得你既可以得到传统C++的优雅,又可以享有现代RAD机制的风韵,MFC的主体特征没有出现明显的变化,依旧是“古老”的面
MFC已经有十几年的历史了,然而直到今天,他仍然是Visual C++的要害组成部分。从1996年的Visual C++ 4.2至今将近8年的时间,MFC的主体特征没有出现明显的变化,依旧是“古老”的面孔,因此关于这个类库的种种评论自然是情理之中的事情了。从我个人的观点上看,MFC功能依旧健壮、强大,而且是业界少有的、稳定的、经过足够长历史考验的开发框架。深入研究这个类库,你会找到酒越酿越醇的感觉。MFC的一个成功因素之一就是提供了一套完整的Document/View框架,然而这一点也是许多针对MFC批评的矛头指向。也许是由于这个框架太经典,使人们看上去MFC不再“婷婷玉立”,而是“人老珠黄”,以至于打开今天的Visual Studio IDE的时候,多少会有点不协调的感觉:比起其它基于.NET框架的开发语言,用MFC开发会显得很“土气”、“孤独”——没有RAD机制,明显的缺乏与其它时髦对象的“互操作”能力,而且严格恪守自己的领地。每当生成一个基于文档的MFC程序,我们总是看到一张沧桑的面孔,似乎刘姥姥进入大观园,与四周时髦的C#、VB.NET等存在明显的“代沟”与“不相容”。曾经有很多人问我MFC还有前途吗?是否已经行将就木?关于是MFC还是.NET的讨论时隐时现,不绝于耳。CLR是个布满魅力的世界,这种魅力,使得C#、VB.NET等变得光彩夺目。然而,MFC并没有衰老,假如你深入的了解MFC,你会发现,MFC完全可以与C#、VB.NET争奇斗艳……
在MFC项目中使用托管扩展
支持托管扩展
.NET FrameWork提供的托管扩展支持确保了在MFC项目支持托管扩展(CLR),开发者可以使MFC工程(本文我们将使用Test作为工程名称)通过打开项目的托管扩展属性开关,来增加编译器的托管支持(如图1)。



以下是引用片段: namespace test { __gc public class testDocObject : public Object { public: testDocObject(void) { } }; } |
以下是引用片段: public: gcroot<test::testDocObject*> m_ptestDocObj; |
以下是引用片段: BOOL CtestDoc::InitialDocument() { #PRagma push_macro("new") #undef new m_ptestDocObj = new test::testDocObject(); #pragma pop_macro("new") } |

以下是引用片段: class CWFControlWrapper : public CWnd { public: CWFControlWrapper(); virtual ~CWFControlWrapper(void); IUnknown *pUnkControl; IUnknown *GetManagedControl() { return pUnkControl; } void SetControlSite(COleControlSite *pSite) { m_pCtrlSite = pSite; } }; |

以下是引用片段: BOOL CUserCtrlView::PreTranslateMessage(MSG *pMsg) { BOOL bRet = FALSE; if(m_Control.pUnkControl != NULL) { CComQiptr<IOleInPlaceActiveObject> spInPlace(m_Control.pUnkControl); if(spInPlace) bRet =(S_OK == spInPlace-> TranslateAccelerator(pMsg)) ? TRUE : FALSE; } if(CView::PreTranslateMessage(pMsg)) return TRUE; CFrameWnd *pFrameWnd = GetTopLevelFrame(); if(pFrameWnd != NULL && pFrameWnd->m_bHelpMode) return FALSE; // start with first parent frame pFrameWnd = GetParentFrame(); while(pFrameWnd != NULL) { if(pFrameWnd->PreTranslateMessage(pMsg)) return TRUE; pFrameWnd = pFrameWnd->GetParentFrame(); } return bRet; } |
以下是引用片段: #pragma once ... namespace test { public __gc class testControl : public System::Windows::Forms::UserControl { public: testControl(void) { InitializeComponent(); } protected: void Dispose(Boolean disposing) { if(disposing && components) components->Dispose(); __super::Dispose(disposing); } private: System::Windows::Forms::Label *label1; System::ComponentModel::Container *components; void InitializeComponent(void) { this->label1 = new System::Windows::Forms::Label(); this->SuspendLayout(); this->label1->Location = System::Drawing::Point(16, 24); this->label1->Name = S"label1"; this->label1->Size = System::Drawing::Size(208, 16); this->label1->TabIndex = 0; this->label1->Text = S"Welcome to TZ MFC.NET!"; this->Controls->Add(this->label1); this->Name = S"testControl"; this->Size = System::Drawing::Size(240, 160); this->ResumeLayout(false); } }; } |
- ››结合照片打造时尚炫酷的草图效果
- ››经典再续 Windows XP的15个特殊小技巧
- ››结合 Dojo 和 JAX-RS 创建 RESTful 服务
- ››经典游戏贪吃蛇 Java实现源代码
- ››结合 GFX,DnD 与 Dijit 创建基于 Dojo 的 Web 图...
- ››结合使用 CICS 和 DB2 pureXML
- ››结合使用 IBM InfoSphere Warehouse Design Studi...
- ››结合使用 IBM InfoSphere Warehouse Design Studi...
- ››经典2代苹果机 iPhone 3G 16GB售价3150元
- ››经典高速兼得 迅雷新版开启四重加速通
- ››结合使用 Apache Geronimo 和 Lift:用 Lift 创建...
- ››结合使用 Ajax 和 WebSphere Portal
赞助商链接