新聞中心

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ò) 收藏

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

CToolBar m_wndToolBar;

CStatusBar m_wndStatusBar;

當(dāng)創(chuàng)建CMainFrame類對(duì)象時(shí),上面兩個(gè)MFC Object也被構(gòu)造。

CMainFrame還有一個(gè)成員函數(shù)

OnCreate(LPCREATESTRUCT lpCreateStruct),

它的實(shí)現(xiàn)包含如下一段代碼,調(diào)用CToolBar和CStatusBar的成員函數(shù)Create來(lái)創(chuàng)建上述兩個(gè)MFC對(duì)象對(duì)應(yīng)的工具欄HWND窗口和狀態(tài)欄HWND窗口:

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)

{

if (!m_wndToolBar.Create(this) ||

!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))

{

TRACE0(Failed to create toolbarn);

return -1; // fail to create

}

if (!m_wndStatusBar.Create(this) ||

!m_wndStatusBar.SetIndicators(indicators,

sizeof(indicators)/sizeof(UINT)))

{

TRACE0(Failed to create status barn);

return -1; // fail to create

}

}

關(guān)于工具欄、狀態(tài)欄將在后續(xù)有關(guān)章節(jié)作詳細(xì)討論。

在MFC中,還提供了一種動(dòng)態(tài)創(chuàng)建技術(shù)。動(dòng)態(tài)創(chuàng)建的過(guò)程實(shí)際上也如上所述分兩步,只不過(guò)MFC使用這個(gè)技術(shù)是由框架自動(dòng)地完成整個(gè)過(guò)程的。通常框架窗口、文檔框架窗口、視使用了動(dòng)態(tài)創(chuàng)建。介于MFC的結(jié)構(gòu),CFrameWnd和CView及其派生類的實(shí)例即使不使用動(dòng)態(tài)創(chuàng)建,也要用new在堆中分配。理由見(jiàn)窗口的銷毀(2.2.5節(jié))。

至于動(dòng)態(tài)創(chuàng)建技術(shù),將在下一章具體討論。

在Windows窗口的創(chuàng)建過(guò)程中,將發(fā)送一些消息,如:

在創(chuàng)建了窗口的非客戶區(qū)(Nonclient area)之后,發(fā)送消息WM_NCCREATE;

在創(chuàng)建了窗口的客戶區(qū)(client area)之后,發(fā)送消息WM_CREATE;

窗口的窗口過(guò)程在窗口顯示之前收到這兩個(gè)消息。

如果是子窗口,在發(fā)送了上述兩個(gè)消息之后,還給父窗口發(fā)送WM_PARENATNOTIFY消息。其他類或風(fēng)格的窗口可能發(fā)送更多的消息,具體參見(jiàn)SDK開(kāi)發(fā)文檔。

MFC窗口的使用

MFC提供了大量的窗口類,其功能和用途各異。程序員應(yīng)該選擇哪些類來(lái)使用,以及怎么使用他們呢?

直接使用MFC提供的窗口類或者先從MFC窗口類派生一個(gè)新的C++類然后使用它,這些在通常情況下都不需要程序員提供窗口注冊(cè)的代碼。是否需要派生新的C++類,視MFC已有的窗口類是否能滿足使用要求而定。派生的C++類繼承了基類的特性并改變或擴(kuò)展了它的功能,例如增加或者改變對(duì)消息、事件的特殊處理等。

主要使用或繼承以下一些MFC窗口類(其層次關(guān)系圖見(jiàn)圖1-1):

框架類CFrameWnd,CMdiFrameWnd;

文檔框架CMdiChildWnd;

視圖CView和CView派生的有特殊功能的視圖如:列表CListView,編輯CEditView,樹(shù)形列表CTreeView,支持RTF的CRichEditView,基于對(duì)話框的視CFormView等等。

對(duì)話框CDialog。

通常,都要從這些類派生應(yīng)用程序的框架窗口和視窗口或者對(duì)話框。

工具條CToolBar

狀態(tài)條CStatusBar

其他各類控制窗口,如列表框CList,編輯框CEdit,組合框CComboBox,按鈕Cbutton等。

