<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > MFC和Win32技術(shù)應(yīng)用分析

          MFC和Win32技術(shù)應(yīng)用分析

          作者: 時(shí)間:2018-09-05 來(lái)源:網(wǎng)絡(luò) 收藏

          MFC Object和Windows Object的關(guān)系

          本文引用地址:http://www.ex-cimer.com/article/201809/388505.htm

          MFC中最重要的封裝是對(duì)Win32 API的封裝,因此,理解Windows Object和MFC Object (C++對(duì)象,一個(gè)C++類的實(shí)例)之間的關(guān)系是理解MFC的關(guān)鍵之一。所謂Windows Object(Windows對(duì)象)是Win32下用句柄表示的Windows操作系統(tǒng)對(duì)象;所謂MFC Object (MFC對(duì)象)是C++對(duì)象,是一個(gè)C++類的實(shí)例,這里(本書范圍內(nèi))MFC Object是有特定含義的,指封裝Windows Object的C++ Object,并非指任意的C++ Object。

          MFC Object 和Windows Object是不一樣的,但兩者緊密聯(lián)系。以窗口對(duì)象為例:

          一個(gè)MFC窗口對(duì)象是一個(gè)C++ CWnd類(或派生類)的實(shí)例,是程序直接創(chuàng)建的。在程序執(zhí)行中它隨著窗口類構(gòu)造函數(shù)的調(diào)用而生成,隨著析構(gòu)函數(shù)的調(diào)用而消失。而Windows窗口則是Windows系統(tǒng)的一個(gè)內(nèi)部數(shù)據(jù)結(jié)構(gòu)的實(shí)例,由一個(gè)“窗口句柄”標(biāo)識(shí),Windows系統(tǒng)創(chuàng)建它并給它分配系統(tǒng)資源。Windows窗口在MFC窗口對(duì)象創(chuàng)建之后,由CWnd類的Create成員函數(shù)創(chuàng)建,“窗口句柄”保存在窗口對(duì)象的m_hWnd成員變量中。Windows窗口可以被一個(gè)程序銷毀,也可以被用戶的動(dòng)作銷毀。MFC窗口對(duì)象和Windows窗口對(duì)象的關(guān)系如圖2-1所示。其他的Windows Object和對(duì)應(yīng)的MFC Object也有類似的關(guān)系。

          下面,對(duì)MFC Object和Windows Object作一個(gè)比較。有些論斷對(duì)設(shè)備描述表(MFC類是CDC,句柄是HDC)可能不適用,但具體涉及到時(shí)會(huì)指出。

          從數(shù)據(jù)結(jié)構(gòu)上比較

          MFC Object是相應(yīng)C++類的實(shí)例,這些類是MFC或者程序員定義的;

          Windows Object是Windows系統(tǒng)的內(nèi)部結(jié)構(gòu),通過(guò)一個(gè)句柄來(lái)引用;

          MFC給這些類定義了一個(gè)成員變量來(lái)保存MFC Object對(duì)應(yīng)的Windows Object的句柄。對(duì)于設(shè)備描述表CDC類,將保存兩個(gè)HDC句柄。

          從層次上講比較

          MFC Object是高層的,Windows Object是低層的;

          MFC Object封裝了Windows Object的大部分或全部功能,MFC Object的使用者不需要直接應(yīng)用Windows Object的HANDLE(句柄)使用Win32 API,代替它的是引用相應(yīng)的MFC Object的成員函數(shù)。

          從創(chuàng)建上比較

          MFC Object通過(guò)構(gòu)造函數(shù)由程序直接創(chuàng)建;Windows Object由相應(yīng)的SDK函數(shù)創(chuàng)建。

          MFC中,使用這些MFC Object,一般分兩步:

          首先,創(chuàng)建一個(gè)MFC Object,或者在STACK中創(chuàng)建,或者在HEAP中創(chuàng)建,這時(shí),MFC Object的句柄實(shí)例變量為空,或者說(shuō)不是一個(gè)有效的句柄。

          然后,調(diào)用MFC Object的成員函數(shù)創(chuàng)建相應(yīng)的Windows Object,MFC的句柄變量存儲(chǔ)一個(gè)有效句柄。

          CDC(設(shè)備描述表類)的創(chuàng)建有所不同,在后面的2.3節(jié)會(huì)具體說(shuō)明CDC及其派生類的創(chuàng)建和使用。

          當(dāng)然,可以在MFC Object的構(gòu)造函數(shù)中創(chuàng)建相應(yīng)的Windows對(duì)象,MFC的GDI類就是如此實(shí)現(xiàn)的,但從實(shí)質(zhì)上講,MFC Object的創(chuàng)建和Windows Object的創(chuàng)建是兩回事。

          從轉(zhuǎn)換上比較

          可以從一個(gè)MFC Object得到對(duì)應(yīng)的Windows Object的句柄;一般使用MFC Object的成員函數(shù)GetSafeHandle得到對(duì)應(yīng)的句柄。

          可以從一個(gè)已存在的Windows Object創(chuàng)建一個(gè)對(duì)應(yīng)的MFC Object; 一般使用MFC Object的成員函數(shù)Attach或者FromHandle來(lái)創(chuàng)建,前者得到一個(gè)永久性對(duì)象,后者得到的可能是一個(gè)臨時(shí)對(duì)象。

          從使用范圍上比較

          MFC Object對(duì)系統(tǒng)的其他進(jìn)程來(lái)說(shuō)是不可見、不可用的;而Windows Object一旦創(chuàng)建,其句柄是整個(gè)Windows系統(tǒng)全局的。一些句柄可以被其他進(jìn)程使用。典型地,一個(gè)進(jìn)程可以獲得另一進(jìn)程的窗口句柄,并給該窗口發(fā)送消息。

          對(duì)同一個(gè)進(jìn)程的線程來(lái)說(shuō),只可以使用本線程創(chuàng)建的MFC Object,不能使用其他線程的MFC Object。

          從銷毀上比較

          MFC Object隨著析構(gòu)函數(shù)的調(diào)用而消失;但Windows Object必須由相應(yīng)的Windows系統(tǒng)函數(shù)銷毀。

          設(shè)備描述表CDC類的對(duì)象有所不同,它對(duì)應(yīng)的HDC句柄對(duì)象可能不是被銷毀,而是被釋放。

          當(dāng)然,可以在MFC Object的析構(gòu)函數(shù)中完成Windows Object的銷毀,MFC Object的GDI類等就是如此實(shí)現(xiàn)的,但是,應(yīng)該看到:兩者的銷毀是不同的。

          每類Windows Object都有對(duì)應(yīng)的MFC Object,下面用表格的形式列出它們之間的對(duì)應(yīng)關(guān)系,如表2-1所示:

          表2-1 MFC Object和Windows Object的對(duì)應(yīng)關(guān)系

          表2-1中的OBJECT分以下幾類:

          描述Windows句柄MFC Object

          窗口HWNDCWnd and CWnd-derived classes

          設(shè)備上下文HDCCDC and CDC-derived classes

          菜單HMENUCMenu

          筆HPENCGdiObject類,CPen和CPen-derived classes

          刷子HBRUSHCGdiObject類,CBrush和CBrush-derived classes

          字體HFONTCGdiObject類,CFont和CFont-derived classes

          位圖HBITMAPCGdiObject類,CBitmap和CBitmap-derived classes

          調(diào)色板HPALETTECGdiObject類,CPalette和CPalette-derived classes

          區(qū)域HRGNCGdiObject類,CRgn和CRgn-derived classes

          圖像列表HimageLISTCimageList和CimageList-derived classes

          套接字SOCKETCSocket,CAsynSocket及其派生類

          Windows對(duì)象,

          設(shè)備上下文對(duì)象,

          GDI對(duì)象(BITMAP,BRUSH,F(xiàn)ONT,PALETTE,PEN,RGN),

          菜單,

          圖像列表,

          網(wǎng)絡(luò)套接字接口。

          從廣義上來(lái)看,文檔對(duì)象和文件可以看作一對(duì)MFC Object和Windows Object,分別用CDocument類和文件句柄描述。

          后續(xù)幾節(jié)分別對(duì)前四類作一個(gè)簡(jiǎn)明扼要的論述。

          Windows Object

          用SDK的Win32 API編寫各種Windows應(yīng)用程序,有其共同的規(guī)律:首先是編寫WinMain函數(shù),編寫處理消息和事件的窗口過(guò)程WndProc,在WinMain里頭注冊(cè)窗口(Register Window),創(chuàng)建窗口,然后開始應(yīng)用程序的消息循環(huán)。

          MFC應(yīng)用程序也不例外,因?yàn)镸FC是一個(gè)建立在SDK API基礎(chǔ)上的編程框架。對(duì)程序員來(lái)說(shuō)所不同的是:一般情況下,MFC框架自動(dòng)完成了Windows登記、創(chuàng)建等工作。

          下面,簡(jiǎn)要介紹MFC Window對(duì)Windows Window的封裝。

          Windows的注冊(cè)

          一個(gè)應(yīng)用程序在創(chuàng)建某個(gè)類型的窗口前,必須首先注冊(cè)該“窗口類”(Windows Class)。注意,這里不是C++類的類。Register Window把窗口過(guò)程、窗口類型以及其他類型信息和要登記的窗口類關(guān)聯(lián)起來(lái)。


          上一頁(yè) 1 2 3 4 5 6 下一頁(yè)

          關(guān)鍵詞:

          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();