http://www.cnblogs.com/SunJavaLiu/articles/251463.html
http://blog.csdn.net/byxdaz/article/details/5949590
http://aiyzda.blog.163.com/blog/static/1755381822011619848992/
GDI(Graphics Device Interface,圖形設備接口)是在Windows平臺上處理圖形、圖像的方法,它是一套API函數;它們功能豐富,使用起來簡單、靈活。下面,我們首先來介紹一些GDI編程的基礎知識。
GDI函數有很多,我們大致可以把它們分成如下幾類:
· 設備上下文(Device Context,簡稱DC)函數,如GetDC、CreateDC、DeleteDC等;
· 畫線函數,如LineTo、Polyline、Arc等;
· 填充畫圖函數,如Ellipse、FillRect、Pie等;
· 畫圖屬性函數,如SetBkColor、SetBkMode、SetTextColor等;
· 文本、字體函數,如TextOut、GetTextExtentPoint32、GetFontData等;
· 位圖函數,如SetPixel、BitBlt、StretchBlt等;
· 座標函數,如DPtoLP、LPtoDP、ScreenToClient、ClientToScreen等;
· 映射函數,如SetMapMode、SetWindowExtEx、SetViewportExtEx等;
· 元文件(MetaFile)函數,如PlayMetaFile、SetWinMetaFileBits等;
· 區域(Region)函數,如FillRgn、FrameRgn、InvertRgn等;
· 路徑(Path)函數,如BeginPath、EndPath、StrokeAndFillPath等;
· 裁剪(Clipping)函數,如SelectClipRgn、SelectClipPath等。
上述這些函數可以完成繪製用戶界面中的各個部分,包括我們在Windows平臺上司空見慣的窗口、菜單、工具條、按鈕等。除了完成顯示操作功能外,GDI還提供了一些繪圖對象,用以渲染顯示。這些GDI對象包括:
設備上下文(DC)——具有如顯示器或打印機等輸出設備的繪圖屬性信息的數據結構;
畫筆(Pen)——用於繪製線條;
畫刷(Brush)——用於圖案的填充;
字體(Font)——用於確定文本字符的樣式;
位圖(Bitmap)——用於存儲圖像;
調色板(Palette)——屏幕上畫圖時可以使用的一些顏色的集合。
DC在GDI中是一個非常重要的概念。在MSDN上查看各個GDI函數的使用說明,我們會發現大部分GDI函數都有一個HDC類型的參數;HDC就是DC句柄。Windows應用程序進行圖形、圖像處理的一般操作步驟如下:
1. 取得指定窗口的DC;
2. 確定使用的座標系及映射方式;
3. 進行圖形、圖像或文字處理;
4. 釋放所使用的DC。
爲了進一步簡化GDI函數的使用,或者說爲了適應面向對象的程序設計風格,微軟的MFC類庫提供了幾個DC的封裝類。我們知道,絕大部分MFC類都是從CObject類派生的,CDC類也不例外。我們看到,CDC類是最基本的DC封裝類;它幾乎對應封裝了所有的GDI函數。另外,CDC類的各個派生類各 有專門的用途:
CClientDC——在窗口的客戶區畫圖的DC;
CMetaFileDC——用於操作Windows元文件的DC;
CPaintDC——響應WM_PAINT消息時畫圖使用的DC,多見於MFC程序的OnDraw函數中;
CWindowDC——在整個窗口範圍(包括框架、工具條等)中畫圖的DC。
MFC除了對DC進行類封裝外,對其它GDI對象也進行了類封裝。
CGdiObject——GDI對象的父類,定義了GDI對象封裝類的一些公有函數接口;
CBitmap——位圖相關操作的封裝類,包括位圖的裝入或創建等;
CBrush——畫刷對象的封裝類;
CFont——字體屬性及相關操作的封裝類;
CPalette——調色板的封裝類;
CPen——畫筆對象的封裝類;
CRgn——區域對象以及區域相關操作的封裝類。