在 C++ Builder 3.0 下混用两大 Application Framework VCL & MFC
混用 VCL 与 MFC 的确是个不错的选择，但是、相对的，你的程式复杂度反而会 提高。 在此先假设你已经看过『在 C++ Builder 3.0下编译含有MFC 的程式』这一篇文 章了。因此一些基本知识就不在重复叙述了。 为了讨论这个题目，我决定采用范例实作的方式来做解说： Step 1. 先用你知道的方法来建立一个空的、且可以正确编译 MFC 的 Project （不懂的可 以参考『如何在 C++ Builder 3.0下编译含有 的程式』这篇文章）。在此先假设 此 Project 名称为Project1，而 MainForm 为 Form1 ，MainForm 的档案为 unit1.cpp，皆以 BCB 3.0 产生的为预设值，因此这时候你应该会有下列这些档案 了： Project1.bpr Project1.cpp Unit1.cpp Unit1.h Unit1.dfm Step 2. 在这个范例中，我决定采用两个 MFC 的类别 (Class) 来与 C++ Builder 的 VCL 混用，而这两个类别分别是 CFileDialog 与 CPoint 。 OK，知道了这些後，我们先 Design 一些东西在 Form 上来使用 MFC 的类别吧！ 先置放两个 Label 元件与一个 Button 元件，如下图： Step 3. 紧接著就是开始动手加入所们所要的 MFC code 啦，不过在此之前，先必须将 MFC 用的宣告档给加进来： //--------------------------------------------------------------------------- #include <afxwin.h> #include <Afxdlgs.h> #include <vcl.h> 不过要注意的是， MFC 所用的 Header 档要先於 #include <vcl.h> 之前喔！否则， 你一定会在编译时得到一大堆的 Error ！ Step 4. 当 Header 档给设定好後，我们开始来作 VCL 与 MFC 的混用吧！ 我们先来使用 CPoint 这个类别吧！ 先为 Form 建立 OnMouseMove 的个事件，并加入以下这些 Code ： void __fastcall TForm1::FormMouseMove(TObject *Sender, TShiftState Shift, int X, int Y) { CPoint Ps; Ps.x =X; Ps.y =Y; Label1->Caption = "X :" + (AnsiString)Ps.x + " Y :" + (AnsiString)Ps.y; } OK，这样一来就可以编译啦！不过你在编译时，准会得到一大堆 Warning ，这是因为 MFC 中的一些 Marco 与 BCB 的同样名字，所以罗，会得到 这些 Warning 使很正常的啦！不过幸好只是warning 而不是 error ，不 然就不能编译成功了。 编译成功後，你可以发现当你移动滑鼠时， From 上的 Label1 会一直秀 出你现在的滑鼠游标，这样一来，使用 CPoint 这个类别就算成功了。 过你或许会想，何不直接用原先传进来的 X 与 Y 就可以了，何必动用到 CPoint 这个类别呢？ 嘿嘿，如果你不用这样，怎麽表现 MFC 与 VCL 的混用呢？ Step 5. 嗯，接著我们就再来实作 CFileDialog 类别在 BCB 下使用 先为 Form 上的 Button 建立 OnClick 这个 Event ，并加入以下这些 Code ： void __fastcall TForm1::Button1Click(TObject *Sender) { CFileDialog dlg( TRUE,"CPP","*.CPP", OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, _T("C++ Source File (*.cpp)")); if( dlg.DoModal()==IDOK ) { Label2->Caption = (AnsiString)dlg.GetPathName(); } } 一样的，在编译时会得到许多 warning ，但是编译完成後，按下此 Button 你将会得到与使用VCL 中的 TOpenDialog 类别相同的画面，当你 选择好档案後 Form 上的 Label2 也会换成你所选择的档案名称了，这样 一来 CFileDialog 与 VCL 的混用也一样成功了。 执行结果 范例程式: 不可不知道 这个范例中，你可以学到 MFC 与 VCL 的混用。但是，还遗留的一些问题 等待解决，如那些编译时的 warning 应该如何解决呢？以我的习惯来说， 我是不会让编译器告诉我写的程式有任何的警告发出的。该怎麽解决的？ 聪明的读者，动动脑吧！