Vc中關於DC(設備環境函數(Device Context))的理解

 問:設備描述表DC是一個什麼概念,誰通俗的說說,先謝了

學習Vc,首先遇到的就是這個dc,即設置描述表,輸出文字,繪圖都要用這個,好象它太重要了。但是我就是不明白,這是什麼東西。

 

一些教程看了,但還是不太瞭解,誰能通俗的說說,能快速理解它,謝謝。

 

答:1、作畫之前需要準備好畫布、畫筆、調色板等。

 

當使用GDI函數如MoveToEx/LineTo, TextOut時,只是告訴系統要劃線或寫字了,但用什麼樣的筆(HPEN),字是什麼顏色(SetTextColor),畫在哪張HBITMAP)上需要從一個由系統定義的數據結構中去讀取。

這個數據結構被稱爲Device Context(DC)

 

換句話說,GDI函數只是繪畫的動作,而DC則保存了繪畫所需的材料和工具。

 

2、設備環境函數(Device Context

 

設備環境是一個結構,它定義了一系列圖形對象及其相關的屬性,以及會影響輸出結果的繪圖方式。這些圖形對象包括:畫筆(用於畫直線),筆刷(用於繪圖和填充),位圖(用於屏幕的拷貝或滾動),調色板(用於定義可用的顏色集),剪裁區(用於剪裁和其他操作),路徑(用於繪圖和畫圖操作)。設備環境函數用於對設備環境進行創建、刪除或獲取信息。

 

 

 

問:DCCDCHDCCClientDC....有什麼本質的區別?

 

答:都是DC嘛,HDC就是最原始的 DC 句柄,很多API的第一個參數就是一個HDC類型,比如

 HDC hDC = ::GetDC( m_hWnd);

 ::MoveToEx( hDC, 0, 0, NULL );   

 ::LineTo( hDC, 0, 100, );

 ::ReleaseDC( m_hWnd, hDC );

 

MFC中,爲了將API封裝成一個類來操作,因此多出來了一個CDC。所以在MFC中,都是

 CDC dc = GetDC();

 dc.MoveTo( 0, 0 );

 dc.LineTo( 0, 100 );

 this->ReleaseDC( &dc );

 

但這樣還不夠,因爲 CDC還要你自己去釋放,所有MFC中又多出來一個CClientDC, 這樣你就可以這樣了:

 CClientDC dc(this);

 dc.MoveTo( 0, 0 );

 dc.LineTo( 0, 100 );

CClientDC的析構函數自己會釋放自己。

 

DC不是什麼對象,就是設備上下文的簡稱。

 

CClientDC一樣,還有CWindowDCCPaintDC,只是它們的繪製範圍不一樣。

 

但弄到底,都只是HDC的一些封裝而已,你可以在CDC類中直接引用 m_hDC,這就是那個原始的HDC句柄了。

 

CDCMFCDC的一個類

HDCDC的句柄,API中的一個類似指針的數據類型.

MFC類的前綴都是C開頭的

H開頭的大多數是句柄

這是爲了助記,是編程讀/寫代碼的好的習慣.

CDC中所有MFCDC的基類.常用的CClientDC dc(this);就是CDC的子類(或稱派生類).

CDC等設備上下分類,都含有一個類的成員變量:m_nHdc;HDC類型的句柄.

記住下面的一句話,會有助於你的理解.

MFC的類,是在用window API語句開發出來的有一定功能的小程序.(也可稱爲類).使用它的默認方法,就是,記住它的名字與參數(可以用筆記,代替腦記).

如果將window api比做彙編語言

那麼MFC就相當於Basic語言.

 

 

 

下面介紹Vc中最重要的部分--MFC

 

CWnd:窗口,它是大多數看得見的東西的父類(Windows裏幾乎所有看得見的東西都是一個窗口,大窗口裏有許多小窗口),比如視圖CView、框架窗口CFrameWnd、工具條CToolBar、對話框CDialog、按鈕CButtonetc;一個例外是菜單(CMenu)不是從窗口派生的。該類很大,一開始也不必學,知道就行了。

 

CDocument文檔,負責內存數據與磁盤的交互。最重要的是OnOpenDocument(讀入),OnSaveDocument(寫盤),Serialize(讀寫)

 

CView視圖,負責內存數據與用戶的交互。包括數據的顯示、用戶操作的響應(如菜單的選取、鼠標的響應)。最重要的是OnDraw(重畫窗口),通常用CWnd::Invalidate()來啓動它。另外,它通過消息映射表處理菜單、工具條、快捷鍵和其他用戶消息。你自己的許多功能都要加在裏面,你打交道最多的就是它。

 

CDC設備文本。無論是顯示器還是打印機,都是畫圖給用戶看。這圖就抽象爲CDCCDC與其他GDI(圖形設備接口)一起,完成文字和圖形、圖像的顯示工作。把CDC想象成一張紙,每個窗口都有一個CDC相聯繫,負責畫窗口。CDC有個常用子類CClientDC(窗口客戶區),畫圖通常通過CClientDC完成。

 

CDialog對話框

 

CWinApp應用程序類。似於C中的main函數,是程序執行的入口和管理者,負責程序建立、消滅,主窗口和文檔模板的建立。最常用函數InitInstance():初始化。

 

CGdiObject及子類,用於向設備文本畫圖。它們都需要在使用前選進DC

 

CPen筆,畫線

 

CBrush刷子,填充

 

CFont字體,控制文字輸出的字體

 

CBitmap位圖

 

CPalette調色板

 

CRgn區域,指定一塊區域可以用於做特殊處理。

 

CFile文件。最重要的不外是Open(打開),Read(讀入),Write(寫)

 

CString字符串。封裝了C中的字符數組,非常實用。

 

CPoint點,就是(x, y)對

 

CRect矩形,就是(left, top, right, bottom

 

CSize大小,就是(cx, cy)對(寬、高)

 

 

 

Windows使用與設備無關的圖形設備環境(DC: Device Context) 進行顯示。MFC基礎類庫定義了設備環境對象類----CDC類。

CDCCGdiObject的關係

說到CDC類就不能不提一下GdiObject---圖形對象類。 Windows應用程序中,設備環境與圖形對象共同工作,協同完成繪圖顯示工作。就像畫家繪畫一樣,設備環境好比是畫家的畫布,圖形對象好比是畫家的畫筆。用畫筆在畫布上繪畫,不同的畫筆將畫出不同的畫來。選擇合適的圖形對象和繪圖對象,才能按照要求完成繪圖任務。

有關CDC類的繼承

父類:從 CObject 直接繼承而來。繼承了CObject類的各種特性,如動態創建等等。

子類:CClientDC-------代表操作窗口的DC ,是比較常用的一個子類

CMetaFileDC ------響應Meta FileDC Meta File是一些GDI消息。

CPaintDC-------響應WM_PAINT消息的DC

CWindowDC ------代表整個屏幕的DC

CDC類的數據成員

數據成員只有兩個:

HDC m_hDC : CDC對象使用的輸出設備上下文

HDC m_hAttribDC : CDC對象使用的屬性設備上下文

二者在CDC對象創建時指向相同的設備上下文。

 

 

 

問:VC 解釋一下CDC *pDC=pWnd->GetDC();

 

答:繪圖用到的所有有關的類與函數都被集合到一起,被稱之爲設備上下文,或設備環境。你可以將這個類集看成一個超級的大類。GetDC()是一個函數,它能獲得DC的使用權,也就是說它將句柄(或指針)交給了你,也就是說它將使用它的鑰匙交給了你。你可以使用它的所有函數了。不用再向API函數那樣,每一個繪圖動作都要使用一個函數,如果你不想改變它的默認值,可以直接繪圖,當然,他提供了比API更加強大的函數與更加多的功能。當然,對初學者,最方便的是,不用記大量的函數了,當你用它實例化一個對象後(也稱得到設備上下文(DC)),你只要用->.就可以在VC提示的幫助下來選擇相應的函數了。

CDC *pDC=pWnd->GetDC();

1.CDCMFC的設備上下文)實例化一個對象的指針

2.爲這個對象的指針賦值爲pWnd

3.pWnd被賦值爲GetDC.相當於用APIDC實例化一個對象的指針pWnd

小結:用MFC的設備上下文實列化一個指針的對象,這個指針對象的值來源於API的設備上下文實例化。

==============

實際上,MFC的大多數調用的函數,最終調用的都是API裏的相應的函數

 

 

 

問:VC++中繪圖 用到的this->GetDC()函數是什麼作用?還有 this->ReleaseDC(pDC)

 

答:1this指針是當前類的對象的指針.它指向類實例化後的對象.它是隱含的指針.每個對象都有一個,使用它方便呀,不用自已再定義指針了.

--------------------------------------

2this->GetDC();得到DC,

相當於

CDC *pDC;

pDC->GetDC();

也相當於

CDC dc;

dc.GetDC();

-----------------------------------

3this->ReleaseDC()是釋放DC

------------------------------------

4DC的常被稱爲設備上下文,或設備環境.它是一個超大的類或函數的集合.它集合了,所有的繪圖,打印,等相關的類及函數.你只要聲明瞭它的對象或指針,你就得到了它的所有類及函數的使用權.象畫筆,畫刷,位圖,繪圖函數....等等全部的功能.你只要用/dc./this->/pDC->等方式就可以直接調用它的函數了.

 

 

 

CClientDC

CClientDC派生於CDC,在構造時調用了Windows函數GetDC,在析構時調用了ReleaseDC。這意味着和CClientDC對象相關的設備上下文是窗口的客戶區。

幾種DC及區別

  CClientDC:(客戶區設備上下文)用於客戶區的輸出,與特定窗口關聯,可以讓開發者訪問目標窗口中客戶區,其構造函數中包含了GetDC,析構函數中包含了ReleaseDC:

  用法是:CClientDC dc(this);//this一般指向本窗口或當前活動視圖dc.TextOut(10,10,str,str.GetLength());//利用dc輸出文本,如果是在CScrollView中使用,還要注意調用OnPrepareDC(&dc)調整設備上下文的座標。CPaintDC用於響應窗口重繪消息(WM_PAINT)時的繪圖輸出。CPaintDC在構造函數中調用BeginPaint()取得設備上下文,在析構函數中調用EndPaint()釋放設備上下文。EndPaint()除了釋放設備上下文外,還負責從消息隊列中清除WM_PAINT消息。因此,在處理窗口重畫時,必須使用CPaintDC,否則WM_PAINT消息無法從消息隊列中清除,將引起不斷的窗口重畫。CPaintDC也只能用在WM_PAINT消息處理之中。

  Detach();}CWindowDC:關聯一特定窗口,允許開發者在目標窗口的任何一部分進行繪圖,包含邊界與標題,這種DCWM_NCPAINT消息一起發送

  CWindowDCCClientDCCPaintDC的區別:CWindowDC可在非客戶區繪製圖形,而CClientDCCPaintDC只能在客戶區繪製圖形。CWindowDC下座標原點是在屏幕的左上角,CClientDCCPaintDC下座標原點是在客戶區的左上角。CClientDCCPaintDC的區別:

  CPaintDC的對象一般用在OnPaint內以響應Windows消息WM_PAINT,自動完成繪製,在整個窗口內進行重畫,維持原有窗口完整性。CClientDC應用在非響應Windows消息WM_PAINT的情況下,進行實時繪製,繪製的區域內被重畫。

 

 

 

CDCCGdiObject的關係

  說到CDC類就不能不提一下GdiObject---圖形對象類。 Windows應用程序中,設備環境與圖形對象共同工作,協同完成繪圖顯示工作。就像畫家繪畫一樣,設備環境好比是畫家的畫布,圖形對象好比是畫家的畫筆。用畫筆在畫布上繪畫,不同的畫筆將畫出不同的畫來。選擇合適的圖形對象和繪圖對象,才能按照要求完成繪圖任務。

有關CDC類的繼承

  父類: CObject 直接繼承而來。繼承了CObject類的各種特性,如動態創建等等。

  子類:CClientDC-------代表操作窗口的DC ,是比較常用的一個子類

  CMetaFileDC ------響應Meta FileDC Meta File是一些GDI消息。

  CPaintDC-------響應WM_PAINT消息的DC

  CWindowDC ------代表整個屏幕的DC

CDC類的數據成員

  數據成員只有兩個:

  HDC m_hDC : CDC對象使用的輸出設備上下文。

  HDC m_hAttribDC : CDC對象使用的屬性設備上下文。

  二者在CDC對象創建時指向相同的設備上下文。

  所需頭文件:#include <afxwin.h>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章