新聞中心

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

        MFC和Win32技術應用分析

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

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

        OnDraw(dc);

        }

        在棧中定義了CPaintDC類型的變量dc,隨著構造函數的調用獲取了設備描述表;設備描述表使用完畢,超出其有效范圍就被自動地清除,隨著析構函數的調用,其獲取的設備描述表被釋放。

        如果希望在堆中創建,例如

        CPaintDC *pDC;

        pDC = new CPaintDC(this)

        則在使用完畢時,用delete刪除pDC:

        delete pDC;

        直接使用CDC

        需要注意的是:在生成CDC對象的時候,并不像它的派生類那樣,在構造函數里獲取相應的Windows設備描述表。最好不要使用::GetDC等函數來獲取一個設備描述表,而是創建一個設備描述表。其構造函數如下:

        CDC::CDC()

        {

        m_hDC = NULL;

        m_hAttribDC = NULL;

        m_bPrinting = FALSE;

        }

        其析構函數如下:

        CDC::~CDC()

        {

        if (m_hDC != NULL)

        ::DeleteDC(Detach());

        }

        在CDC析構函數中,如果設備描述表句柄不空,則調用DeleteDC刪除它。這是直接使用CDC時最好創建Windows設備描述表的理由。如果設備描述表不是創建的,則應該在析構函數被調用前分離出設備描述表句柄并用::RealeaseDC釋放它,釋放后m_hDC為空,則在析構函數調用時不會執行::DeleteDC。當然,不用擔心CDC的派生類的析構函數調用CDC的析構函數,因為CDC::~CDC()不是虛擬析構函數。

        直接使用CDC的例子是內存設備上下文,例如:

        CDC dcMem; //聲明一個CDC對象

        dcMem.CreateCompatibleDC(dc); //創建設備描述表

        pbmOld = dcMem.SelectObject(m_bmBall);//更改設備描述表屬性

        …//作一些繪制操作

        dcMem.SelectObject(pbmOld);//恢復設備描述表的屬性

        dcMem.DeleteDC(); //可以不調用,而讓析構函數去刪除設備描述表

        GDI對象

        在討論設備描述表時,已經多次涉及到GDI對象。這里,需強調一下:GDI對象要選入Windows 設備描述表后才能使用;用畢,要恢復設備描述表的原GDI對象,并刪除該GDI對象。

        一般按如下步驟使用GDI對象:

        Create or get a GDI OBJECT hNewGdi;

        hOldGdi = ::SelectObject(hdc, hNewGdi)

        ……

        ::SelectObject(hdc, hOldGdi)

        ::DeleteObject(hNewGdi)

        先創建或得到一個GDI對象,然后把它選入設備描述表并保存它原來的GDI對象;用畢恢復設備描述表原來的GDI對象并刪除新創建的GDI對象。

        需要指出的是,如果hNewGdi是一個Stock GDI對象,可以不刪除(刪除也可以)。通過

        HGDIOBJ GetStockObject(

        int fnObject // type of stock object

        );

        來獲取Stock GDI對象。

        MFC GDI對象

        MFC用一些類封裝了Windows GDI對象和相關函數,層次結構如圖2-4所示:

        CGdiObject封裝了Windows GDI Object共有的特性。其派生類在繼承的基礎上,主要封裝了各類GDI的創建函數以及和具體GDI對象相關的操作。

        CGdiObject的構造函數僅僅讓m_hObject為空。如果m_hObject不空,其析構函數將刪除對應的Windows GDI對象。MFC GDI對象和Windows GDI對象的關系如圖2-5所示。

        使用MFC GDI類的使用

        首先創建GDI對象,可分一步或兩步創建。一步創建就是構造MFC對象和Windows GDI對象一步完成;兩步創建則先構造MFC對象,接著創建Windows GDI對象。然后,把新創建的GDI對象選進設備描述表,取代原GDI對象并保存。最后,恢復原GDI對象。例如:

        void CMyView::OnDraw(CDC *pDC)

        {

        CPen penBlack; //構造MFC CPen對象

        if (penBlack.CreatePen(PS_SOLID, RGB(0, 0, 0)))

        {

        CPen *pOldPen = pDC->SelectObject(penBlack)); //選進設備表,保存原筆

        pDC->SelectObject(pOldPen); //恢復原筆

        }else

        {

        }

        }

        和在SDK下有一點不同的是:這里沒有DeleteObject。因為執行完OnDraw后,棧中的penBlack被銷毀,它的析構函數被調用,導致DeleteObject的調用。

        還有一點要說明:

        pDC->SelectObject(penBlack)返回了一個CPen *指針,也就是說,它根據原來PEN的句柄創建了一個MFC CPen對象。這個對象是否需要刪除呢?不必要,因為它是一個臨時對象,MFC框架會自動地刪除它。當然,在本函數執行完畢把控制權返回給主消息循環之前,該對象是有效的。

        關于臨時對象及MFC處理它們的內部機制,將在后續章節詳細討論。

        至此,Windows編程的核心概念:窗口、GDI界面(設備描述表、GDI對象等)已經陳述清楚,特別揭示了MFC對這些概念的封裝機制,并簡明講述了與這些Windows Object對應的MFC類的使用方法。還有其他Windows概念,可以參見SDK開發文檔。在MFC的實現上,基本上僅僅是對和這些概念相關的Win32函數的封裝。如果明白了MFC的窗口、GDI界面的封裝機制,其他就不難了。


        上一頁 1 2 3 4 5 6 下一頁

        關鍵詞:

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 兴隆县| 手游| 且末县| 灵武市| 弥渡县| 江油市| 寿宁县| 新建县| 周至县| 周宁县| 六枝特区| 海兴县| 兴化市| 当涂县| 永登县| 西宁市| 营山县| 久治县| 丹巴县| 侯马市| 奉贤区| 宝清县| 常宁市| 胶南市| 长葛市| 辽宁省| 故城县| 美姑县| 松阳县| 遵化市| 阿图什市| 抚顺市| 内乡县| 抚远县| 兴仁县| 凉山| 沂南县| 湘阴县| 清新县| 桑日县| 南投市|