<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

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

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

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

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

本文引用地址:http://dyxdggzs.com/article/201809/388505.htm

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

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

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

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

從數據結構上比較

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

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

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

從層次上講比較

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

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

從創(chuàng )建上比較

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

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

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

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

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

當然,可以在MFC Object的構造函數中創(chuàng )建相應的Windows對象,MFC的GDI類(lèi)就是如此實(shí)現的,但從實(shí)質(zhì)上講,MFC Object的創(chuàng )建和Windows Object的創(chuàng )建是兩回事。

從轉換上比較

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

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

從使用范圍上比較

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

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

從銷(xiāo)毀上比較

MFC Object隨著(zhù)析構函數的調用而消失;但Windows Object必須由相應的Windows系統函數銷(xiāo)毀。

設備描述表CDC類(lèi)的對象有所不同,它對應的HDC句柄對象可能不是被銷(xiāo)毀,而是被釋放。

當然,可以在MFC Object的析構函數中完成Windows Object的銷(xiāo)毀,MFC Object的GDI類(lèi)等就是如此實(shí)現的,但是,應該看到:兩者的銷(xiāo)毀是不同的。

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

表2-1 MFC Object和Windows Object的對應關(guān)系

表2-1中的OBJECT分以下幾類(lèi):

描述Windows句柄MFC Object

窗口HWNDCWnd and CWnd-derived classes

設備上下文HDCCDC and CDC-derived classes

菜單HMENUCMenu

筆HPENCGdiObject類(lèi),CPen和CPen-derived classes

刷子HBRUSHCGdiObject類(lèi),CBrush和CBrush-derived classes

字體HFONTCGdiObject類(lèi),CFont和CFont-derived classes

位圖HBITMAPCGdiObject類(lèi),CBitmap和CBitmap-derived classes

調色板HPALETTECGdiObject類(lèi),CPalette和CPalette-derived classes

區域HRGNCGdiObject類(lèi),CRgn和CRgn-derived classes

圖像列表HimageLISTCimageList和CimageList-derived classes

套接字SOCKETCSocket,CAsynSocket及其派生類(lèi)

Windows對象,

設備上下文對象,

GDI對象(BITMAP,BRUSH,FONT,PALETTE,PEN,RGN),

菜單,

圖像列表,

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

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

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

Windows Object

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

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

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

Windows的注冊

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


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

關(guān)鍵詞:

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>