隨想錄(MFC開發有感)

【 聲明:版權所有,歡迎轉載,請勿用於商業用途。 聯繫信箱:feixiaoxing @163.com】

 

    雖然之前也寫過一些mfc的文章,但是時間長了也會忘了。對於很多同學來說,用C#開發圖形界面又快又方便。但是像我們這些從VC6.0就開始寫軟件的老人來講,用MFC開發代碼還是挺順手的。今天看到MFC從VS2017版本開始,已經不是默認安裝的了,心中還是有一些感慨的。

 

1、MFC只是WINDOWS API的封裝

    開發windows圖形界面程序,不用MFC也是可以的。只是用MFC比較方便而已。你可以不用敲代碼、或者使用很少量的代碼,就可以做出你想要的功能的。MFC創建了數百個類,這些類將API全部封裝起來,從控件到定時器、多線程,事無鉅細,使用起來不是特別複雜,當然前提是你比較會使用MSDN來查詢信息。

 

2、MFC需要你精通C++

    客觀來說,MFC的學習門檻還是比較高的。所有編程語言中,C++是公認比較難學的語言,特別難精通。很多人可以說精通C,但是如果自詡精通C++恐怕還是打一個問號的。C++裏面的類、友元、繼承、虛函數、多重繼承、模板、泛化、STL、Boost等等,能學會使用就很不錯了的。況且爲了實現MFC功能,早期的WINDOWS工程師使用了好多的編程技巧,閱讀MFC源碼有一定難度的。

 

3、MFC的開發思路

    雖然有這樣、那樣的困難,但是MFC用的時間長了,你會發現MFC開發並不難。從Application、MainFrame、ChildFrame、Doc、View,整個架構是一脈相承的。即使好長時間不寫MFC代碼了,過一段時間重新把代碼拿過來看,熟悉起來也不是很複雜。Application負責整個應用的創建,將ChildFrame、Doc、View綁定在一起,進而構建MainFrame。MainFrame負責窗體搭建、ChildFrame負責子窗體搭建,Doc負責文檔搭建,View負責圖形化顯示,基本上就是這麼分工的。

 

4、最新的MFC

    觀察最新的MFC代碼,特別是VS2015之後,你會發現多了ClassView、FileView、OutputWnd、PropertiesWnd、ViewTree這五個文件。前面4個的主要功能是在MainFrame裏面添加額外的窗口顯示,這也符合現在的主流界面要求,類似於eclipse界面一樣。而ViewTree結構則主要是被ClassView和FileView使用。至於MainFrame、Doc、View還和之前一樣,都是在App類裏面被調用的。

 

5、使用最多的MFC類型

    相比較MutilDocument和SingleDocument,基於Dialog的MFC纔是用的最多的形式。畢竟用MFC做工具還是比較方便的。如果本來就有一個命令行工具,那麼只要結合一個對話框,就可以讓這個工具變得很好用。相比較而言,使用MultiDocument和SingleDocument有一定的難度,文件也比較多,對程序員有一定要求,在使用場景上並不是很多。如果對MFC不是很瞭解,很容易寫出來的代碼千瘡百孔,動不動程序掛掉那也不是稀奇的事情。而基於Dialog的MFC一般就三個類,CDialog、CAboutDialog、CDialogApp,使用起來不要太爽。

 

6、重視使用類嚮導

    MFC很多的代碼都是自動生成的,所以大家在使用的時候一定要重視類嚮導這個功能。通過類嚮導,你可以自由添加變量、函數、處理消息、將控件轉變成類成員變量等等。目前在VS2015上面,類嚮導的界面是這樣的,

 

7、後續的發展

    從目前的發展趨勢看,.net和C#開發應該是微軟重點推薦的開發模式。如果是從頭研發的新軟件,那麼使用.net開發也無可厚非,但是如果考慮到以往MFC軟件的維護、或者是編寫小的工具軟件,代碼行數在幾百到幾千行之間,使用MFC開發也是不錯的一個選擇。當然對於那些高手來說,使用MFC開發商業軟件也是可以的,比如Emule就是MFC開發的。按照WINDOWS的習慣,微軟公司全部放棄MFC應該不太可能的,畢竟目前在市場上面還有那麼多的存量軟件,但是不推薦MFC倒是一個不爭的事實。我倒覺得,學好MFC、用好MFC、並且那麼多開源MFC代碼,都是很好的學習資料,努力掌握一個架構也不是壞事。

 

8、最後的話

    不管是MFC、還是WIN32、QT,一個合格的開發者還是應該有一個自己比較擅長的框架平臺。全部都使用WIN32開發或者QT開發也未嘗不可,但是一定要做到了解和精通,可以獨立解決所有相關的架構問題。不管什麼樣的框架,畢竟還是爲項目負責的,一個低質量、開發進度得不到保證、不好調試的軟件,總歸是得不到長遠發展的。

 

ps1:

    當初爲了實現,MFC充分利用c++的各種特性,包括全局構造函數、類靜態變量、類靜態函數、參數引用、手動鏈表、類函數指針等各種特性,但是拋卻這些特性,其實MFC本質上還是給我們提供了一個相對簡單的GUI環境,對於快速開發上位機工具還是大有裨益的。如果對這些特性不是很瞭解的朋友,可以參考我之前的blog,瞭解一下這些屬性是怎麼實現的。

 

    mfc之全局變量,https://blog.csdn.net/feixiaoxing/article/details/52751748

    mfc之類型識別,https://blog.csdn.net/feixiaoxing/article/details/52760518

    mfc之創建對象,https://blog.csdn.net/feixiaoxing/article/details/52831372

    mfc之數據保存,https://blog.csdn.net/feixiaoxing/article/details/52899947

    mfc之消息註冊和消息傳遞,https://blog.csdn.net/feixiaoxing/article/details/53071842

 

ps2:

    要說這裏面屬性比較複雜的,我覺得還是類函數指針,建議大家多多練習,比如像這樣,

#include "stdafx.h"

class parent
{
public:
	parent() {}
	~parent() {}
	void process() { printf("parent\n"); }
};

class child : public parent
{
public:
	child() {}
	~child() {}
	void process(){ printf("child\n"); }
};


int main()
{
	typedef void (parent::*func)();
	func f = static_cast<func>(&child::process);
	child c;
	parent* p = &c;
	((p)->*f)();
	return 0;
}

 

發佈了558 篇原創文章 · 獲贊 3631 · 訪問量 475萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章