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