乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      C、C++控制臺(tái)程序、Windows API程序、MFC程序理解與比較

       jingxin95 2019-03-20

      在編程語(yǔ)言中,函數(shù)是一個(gè)很重要的概念,其身影無(wú)處不在。在面向過(guò)程的編程方式中,函數(shù)更是程序的基本構(gòu)建模塊,在面向?qū)ο蟮木幊谭绞街?,函?shù)演變?yōu)轭?lèi)或?qū)ο蟮某蓡T(當(dāng)然也可以使用與類(lèi)無(wú)關(guān)的函數(shù))。

      函數(shù)由函數(shù)頭和函數(shù)體組成。函數(shù)頭包括域?qū)傩裕ㄈ鏴xternal、static或類(lèi)域)、返回值類(lèi)型、函數(shù)名、及參數(shù)。域?qū)傩园ㄆ湓诙辔募幊讨械目梢?jiàn)范圍,是否是屬于某一個(gè)類(lèi)的成員?返回值類(lèi)型是指函數(shù)返回的值的具體數(shù)據(jù)類(lèi)型(可以理解為函數(shù)輸出的一部分)。函數(shù)名是函數(shù)保存在內(nèi)存代碼區(qū)的首地址,用于函數(shù)的調(diào)用及函數(shù)指針的右值。參數(shù)可以理解為函數(shù)的輸入、輸出(如果是引用或指針作為參數(shù),可以理解為是一個(gè)種輸出,因?yàn)槠洳僮骰蚋碌臄?shù)據(jù)是引用或指針的地址值所指向的內(nèi)存單元)。函數(shù)體是函數(shù)功能的具體實(shí)現(xiàn)。

      如果用一臺(tái)手機(jī)來(lái)理解函數(shù)概念,手機(jī)裸露在外的操作界面就像是函數(shù)頭,外殼內(nèi)的組件就像是函數(shù)體。

      函數(shù)的開(kāi)發(fā)者和使用者可以站在不同的角度去理解函數(shù)的構(gòu)造,函數(shù)的開(kāi)發(fā)者需要負(fù)責(zé)函數(shù)頭作為界面的友好性及穩(wěn)定性,以及保證實(shí)現(xiàn)函數(shù)功能的函數(shù)體的空間和時(shí)間效率。而函數(shù)的使用者可以不關(guān)心函數(shù)功能的具體實(shí)現(xiàn)(當(dāng)然了解其具體實(shí)現(xiàn)能更好地加深對(duì)函數(shù)的理解),也就是不心關(guān)心函數(shù)體的具體內(nèi)容,只需關(guān)心函數(shù)使用的具體細(xì)節(jié),也就是函數(shù)體的內(nèi)容。

      就如果一臺(tái)手機(jī),手機(jī)開(kāi)發(fā)者要負(fù)責(zé)手機(jī)從外部操作到內(nèi)部零部件的全部,而手機(jī)購(gòu)買(mǎi)者(使用者)則只需關(guān)心怎樣使用即可。

      于是,一些編程大牛對(duì)于一些使用頻率很高的功能便開(kāi)發(fā)出界面友好穩(wěn)定、實(shí)現(xiàn)效率高的函數(shù)和類(lèi),保存在庫(kù)(library)中,也就是函數(shù)庫(kù)或類(lèi)庫(kù),實(shí)現(xiàn)共享。一些優(yōu)秀函數(shù)庫(kù)或類(lèi)庫(kù)也就成了編程語(yǔ)言的有機(jī)組成部分。

      一種計(jì)算機(jī)語(yǔ)言的應(yīng)用程序是運(yùn)行在某一操作系統(tǒng)之上的,某一操作系統(tǒng)對(duì)某一語(yǔ)言的支持是通過(guò)其某一語(yǔ)言的函數(shù)庫(kù)或類(lèi)庫(kù)來(lái)實(shí)現(xiàn)的。

      1 控件臺(tái)程序

      控制臺(tái)程序程序只關(guān)心數(shù)據(jù),不在乎界面,在一個(gè)簡(jiǎn)單的Shell中執(zhí)行。

      控制臺(tái)程序用字符進(jìn)行交互,不需要鼠標(biāo)操作,也就是沒(méi)有圖形界面,也就是不需要使用控件做為輸入、輸出的媒介。

      而window api與MFC主要使用控件(視窗)做為交互媒介,也就有了資源對(duì)象(不是類(lèi)類(lèi)型對(duì)象)的概念,同時(shí)也有了事件消息和消息響應(yīng)函數(shù)的概念(Message Based,Event Driven)。

      2 Windows API編程

      當(dāng)Windows操作系統(tǒng)開(kāi)始占據(jù)主導(dǎo)地位的時(shí)候,開(kāi)發(fā)Windows平臺(tái)下的應(yīng)用程序成為人們的需要。而在Windows程序設(shè)計(jì)領(lǐng)域處于發(fā)展的初期,Windows程序員所能使用的編程工具唯有API(Application Programming Interface)函數(shù),這些函數(shù)是Windows提供給應(yīng)用程序與操作系統(tǒng)的接口,他們猶如“積木塊”一樣,可以搭建出各種界面豐富,功能靈活的應(yīng)用程序。所以可以認(rèn)為API函數(shù)是構(gòu)筑整個(gè)Windows框架的基石,在它的下面是Windows的操作系統(tǒng)核心,而它的上面則是所有的華麗的Windows應(yīng)用程序。

      Windows API所提供的功能可以歸為七類(lèi):

      2.1 基礎(chǔ)服務(wù)(Base Services),提供對(duì)Windows系統(tǒng)可用的基礎(chǔ)資源的訪問(wèn)接口。比如像:文件系統(tǒng)(file system)、外部設(shè)備(device)、進(jìn)程(process)、線(xiàn)程(thread)以及訪問(wèn)注冊(cè)表(Windows registry)和錯(cuò)誤處理機(jī)制(error handling)。這些功能接口位于Windows下的 kernel32.dll和advapi32.dll中。

      2.2 圖形設(shè)備接口(GDI),提供功能為:輸出圖形內(nèi)容到顯示器、打印機(jī)以及其他外部輸出設(shè)備。位于Windows下的gdi32.dll。

      2.3 圖形化用戶(hù)界面(GUI),提供的功能有創(chuàng)建和管理屏幕和大多數(shù)基本控件(control),比如按鈕和滾動(dòng)條,接收鼠標(biāo)和鍵盤(pán)輸入,以及其他與GUI有關(guān)的功能。這些調(diào)用接口位于Windows下的user32.dll。從Windows XP版本之后,基本控件和通用對(duì)話(huà)框控件(Common Control Library)的調(diào)用接口放在comctl32.dll中。

      2.4 通用對(duì)話(huà)框鏈接庫(kù)(Common Dialog Box Library),為應(yīng)用程序提供標(biāo)準(zhǔn)對(duì)話(huà)框,比如打開(kāi)/保存文檔對(duì)話(huà)框、顏色對(duì)話(huà)框和字體對(duì)話(huà)框等等。這個(gè)鏈接庫(kù)位于Windows下comdlg32.dll中。它被歸類(lèi)為User Interface API之下。

      2.5 通用控件鏈接庫(kù)(Common Control Library),為應(yīng)用程序提供接口來(lái)訪問(wèn)操作系統(tǒng)提供的一些高級(jí)控件。比如狀態(tài)欄(status bar)、進(jìn)度條(progress bars)、工具欄(toolbar)和標(biāo)簽(tab)等。這個(gè)鏈接庫(kù)位于Windows下comctl32.dll中。它被歸類(lèi)為User Interface API之下。

      2.6 Windows外殼(Windows Shell),作為Windows API的組成部分,不僅允許應(yīng)用程序訪問(wèn)Windows外殼提供的功能,還對(duì)之有所改進(jìn)和增強(qiáng)。它位于Windows下的shell32.dll中(Windows 95則在 shlwapi.dll中)。 它被歸類(lèi)為User Interface API之下。

      2.7 網(wǎng)絡(luò)服務(wù)(Network Services),為訪問(wèn)操作系統(tǒng)提供的多種網(wǎng)絡(luò) 功能提供接口。它包括NetBIOS、Winsock、NetDDE及RPC等。

      3 從API到可視化編程

      程序員想編寫(xiě)具有Windows風(fēng)格的軟件,必須借助API,API也因此被賦予至高無(wú)上的地位。但是,如若沒(méi)有合適的Windows編程平臺(tái),那么Windows開(kāi)發(fā)是一項(xiàng)很復(fù)雜的工作。在可視化編程IDE出來(lái)之前,那時(shí)的Windows程序開(kāi)發(fā)還是比較復(fù)雜的工作,程序員必須熟記一大堆常用的API函數(shù),而且還得對(duì)Windows操作系統(tǒng)有深入的了解。然而隨著軟件技術(shù)的不斷發(fā)展,在Windows平臺(tái)上出現(xiàn)了很多優(yōu)秀的可視化編程環(huán)境,程序員可以采用“所見(jiàn)即所得”的編程方式來(lái)開(kāi)發(fā)具有精美用戶(hù)界面和功能強(qiáng)大的應(yīng)用程序。

      這些優(yōu)秀可視化編程環(huán)境操作簡(jiǎn)單、界面友好(諸如VB、VC++、DELPHI等),在這些工具中提供了大量的類(lèi)庫(kù)和各種控件,它們替代了API的神秘功能,事實(shí)上這些類(lèi)庫(kù)和控件都是構(gòu)架在WIN32 API函數(shù)基礎(chǔ)之上的,是封裝了的API函數(shù)的集合。它們把常用的API函數(shù)的組合在一起成為一個(gè)控件或類(lèi)庫(kù),并賦予其方便的使用方法,所以極大的加速了Windows應(yīng)用程序開(kāi)發(fā)的過(guò)程。有了這些控件和類(lèi)庫(kù),程序員便可以把主要精力放在程序整體功能的設(shè)計(jì)上,而不必過(guò)于關(guān)注技術(shù)細(xì)節(jié)。

      4 API編程適應(yīng)場(chǎng)合

      實(shí)際上如果我們要開(kāi)發(fā)出更靈活、更實(shí)用、更具效率的應(yīng)用程序,必然要涉及到直接使用API函數(shù),雖然類(lèi)庫(kù)和控件使應(yīng)用程序的開(kāi)發(fā)簡(jiǎn)單的多,但它們只提供Windows的一般功能,對(duì)于比較復(fù)雜和特殊的功能來(lái)說(shuō),使用類(lèi)庫(kù)和控件是非常難以實(shí)現(xiàn)的,這時(shí)就需要采用API函數(shù)來(lái)實(shí)現(xiàn)。

      這也是API函數(shù)使用的場(chǎng)合,所以我們對(duì)待API函數(shù)不必刻意去研究每一個(gè)函數(shù)的用法,那也是不現(xiàn)實(shí)的(能用得到的API函數(shù)有幾千個(gè)呢)。正如某位大蝦所說(shuō):API不要去學(xué),在需要的時(shí)候去查API幫助就足夠了。但是,許多API函數(shù)令人難以理解,易于誤用,還會(huì)導(dǎo)致出錯(cuò),這一切都阻礙了它的推廣。

      5 從API到MFC

      數(shù)以千計(jì)的Windows APIs,每個(gè)看起來(lái)都好象比重相若(至少你從手冊(cè)上看不出來(lái)孰輕孰重)。有些APIs 彼此雖有群組關(guān)系,卻沒(méi)有相近或組織化的函數(shù)名稱(chēng)。星羅棋布,霧列星馳;又似雪球一般愈滾愈多,愈滾愈大。撰寫(xiě)Windows 應(yīng)用程序需要大量的耐力與毅力,以及大量的小心謹(jǐn)慎!

      MFC 幫助我們把這些浩繁的APIs,利用對(duì)象導(dǎo)向的原理,邏輯地組織起來(lái),使它們具備抽象化、封裝化、繼承性、多態(tài)性、模塊化的性質(zhì)。

      1989 年微軟公司成立Application Framework 技術(shù)團(tuán)隊(duì),名為AFX 小組,用以開(kāi)發(fā)C++對(duì)象導(dǎo)向工具給Windows 應(yīng)用程序開(kāi)發(fā)人員使用。AFX 的"X" 其實(shí)沒(méi)有什么意義,只是為了湊成一個(gè)響亮好念的名字。

      這個(gè)小組最初的「憲章」,根據(jù)記載,是要"utilize the latest in object oriented technology toprovide tools and libraries for developers writing the most advanced GUI applications on themarket",其中并未畫(huà)地自限與Windows 操作系統(tǒng)有關(guān)。果然,其第一個(gè)原型產(chǎn)品,有自己的窗口系統(tǒng)、自己的繪圖系統(tǒng)、自己的對(duì)象數(shù)據(jù)庫(kù)、乃至于自己的內(nèi)存管理系統(tǒng)。當(dāng)小組成員以此產(chǎn)品開(kāi)發(fā)應(yīng)用程序,他們發(fā)現(xiàn)實(shí)在是太復(fù)雜,又悖離公司的主流系統(tǒng)--Windows -- 太遙遠(yuǎn)。于是他們修改憲章變成"deliver the power of object-oriented solutionsto programmers to enable them to build world-class Windows based applications in C++." 這差不多正是Windows 3.0 異軍崛起的時(shí)候。

      C++ 是一個(gè)復(fù)雜的語(yǔ)言,AFX 小組預(yù)期MFC 的使用者不可能人人皆為C++ 專(zhuān)家,所以他們并沒(méi)有采用所有的C++ 高階性質(zhì)(例如多重繼承)。許多「麻煩」但「幾乎一成不變」的Windows 程序動(dòng)作都被隱藏在MFC 類(lèi)別之中, 例如WinMain 、RegisterClass、Window Procedure 等等等。

      為了讓MFC 盡可能地小,盡可能地快,AFX 小組不得不舍棄高度的抽象(導(dǎo)至過(guò)多的虛擬函數(shù)),而引進(jìn)他們自己發(fā)明的機(jī)制,嘗試在對(duì)象導(dǎo)向領(lǐng)域中解決Windows 消息的處理問(wèn)題。這也就是Message Mapping 和Message routing 機(jī)制。注意,他們并沒(méi)有改變C++ 語(yǔ)言本身,也沒(méi)有擴(kuò)大語(yǔ)言的功能。他們只是設(shè)計(jì)了一些令人拍案叫絕的宏,而這些宏背后隱藏著巨大的機(jī)制。

      微軟公司于1992/04 推出C/C++ 7.0 產(chǎn)品時(shí)初次向世人介紹了MFC 1.0,這個(gè)初試啼聲的產(chǎn)品包含了20,000 行C++ 源代碼,60 個(gè)以上的Windows 相關(guān)類(lèi)別,以及其它的一般類(lèi)別如時(shí)間、數(shù)據(jù)處理、文件、內(nèi)存、診斷、字符串等等等。它所提供的,其實(shí)是一個(gè)"thin and efficient C++ transformation of the Windows API"。其32 位版亦在1992/07 隨著Win32 SDK 推出。

      MFC實(shí)現(xiàn)了控件的可視化,其application Wizard和class wizard可以實(shí)現(xiàn)程序和代碼模塊框架的自動(dòng)化實(shí)現(xiàn)。

      C、C++控制臺(tái)程序、Windows API程序、MFC程序理解與比較

      開(kāi)發(fā)需要讀寫(xiě)文件的應(yīng)用程序并且有簡(jiǎn)單的輸入和輸出可以利用單文檔視結(jié)構(gòu)。

      開(kāi)發(fā)注重交互的簡(jiǎn)單應(yīng)用程序可以使用對(duì)話(huà)框?yàn)榛A(chǔ)的窗口,如果文件讀寫(xiě)簡(jiǎn)單這可利用CFile進(jìn)行。

      在要求在多個(gè)文檔間傳遞數(shù)據(jù)時(shí)使用多文檔視結(jié)構(gòu)。

      C、C++控制臺(tái)程序、Windows API程序、MFC程序理解與比較

      6 圖形界面程序中的資源

      資源在Windows API中使用一種特殊的結(jié)構(gòu)體指針,句柄來(lái)引用。

      Windows API開(kāi)發(fā)之初C++還沒(méi)有出現(xiàn),所以windows提供的API函數(shù)使用的封裝數(shù)據(jù)類(lèi)型是結(jié)構(gòu)體(不是類(lèi))。隨著C++的誕生與普及,Windows API+C++就誕生了MFC,且資源控件開(kāi)發(fā)實(shí)現(xiàn)了可視化,而封裝數(shù)據(jù)類(lèi)型也用類(lèi)類(lèi)型來(lái)實(shí)現(xiàn)。

      C、C++控制臺(tái)程序、Windows API程序、MFC程序理解與比較

      常用的資源:ICON、CURSOR、BITMAP、FONT、DIALOG、MENU、ACCELERATOR、STRING、VERSIONINFO、TOOLBAR。

      C、C++控制臺(tái)程序、Windows API程序、MFC程序理解與比較

      7 圖形界面程序中的事件與消息

      Windows API是編程者自己把消息和響應(yīng)函數(shù)聯(lián)系在一起。mfc是編程者采用微軟為我們做好了MESSAGE-MAP機(jī)制,來(lái)處理消息。

      8 函數(shù)庫(kù)和類(lèi)庫(kù)

      Windows API和MFC都使用 .lib 文件。

      .lib 分兩種, 一種是 .lib 文件里面包含了 cpp 編譯出來(lái)的代碼, 鏈接的時(shí)候把需要的代碼拷貝到 exe 里面,mfc,、crt在選擇靜態(tài)的時(shí)候使用這種方式。

      另外一種是.lib中不包含代碼, 只是描述該到哪個(gè)dll里面怎么找對(duì)應(yīng)的代碼. 這種編譯出來(lái)的exe就需要dll一起才能運(yùn)行。mfc、crt使用共享庫(kù)的時(shí)候, 以及 Windows API 就是使用的這種方式。

      API 的 dll 在 windows 系統(tǒng)的 system32 目錄下, 圖形界面相關(guān)的 API 在 USER32.dll 里,進(jìn)程、文件之類(lèi)的操作在 kernel32.dll 里。MSDN 的每個(gè)函數(shù)都會(huì)說(shuō)明它在哪個(gè)頭文件, 哪個(gè) lib, 哪個(gè) dll 里的。

      9 C、C++控制臺(tái)程序、Windows API程序、MFC程序比較

      C、C++控制臺(tái)程序、Windows API程序、MFC程序理解與比較

      C++ 并不是純種的對(duì)象導(dǎo)向語(yǔ)言(SmallTalk 和Java 才是)。所以,MFC之中得以存在有不屬于任何類(lèi)別的全域函數(shù),它們統(tǒng)統(tǒng)在函數(shù)名稱(chēng)開(kāi)頭冠以Afx。

      SDK 程序只要包含WINDOWS.H 就好,所有API 的函數(shù)聲明、消息定義、常數(shù)定義、宏定義、都在WINDOWS.H 檔中。除非程序另調(diào)用了操作系統(tǒng)提供的新模塊(如CommDlg、ToolHelp、DDEML...),才需要再各別包含對(duì)應(yīng)的.H 檔。

      C、C++控制臺(tái)程序、Windows API程序、MFC程序理解與比較

      -End-

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶(hù) 評(píng)論公約

        類(lèi)似文章 更多