您好,登錄后才能下訂單哦!
“現(xiàn)在已經(jīng)是人工智能、大數(shù)據(jù)的時(shí)代,云+端才是王道,桌面程序設(shè)計(jì)已經(jīng)過(guò)時(shí)了,還有沒(méi)有必要學(xué)習(xí)MFC?”
這是許多困擾剛剛?cè)胄信笥训膯?wèn)題,不可否認(rèn),由于python、Java等開(kāi)發(fā)語(yǔ)言和環(huán)境的流行,Visual C++的應(yīng)用范圍也相應(yīng)縮小。
“有人說(shuō)現(xiàn)在c++越來(lái)越接近邊緣性語(yǔ)言?c++程序員以后的發(fā)展方向在那里,我學(xué)習(xí)MFC會(huì)不會(huì)被淘汰?”
的確C++作為普及性應(yīng)用程序設(shè)計(jì)語(yǔ)言的地位已經(jīng)不再,但是它作為系統(tǒng)程序設(shè)計(jì)語(yǔ)言的地位沒(méi)變。 筆者個(gè)人的淺見(jiàn)在于:一個(gè)系統(tǒng)程序員的核心優(yōu)勢(shì)之一就是對(duì)計(jì)算機(jī)裝置的透徹理解。在筆者求學(xué)階段,筆者的導(dǎo)師曾經(jīng)有過(guò)這樣的指導(dǎo),對(duì)于本人的影響非常深刻:
“你們覺(jué)得你們學(xué)計(jì)算機(jī)這個(gè)專業(yè)最大的優(yōu)勢(shì)是什么?是會(huì)編程序嗎?會(huì)寫(xiě)算法嗎?”
“論寫(xiě)算法,你們不如數(shù)學(xué)方向的同學(xué),他們天天接受邏輯思維訓(xùn)練,抽象能力的培養(yǎng),你們不占優(yōu)勢(shì)”
“論寫(xiě)業(yè)務(wù)邏輯,比如信息管理系統(tǒng),你們不如有行業(yè)經(jīng)驗(yàn)的懂開(kāi)發(fā)技術(shù)的人員,因?yàn)槟銈冊(cè)跇I(yè)務(wù)理解上不占優(yōu)勢(shì)”
“寫(xiě)操作硬件,你們不如寫(xiě)自動(dòng)化,機(jī)電一體化的,不如通信的,他們理解協(xié)議,用代碼指揮硬件的能力比你們也要強(qiáng)”
“那么,計(jì)算機(jī)專業(yè)的核心優(yōu)勢(shì)在哪里?”
“我認(rèn)為一定是在你們對(duì)整個(gè)計(jì)算機(jī)裝置的理解,這個(gè)才是你們要強(qiáng)化的技能核心”
正是因?yàn)榇?,筆者才對(duì)進(jìn)入行業(yè)領(lǐng)域的C++學(xué)習(xí)者不斷建議:從各種角度提升自己的對(duì)計(jì)算機(jī)裝置的核心理解。
那么理解計(jì)算機(jī)裝置的一種可選路徑在哪里呢?筆者認(rèn)為莫過(guò)于對(duì)操作系統(tǒng)的學(xué)習(xí)和探索。毫無(wú)疑問(wèn),當(dāng)前在PC市場(chǎng)中最為人們所熟知的操作系統(tǒng)就是windows了。對(duì)于普通用戶來(lái)說(shuō),當(dāng)他雙擊word圖標(biāo),啟動(dòng)word,開(kāi)始打字,排版,插入圖片的時(shí)候,他一定認(rèn)為是自己在處理辦公業(yè)務(wù)。當(dāng)這個(gè)用戶按下鍵盤(pán)a,打出一個(gè)字母,按下鼠標(biāo),圈出一段文字,他一定認(rèn)為是自己“在寫(xiě),在畫(huà)”這個(gè)內(nèi)容。但是作為一名開(kāi)發(fā)人員來(lái)說(shuō),你又是如何理解這種行為呢?
實(shí)際上,真正在寫(xiě),在畫(huà)的并不是這位用戶,而是word這個(gè)程序。從運(yùn)行原理來(lái)說(shuō),恐怕這樣的描述更加精準(zhǔn)。
其實(shí),這個(gè)呈現(xiàn)出來(lái)的過(guò)程中word與windows操作系統(tǒng)交互被用戶從邏輯上忽略了。而我們程序開(kāi)發(fā)人員的任務(wù)實(shí)際上是在兩端編程
一方面,我們接受用戶的輸入,讓操作系統(tǒng)感知到我們應(yīng)用程序的存在,并將其做相應(yīng)的處理邏輯;
另一方面,我們將處理好的邏輯通過(guò)windows操作系統(tǒng)的幫助以友好的方式呈現(xiàn)給用戶。
這兩個(gè)方面都涉及到編寫(xiě)代碼的工作,這才是我們編碼的邏輯所在。
接下來(lái)的問(wèn)題就是,windows感知到用戶的輸入好理解,那么如何理解windows感知到應(yīng)用程序的存在呢?還是以word為例
打個(gè)比方,就像一所學(xué)校,每一個(gè)學(xué)員都有一個(gè)代號(hào)供學(xué)校管理調(diào)度,要求你聽(tīng)課,考試。有了hwnd這個(gè)概念,我們就知道了,同樣,windows操作系統(tǒng)需要顯示,銷(xiāo)毀這個(gè)窗體,都需要通過(guò)hwnd來(lái)操作。我們編程的時(shí)候,就可以把自己需要操作的hwnd給windows操作系統(tǒng),讓windows操作系統(tǒng)實(shí)現(xiàn)我們的目的。很顯然,一個(gè)hwnd是一個(gè)窗口的表示,同樣的,呈現(xiàn)一個(gè)窗口肯定需要一套復(fù)雜的結(jié)構(gòu),就好比一個(gè)在學(xué)校的學(xué)生,有學(xué)號(hào),有出生年年月,有性別,有專業(yè),各種各樣的分量信息。一個(gè)窗口結(jié)構(gòu),肯定也是一個(gè)復(fù)雜的分量組合。對(duì)應(yīng)到語(yǔ)言層面,一定是一個(gè)C語(yǔ)言的struct的結(jié)構(gòu)。
C語(yǔ)言是開(kāi)發(fā)操作系統(tǒng)的核心語(yǔ)言,很顯然,Windows API是面向C語(yǔ)言風(fēng)格的。大家都知道C++是C語(yǔ)言的超集,微軟為了方便當(dāng)時(shí)的開(kāi)發(fā)人員將已經(jīng)存在的C語(yǔ)言開(kāi)發(fā)方式,封裝成了一套類庫(kù),這個(gè)就是MFC的由來(lái),我們可以認(rèn)為MFC是Windows C++的API。于是,這個(gè)就帶來(lái)了一個(gè)新的問(wèn)題:如何用C++的語(yǔ)義來(lái)替代C風(fēng)格的開(kāi)發(fā)方式。
最直接的方式就是建立面向?qū)ο蟮恼Z(yǔ)義到實(shí)際開(kāi)發(fā)概念的映射,實(shí)質(zhì)今日,許多老的軟件需要維護(hù)的工作,依然會(huì)從msdn中查找mfc的類結(jié)構(gòu),其中最重要的一個(gè)結(jié)構(gòu)就是CWnd,這個(gè)又稱為窗口類,我們來(lái)看下微軟是怎么做的。
class CWnd :public CCmdTarget {
DELCARE_DYNCREATE(CWnd)
public:
CWnd();
virtual ~CWnd();
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++的語(yǔ)義看來(lái),用來(lái)交互的一定是一系列的對(duì)象,這些對(duì)象與對(duì)象之間的交互運(yùn)動(dòng)完成軟件的工作過(guò)程。比如我們做這樣一個(gè)想象,圖示中是內(nèi)存中已經(jīng)存在的一系列對(duì)象,這些對(duì)象之間相互調(diào)用,只要合理安排好這些調(diào)用的先后秩序,同時(shí)這些對(duì)象的數(shù)據(jù)進(jìn)行加工處理,得到結(jié)果就是這個(gè)軟件系統(tǒng)運(yùn)行過(guò)程。
借助這樣的思想,微軟在改造C語(yǔ)言的編程風(fēng)格的時(shí)候,他就要考慮概念的轉(zhuǎn)移,以前,程序原只需要操作hwnd就可以直接和操作系統(tǒng)交互,現(xiàn)在則不然,首先,要刻畫(huà)一個(gè)c++的觀念與hwnd對(duì)應(yīng)。這個(gè)觀念的就是CWnd類設(shè)計(jì)的初衷。CWnd是批量制造窗體對(duì)象的類。他可以批量的new 出一堆窗體對(duì)象來(lái)。
首先,CWnd對(duì)象就必須有Hwnd,這個(gè)就是
設(shè)計(jì)的由來(lái)。
那么,這些函數(shù)又是什么設(shè)計(jì)語(yǔ)義呢?
這個(gè)就要談MFC的體系了。
我們首先看下?lián)碛辛薽fc之后,應(yīng)用程序與操作系統(tǒng)的交互發(fā)生了什么樣的變化:
在沒(méi)有MFC的時(shí)候,所有的應(yīng)用程序的消息都是直接和windows系統(tǒng)打交道。而MFC應(yīng)用程序則不然,它像一個(gè)楔子一樣加載了應(yīng)用程序與操作系統(tǒng)之間。如果我們寫(xiě)一個(gè)mfc的word,所有的windows消息的截獲和感知,都是通過(guò)mfc來(lái)完成的。這就好像以前你可以直接和老板對(duì)話,而現(xiàn)在你的所有的請(qǐng)求和應(yīng)答都只能委托給mfc來(lái)操作。
有了這個(gè)概念,再理解上面的代碼就順暢了。以前我們自己的應(yīng)用程序要提請(qǐng)windows操作系統(tǒng)操作,直接訪問(wèn)hwnd就可以了。但是現(xiàn)在我們按照c++語(yǔ)法,我們用的是Cwnd對(duì)象。這個(gè)CWnd是一個(gè)C++對(duì)象,而且是MFC創(chuàng)造出來(lái)的c++對(duì)象,并不是windows的對(duì)象。所以,MFC有責(zé)任管理好這個(gè)對(duì)象,這個(gè)對(duì)象的出生與消亡都跟隨的是C++語(yǔ)義。因此,當(dāng)我們需要一個(gè)表達(dá)一個(gè)窗體的概念的時(shí)候,我們很自然的就會(huì)new一個(gè)Cwnd的對(duì)象出來(lái)。但是,這個(gè)CWnd對(duì)象是有風(fēng)險(xiǎn)的——如果這個(gè)CWnd對(duì)象先于windows的窗體出現(xiàn)怎么辦?(CWnd對(duì)象的內(nèi)存已經(jīng)構(gòu)建好了,但是hwnd還為空,所以它的m_hWnd為空)。同樣的CWnd對(duì)象概念的出現(xiàn)將windows窗體的hWnd概念和CWnd的概念進(jìn)行了剝離,那么從理論上講CWnd對(duì)象可以結(jié)合任意的hWnd對(duì)象。(只要將m_hWnd賦予不同的值就可以了)。
這又是MFC的一個(gè)高超之處,就是要將hWnd和CWnd進(jìn)行觀念解耦,當(dāng)應(yīng)用程序需要用CWnd對(duì)象的觀念表達(dá)Windows窗體的時(shí)候,用參數(shù)傳入就可以了。以BOOL Attach(HWND hWndNew);為例,程序開(kāi)發(fā)人員大可以將一個(gè)已經(jīng)存在的windows窗體的hwnd傳給當(dāng)前的CWnd對(duì)象,通過(guò)attch方法,靈活的將windows窗體附著在Cwnd這個(gè)C++對(duì)象上。這種設(shè)計(jì)技巧是十分精妙的,既可以在不變更已有系統(tǒng)的情況下,靈活的用C++的方法進(jìn)行開(kāi)發(fā)。
http://edu.51cto.com/course/13746.html
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。