問:設備描述表DC是一個什麼概念,誰通俗的說說,先謝了
學習Vc,首先遇到的就是這個dc,即設置描述表,輸出文字,繪圖都要用這個,好象它太重要了。但是我就是不明白,這是什麼東西。
一些教程看了,但還是不太瞭解,誰能通俗的說說,能快速理解它,謝謝。
答:1、作畫之前需要準備好畫布、畫筆、調色板等。
當使用GDI函數如MoveToEx/LineTo, TextOut時,只是告訴系統要劃線或寫字了,但用什麼樣的筆(HPEN),字是什麼顏色(SetTextColor),畫在哪張“紙”(HBITMAP)上需要從一個由系統定義的數據結構中去讀取。
這個數據結構被稱爲Device Context(DC)。
換句話說,GDI函數只是繪畫的動作,而DC則保存了繪畫所需的材料和工具。
2、設備環境函數(Device Context)
設備環境是一個結構,它定義了一系列圖形對象及其相關的屬性,以及會影響輸出結果的繪圖方式。這些圖形對象包括:畫筆(用於畫直線),筆刷(用於繪圖和填充),位圖(用於屏幕的拷貝或滾動),調色板(用於定義可用的顏色集),剪裁區(用於剪裁和其他操作),路徑(用於繪圖和畫圖操作)。設備環境函數用於對設備環境進行創建、刪除或獲取信息。
問:DC,CDC,HDC,CClientDC....有什麼本質的區別?
答:都是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一樣,還有CWindowDC,CPaintDC,只是它們的繪製範圍不一樣。
但弄到底,都只是HDC的一些封裝而已,你可以在CDC類中直接引用 m_hDC,這就是那個原始的HDC句柄了。
CDC是MFC的DC的一個類
HDC是DC的句柄,API中的一個類似指針的數據類型.
MFC類的前綴都是C開頭的
H開頭的大多數是句柄
這是爲了助記,是編程讀/寫代碼的好的習慣.
CDC中所有MFC的DC的基類.常用的CClientDC dc(this);就是CDC的子類(或稱派生類).
CDC等設備上下分類,都含有一個類的成員變量:m_nHdc;即HDC類型的句柄.
記住下面的一句話,會有助於你的理解.
MFC的類,是在用window API語句開發出來的有一定功能的小程序.(也可稱爲類).使用它的默認方法,就是,記住它的名字與參數(可以用筆記,代替腦記).
如果將window api比做彙編語言
那麼MFC就相當於Basic語言.
下面介紹Vc中最重要的部分--MFC
CWnd:窗口,它是大多數“看得見的東西”的父類(Windows裏幾乎所有看得見的東西都是一個窗口,大窗口裏有許多小窗口),比如視圖CView、框架窗口CFrameWnd、工具條CToolBar、對話框CDialog、按鈕CButton,etc;一個例外是菜單(CMenu)不是從窗口派生的。該類很大,一開始也不必學,知道就行了。
CDocument文檔,負責內存數據與磁盤的交互。最重要的是OnOpenDocument(讀入),OnSaveDocument(寫盤),Serialize(讀寫)
CView視圖,負責內存數據與用戶的交互。包括數據的顯示、用戶操作的響應(如菜單的選取、鼠標的響應)。最重要的是OnDraw(重畫窗口),通常用CWnd::Invalidate()來啓動它。另外,它通過消息映射表處理菜單、工具條、快捷鍵和其他用戶消息。你自己的許多功能都要加在裏面,你打交道最多的就是它。
CDC設備文本。無論是顯示器還是打印機,都是畫圖給用戶看。這圖就抽象爲CDC。CDC與其他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類。
CDC與CGdiObject的關係
說到CDC類就不能不提一下GdiObject---圖形對象類。 在Windows應用程序中,設備環境與圖形對象共同工作,協同完成繪圖顯示工作。就像畫家繪畫一樣,設備環境好比是畫家的畫布,圖形對象好比是畫家的畫筆。用畫筆在畫布上繪畫,不同的畫筆將畫出不同的畫來。選擇合適的圖形對象和繪圖對象,才能按照要求完成繪圖任務。
有關CDC類的繼承
父類:從 CObject 直接繼承而來。繼承了CObject類的各種特性,如動態創建等等。
子類:CClientDC-------代表操作窗口的DC ,是比較常用的一個子類
CMetaFileDC ------響應Meta File的DC ,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.用CDC(MFC的設備上下文)實例化一個對象的指針
2.爲這個對象的指針賦值爲pWnd
3.pWnd被賦值爲GetDC.相當於用API的DC實例化一個對象的指針pWnd
小結:用MFC的設備上下文實列化一個指針的對象,這個指針對象的值來源於API的設備上下文實例化。
==============
實際上,MFC的大多數調用的函數,最終調用的都是API裏的相應的函數
問:VC++中繪圖 用到的this->GetDC()函數是什麼作用?還有 this->ReleaseDC(pDC)
答:1、this指針是當前類的對象的指針.它指向類實例化後的對象.它是隱含的指針.每個對象都有一個,使用它方便呀,不用自已再定義指針了.
--------------------------------------
2、this->GetDC();得到DC,
相當於
CDC *pDC;
pDC->GetDC();
也相當於
CDC dc;
dc.GetDC();
-----------------------------------
3、this->ReleaseDC()是釋放DC
------------------------------------
4、DC的常被稱爲設備上下文,或設備環境.它是一個超大的類或函數的集合.它集合了,所有的繪圖,打印,等相關的類及函數.你只要聲明瞭它的對象或指針,你就得到了它的所有類及函數的使用權.象畫筆,畫刷,位圖,繪圖函數....等等全部的功能.你只要用/dc./this->/pDC->等方式就可以直接調用它的函數了.
CClientDC
類CClientDC派生於CDC,在構造時調用了Windows函數GetDC,在析構時調用了ReleaseDC。這意味着和CClientDC對象相關的設備上下文是窗口的客戶區。
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:關聯一特定窗口,允許開發者在目標窗口的任何一部分進行繪圖,包含邊界與標題,這種DC同WM_NCPAINT消息一起發送
CWindowDC與CClientDC,CPaintDC的區別:CWindowDC可在非客戶區繪製圖形,而CClientDC,CPaintDC只能在客戶區繪製圖形。CWindowDC下座標原點是在屏幕的左上角,CClientDC,CPaintDC下座標原點是在客戶區的左上角。CClientDC與CPaintDC的區別:
CPaintDC的對象一般用在OnPaint內以響應Windows消息WM_PAINT,自動完成繪製,在整個窗口內進行重畫,維持原有窗口完整性。CClientDC應用在非響應Windows消息WM_PAINT的情況下,進行實時繪製,繪製的區域內被重畫。
CDC與CGdiObject的關係
說到CDC類就不能不提一下GdiObject---圖形對象類。 在Windows應用程序中,設備環境與圖形對象共同工作,協同完成繪圖顯示工作。就像畫家繪畫一樣,設備環境好比是畫家的畫布,圖形對象好比是畫家的畫筆。用畫筆在畫布上繪畫,不同的畫筆將畫出不同的畫來。選擇合適的圖形對象和繪圖對象,才能按照要求完成繪圖任務。
父類:從 CObject 直接繼承而來。繼承了CObject類的各種特性,如動態創建等等。
子類:CClientDC-------代表操作窗口的DC ,是比較常用的一個子類
CMetaFileDC ------響應Meta File的DC ,Meta File是一些GDI消息。
CPaintDC-------響應WM_PAINT消息的DC。
CWindowDC ------代表整個屏幕的DC
數據成員只有兩個:
HDC m_hDC : CDC對象使用的輸出設備上下文。
HDC m_hAttribDC : CDC對象使用的屬性設備上下文。
二者在CDC對象創建時指向相同的設備上下文。
所需頭文件:#include <afxwin.h>