通常,直接使用這些類。

在MFC下窗口的銷毀

窗口對(duì)象使用完畢,應(yīng)該銷毀。在MFC下,一個(gè)窗口對(duì)象的銷毀包括HWND窗口對(duì)象的銷毀和MFC窗口對(duì)象的銷毀。一般情況下,MFC編程框架自動(dòng)地處理了這些。

(1)對(duì)CFrameWnd和CView的派生類

這些窗口的關(guān)閉導(dǎo)致銷毀窗口的函數(shù)DestroyWindow被調(diào)用。銷毀Windows窗口時(shí),MFC框架調(diào)用的最后一個(gè)成員函數(shù)是OnNcDestroy函數(shù),該函數(shù)負(fù)責(zé)Windows清理工作,并在最后調(diào)用虛擬成員函數(shù)PostNcDestroy。CFrameWnd和CView的PostNcDestroy調(diào)用delete this刪除自身這個(gè)MFC窗口對(duì)象。

所以,對(duì)這些窗口,如前所述,應(yīng)在堆(Heap)中分配,而且,不要對(duì)這些對(duì)象使用delete操作。

(2)對(duì)Windows Control窗口

在它們的析構(gòu)函數(shù)中,將調(diào)用DestroyWidnow來(lái)銷毀窗口。如果在棧中分配這樣的窗口對(duì)象,則在超出作用范圍的時(shí)候,隨著析構(gòu)函數(shù)的調(diào)用,MFC窗口對(duì)象和它的Windows window對(duì)象都被銷毀。如果在堆(Heap)中分配,則顯式調(diào)用delete操作符,導(dǎo)致析構(gòu)函數(shù)的調(diào)用和窗口的銷毀。

所以,這種類型的窗口應(yīng)盡可能在棧中分配,避免用額外的代碼來(lái)銷毀窗口。如前所述的CMainFrame的成員變量m_wndStatusBar和m_wndToolBar就是這樣的例子。

(3)對(duì)于程序員直接從CWnd派生的窗口

程序員可以在派生類中實(shí)現(xiàn)上述兩種機(jī)制之一,然后,在相應(yīng)的規(guī)范下使用。

后面章節(jié)將詳細(xì)的討論應(yīng)用程序退出時(shí)關(guān)閉、清理窗口的過(guò)程。

設(shè)備描述表

設(shè)備描述表概述

當(dāng)一個(gè)應(yīng)用程序使用GDI函數(shù)時(shí),必須先裝入特定的設(shè)備驅(qū)動(dòng)程序,然后為繪制窗口準(zhǔn)備設(shè)備描述表,比如指定線的寬度和顏色、刷子的樣式和顏色、字體、剪裁區(qū)域等等。不像其他Win32結(jié)構(gòu),設(shè)備描述表不能被直接訪問(wèn),只能通過(guò)系列Win32函數(shù)來(lái)間接地操作。

如同Windows“窗口類”一樣,設(shè)備描述表也是一種Windows數(shù)據(jù)結(jié)構(gòu),用來(lái)描述繪制窗口所需要的信息。它定義了一個(gè)坐標(biāo)映射模式、一組GDI圖形對(duì)象及其屬性。這些GDI對(duì)象包括用于畫線的筆,繪圖、填圖的刷子,位圖,調(diào)色板,剪裁區(qū)域,及路徑(Path)。

表2-2列出了設(shè)備描述表的結(jié)構(gòu)和各項(xiàng)缺省值,表2-3列出了設(shè)備描述表的類型,表2-4顯示設(shè)備描述表的類型。

表2-2 設(shè)備描述表的結(jié)構(gòu)

屬性缺省值

Background colorBackground color setting from Windows Control Panel (typically, white)

Background modeOPAQUE

BitmapNone

BrushWHITE_BRUSH

Brush origin(0,0)

Clipping regionEntire window or client area with the update region clipped, as appropriate. Child and pop-up windows in the client area may also be clipped

PaletteDEFAULT_PALETTE

Current pen position(0,0)

Device originUpper left corner of the window or the client area



關(guān)鍵詞:

評(píng)論


相關(guān)推薦

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

關(guān)閉