新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > MFC和Win32技術應用分析

        MFC和Win32技術應用分析

        作者: 時間:2018-09-05 來源:網絡 收藏

        本文引用地址:http://www.104case.com/article/201809/388505.htm

        CToolBar m_wndToolBar;

        CStatusBar m_wndStatusBar;

        當創建CMainFrame類對象時,上面兩個MFC Object也被構造。

        CMainFrame還有一個成員函數

        OnCreate(LPCREATESTRUCT lpCreateStruct),

        它的實現包含如下一段代碼,調用CToolBar和CStatusBar的成員函數Create來創建上述兩個MFC對象對應的工具欄HWND窗口和狀態欄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

        }

        }

        關于工具欄、狀態欄將在后續有關章節作詳細討論。

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

        至于動態創建技術,將在下一章具體討論。

        在Windows窗口的創建過程中,將發送一些消息,如:

        在創建了窗口的非客戶區(Nonclient area)之后,發送消息WM_NCCREATE;

        在創建了窗口的客戶區(client area)之后,發送消息WM_CREATE;

        窗口的窗口過程在窗口顯示之前收到這兩個消息。

        如果是子窗口,在發送了上述兩個消息之后,還給父窗口發送WM_PARENATNOTIFY消息。其他類或風格的窗口可能發送更多的消息,具體參見SDK開發文檔。

        MFC窗口的使用

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

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

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

        框架類CFrameWnd,CMdiFrameWnd;

        文檔框架CMdiChildWnd;

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

        對話框CDialog。

        通常,都要從這些類派生應用程序的框架窗口和視窗口或者對話框。

        工具條CToolBar

        狀態條CStatusBar

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

        通常,直接使用這些類。

        在MFC下窗口的銷毀

        窗口對象使用完畢,應該銷毀。在MFC下,一個窗口對象的銷毀包括HWND窗口對象的銷毀和MFC窗口對象的銷毀。一般情況下,MFC編程框架自動地處理了這些。

        (1)對CFrameWnd和CView的派生類

        這些窗口的關閉導致銷毀窗口的函數DestroyWindow被調用。銷毀Windows窗口時,MFC框架調用的最后一個成員函數是OnNcDestroy函數,該函數負責Windows清理工作,并在最后調用虛擬成員函數PostNcDestroy。CFrameWnd和CView的PostNcDestroy調用delete this刪除自身這個MFC窗口對象。

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

        (2)對Windows Control窗口

        在它們的析構函數中,將調用DestroyWidnow來銷毀窗口。如果在棧中分配這樣的窗口對象,則在超出作用范圍的時候,隨著析構函數的調用,MFC窗口對象和它的Windows window對象都被銷毀。如果在堆(Heap)中分配,則顯式調用delete操作符,導致析構函數的調用和窗口的銷毀。

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

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

        程序員可以在派生類中實現上述兩種機制之一,然后,在相應的規范下使用。

        后面章節將詳細的討論應用程序退出時關閉、清理窗口的過程。

        設備描述表

        設備描述表概述

        當一個應用程序使用GDI函數時,必須先裝入特定的設備驅動程序,然后為繪制窗口準備設備描述表,比如指定線的寬度和顏色、刷子的樣式和顏色、字體、剪裁區域等等。不像其他Win32結構,設備描述表不能被直接訪問,只能通過系列Win32函數來間接地操作。

        如同Windows“窗口類”一樣,設備描述表也是一種Windows數據結構,用來描述繪制窗口所需要的信息。它定義了一個坐標映射模式、一組GDI圖形對象及其屬性。這些GDI對象包括用于畫線的筆,繪圖、填圖的刷子,位圖,調色板,剪裁區域,及路徑(Path)。

        表2-2列出了設備描述表的結構和各項缺省值,表2-3列出了設備描述表的類型,表2-4顯示設備描述表的類型。

        表2-2 設備描述表的結構

        屬性缺省值

        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



        關鍵詞:

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 扶余县| 盘山县| 沂水县| 曲麻莱县| 多伦县| 湛江市| 徐州市| 上高县| 正镶白旗| 龙州县| 章丘市| 治多县| 乌拉特前旗| 凉山| 祁门县| 湘阴县| 桃园市| 佳木斯市| 平利县| 方城县| 永善县| 元阳县| 安宁市| 和硕县| 西安市| 青海省| 白朗县| 雷山县| 德格县| 静安区| 巧家县| 萍乡市| 永靖县| 余江县| 吴忠市| 敦化市| 巧家县| 乌鲁木齐市| 舒城县| 晋宁县| 麦盖提县|