桌面程序設計已通過時了,還有沒有必要學習MFC?

「如今已是人工智能、大數據的時代,雲+端纔是王道,桌面程序設計已通過時了,還有沒有必要學習MFC?」
這是許多困擾剛剛入行朋友的問題,不能否認,因爲python、Java等開發語言和環境的流行,Visual C++的應用範圍也相應縮小。
「有人說如今c++愈來愈接近邊緣性語言?c++程序員之後的發展方向在那裏,我學習MFC會不會被淘汰?」
的確C++做爲普及性應用程序設計語言的地位已經再也不,可是它做爲系統程序設計語言的地位沒變。 筆者我的的淺見在於:一個系統程序員的核心優點之一就是對計算機裝置的透徹理解。在筆者求學階段,筆者的導師曾經有過這樣的指導,對於本人的影響很是深入:
「大家以爲大家學計算機這個專業最大的優點是什麼?是會編程序嗎?會寫算法嗎?」
「論寫算法,大家不如數學方向的同窗,他們每天接受邏輯思惟訓練,抽象能力的培養,大家不佔優點」
「論寫業務邏輯,好比信息管理系統,大家不若有行業經驗的懂開發技術的人員,由於大家在業務理解上不佔優點」
「寫操做硬件,大家不如寫自動化,機電一體化的,不如通訊的,他們理解協議,用代碼指揮硬件的能力比大家也要強」
「那麼,計算機專業的核心優點在哪裏?」
「我認爲必定是在大家對整個計算機裝置的理解,這個纔是大家要強化的技能核心」
正是由於此,筆者纔對進入行業領域的C++學習者不斷建議:從各類角度提高本身的對計算機裝置的核心理解。
那麼理解計算機裝置的一種可選路徑在哪裏呢?筆者認爲莫過於對操做系統的學習和探索。毫無疑問,當前在PC市場中最爲人們所熟知的操做系統就是windows了。對於普通用戶來講,當他雙擊word圖標,啓動word,開始打字,排版,插入圖片的時候,他必定認爲是本身在處理辦公業務。當這個用戶按下鍵盤a,打出一個字母,按下鼠標,圈出一段文字,他必定認爲是本身「在寫,在畫」這個內容。可是做爲一名開發人員來講,你又是如何理解這種行爲呢?
實際上,真正在寫,在畫的並非這位用戶,而是word這個程序。從運行原理來講,恐怕這樣的描述更加精準。
桌面程序設計已通過時了,還有沒有必要學習MFC?
其實,這個呈現出來的過程當中word與windows操做系統交互被用戶從邏輯上忽略了。而咱們程序開發人員的任務其實是在兩端編程
一方面,咱們接受用戶的輸入,讓操做系統感知到咱們應用程序的存在,並將其作相應的處理邏輯;
另外一方面,咱們將處理好的邏輯經過windows操做系統的幫助以友好的方式呈現給用戶。
這兩個方面都涉及到編寫代碼的工做,這纔是咱們編碼的邏輯所在。
接下來的問題就是,windows感知到用戶的輸入好理解,那麼如何理解windows感知到應用程序的存在呢?仍是以word爲例
桌面程序設計已通過時了,還有沒有必要學習MFC?
打個比方,就像一所學校,每個學員都有一個代號供學校管理調度,要求你聽課,考試。有了hwnd這個概念,咱們就知道了,一樣,windows操做系統須要顯示,銷燬這個窗體,都須要經過hwnd來操做。咱們編程的時候,就能夠把本身須要操做的hwnd給windows操做系統,讓windows操做系統實現咱們的目的。很顯然,一個hwnd是一個窗口的表示,一樣的,呈現一個窗口確定須要一套複雜的結構,就比如一個在學校的學生,有學號,有出生年年月,有性別,有專業,各類各樣的份量信息。一個窗口結構,確定也是一個複雜的份量組合。對應到語言層面,必定是一個C語言的struct的結構。
C語言是開發操做系統的核心語言,很顯然,Windows API是面向C語言風格的。你們都知道C++是C語言的超集,微軟爲了方便當時的開發人員將已經存在的C語言開發方式,封裝成了一套類庫,這個就是MFC的由來,咱們能夠認爲MFC是Windows C++的API。因而,這個就帶來了一個新的問題:如何用C++的語義來替代C風格的開發方式。
最直接的方式就是創建面向對象的語義到實際開發概念的映射,實質今日,許多老的軟件須要維護的工做,依然會從msdn中查找mfc的類結構,其中最重要的一個結構就是CWnd,這個又稱爲窗口類,咱們來看下微軟是怎麼作的。
class CWnd :public CCmdTarget {
DELCARE_DYNCREATE(CWnd)
public:
CWnd();
virtual ~CWnd();html

HWND m_hWnd;
operator HWND() const { return m_hWnd; }
HWND GetSafeHwnd() { return this == NULL ? NULL : m_hWnd; }

//窗口句柄映射
static CWnd* FromeHandle(HWND hWnd);
static CWnd* FormHandlePermanet(HWND hWnd);
BOOL Attach(HWND hWndNew);
HWND Detach();

…}
在C++的語義看來,用來交互的必定是一系列的對象,這些對象與對象之間的交互運動完成軟件的工做過程。好比咱們作這樣一個想象,圖示中是內存中已經存在的一系列對象,這些對象之間相互調用,只要合理安排好這些調用的前後秩序,同時這些對象的數據進行加工處理,獲得結果就是這個軟件系統運行過程。
桌面程序設計已通過時了,還有沒有必要學習MFC?python

