如何在 C++ Builder 3.0 下混用兩大 Application Framework VCL & MFC ?
1998-04-25 12:25:12


混用 VCL 與 MFC 的確是個不錯的選擇,但是、相對的,你的程式複雜度反而會提高。

在此先假設你已經看過『如何在 C++ Builder 3.0下編譯含有 的程式』這一篇文章了。因此一些基本知識就不在重複敘述了。

為了討論這個題目,我決定採用範例實作的方式來做解說:

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 應該如何解決呢?以我的習慣來說,我是不會讓編譯器告訴我寫的程式有任何的警告發出的。該怎麼解決的?聰明的讀者,動動腦吧!