藉助這樣的思想,微軟在改造C語言的編程風格的時候,他就要考慮概念的轉移,之前,程序原只須要操做hwnd就能夠直接和操做系統交互,如今則否則,首先,要刻畫一個c++的觀念與hwnd對應。這個觀念的就是CWnd類設計的初衷。CWnd是批量製造窗體對象的類。他能夠批量的new 出一堆窗體對象來。
首先,CWnd對象就必須有Hwnd,這個就是
桌面程序設計已通過時了,還有沒有必要學習MFC?
設計的由來。
那麼,這些函數又是什麼設計語義呢?
桌面程序設計已通過時了,還有沒有必要學習MFC?
這個就要談MFC的體系了。
咱們首先看下擁有了mfc以後,應用程序與操做系統的交互發生了什麼樣的變化:
桌面程序設計已通過時了,還有沒有必要學習MFC?
在沒有MFC的時候,全部的應用程序的消息都是直接和windows系統打交道。而MFC應用程序則否則,它像一個楔子同樣加載了應用程序與操做系統之間。若是咱們寫一個mfc的word,全部的windows消息的截獲和感知,都是經過mfc來完成的。這就好像之前你能夠直接和老闆對話,而如今你的全部的請求和應答都只能委託給mfc來操做。
有了這個概念,再理解上面的代碼就順暢了。之前咱們本身的應用程序要提請windows操做系統操做,直接訪問hwnd就能夠了。可是如今咱們按照c++語法,咱們用的是Cwnd對象。這個CWnd是一個C++對象,並且是MFC創造出來的c++對象,並非windows的對象。因此,MFC有責任管理好這個對象,這個對象的出生與消亡都跟隨的是C++語義。所以,當咱們須要一個表達一個窗體的概念的時候,咱們很天然的就會new一個Cwnd的對象出來。可是,這個CWnd對象是有風險的——若是這個CWnd對象先於windows的窗體出現怎麼辦?(CWnd對象的內存已經構建好了,可是hwnd還爲空,因此它的m_hWnd爲空)。一樣的CWnd對象概念的出現將windows窗體的hWnd概念和CWnd的概念進行了剝離,那麼從理論上講CWnd對象能夠結合任意的hWnd對象。(只要將m_hWnd賦予不一樣的值就能夠了)。
這又是MFC的一個高超之處,就是要將hWnd和CWnd進行觀念解耦,當應用程序須要用CWnd對象的觀念表達Windows窗體的時候,用參數傳入就能夠了。以BOOL Attach(HWND hWndNew);爲例,程序開發人員大能夠將一個已經存在的windows窗體的hwnd傳給當前的CWnd對象,經過attch方法,靈活的將windows窗體附着在Cwnd這個C++對象上。這種設計技巧是十分精妙的,既能夠在不變動已有系統的狀況下,靈活的用C++的方法進行開發。c++

http://edu.51cto.com/course/13746.html
桌面程序設計已通過時了,還有沒有必要學習MFC?程序員

相關文章
相關標籤/搜索