CCD类详解
CDC對象提供處理顯示器或打印機等設備上下文的成員函數,以及處理與窗口客戶區對應的顯示上下文的成員。
通過CDC對象的成員函數進行所有的繪圖。
類對設備上下文操作提供了成員函數,處理繪圖工具。安全型圖形設備接口(GDI)對象收集,以及處理顏色和調色板。
它還為獲取和設置繪圖屬性、映射,處理視點、窗口擴展、轉換坐標,處理區域、剪貼、繪制直線及繪制簡單橢圓和多邊形等形狀提供了成員函數。
另外還為繪制文本、處理字體,使用打印機跳轉,滾動和播放元文件提供成員函數。
使用CDC對象時要構造它,然后調用與它平等的、使用設備上下文的Windows函數的成員函數。
注意:
Windows 95下所有屏幕坐標限制在16位以內。因此向CDC成員函數傳遞的int必須在-32768至32767之間。
為了特定用途,Microsoft基本類庫提供了幾個CDC派生類。
| CPaintDC | 包括BeginPaint和EndPaint調用。 |
| CClientDC | 管理窗口用戶區對應的顯示上下文。 |
| CWindowDC | 管理與整個窗口對應的顯示上下文,包括它的結構和控件。 |
| CMetaFileDC | 與帶元文件的設備上下文對應。 |
CDC包含m_hDC和m_hAttribDC兩個設備上下文,它們在CDC對象創建時參考同一個設備。
CDC指導所有對m_hDC的輸出GDI調用以及對m_hAttribDC的大部分屬性GDI調用(GetTextColor是屬性調用的例子,而SetTextColor是一個輸出調用)。
例如框架使用這兩個設備上下文實現CMetaFileDC對象,在從物理設備讀取屬性期間向元文件發送輸出。
打印預覽以相同風格在框架中實現。還可以以相似方法在特殊應用代碼中使用這兩個設備上下文。
可能多次需要來自m_hDC和m_hAttribDC設備上下文的文本度量信息。
以下幾對函數提供了這項功能:
| 使用m_hAttribDC | 使用m_hDC |
| GetTextExtent | GetOutputTextExtent |
| GetTabbedTextExtent | GetOutputTabbedTextExtent |
| GetTextMetrics | GetOutputTextMetrics |
| GetCharWidth | GetOutputCharWidth |
CDC類成員 ?
數據成員
| m_hDC | CDC對象使用的輸出設備上下文 |
| m_hAttribDC | CDC對象使用的輸出屬性上下文 |
構造函數
| CDC | 構造一個CDC對象 |
初始化
| CreateDC | 為指定設備創建設備上下文 |
| CreateIC | 為指定設備創建信息上下文。這提供了一種不創建設備上下文即獲取有關設備信息的快速方式 |
| CreateCompatibleDC | 創建內存設備上下文,與另一個設備上下文匹配。可以用它在內存中準備圖像 |
| DeleteDC | 刪除CDC對象對應的Windows設備上下文 |
| FromHandle | 給定設備上下文句柄時,返回指向CDC對象的指針。如果CDC對象未附加到句柄,則創建并附加一個臨時CDC對象 |
| DeleteTempMap | 由CWinApp空閑時間句柄調用,刪除FromHandle創建的臨時CDC對象。同時分離設備上下文 |
| Attach | 把Windows設備上下文附加到這個CDC對象 |
| Detach | 從CDC對象分離Windows設備上下文. |
| SetAttribDC | 設置屬性設備上下文m_hAttribDC |
| SetOutputDC | 設置輸出設備上下文m_hDC |
| ReleaseAttribDC | 釋放屬性設備上下文m_hAttribDC |
| ReleaseOutputDC | 釋放輸出設備上下文m_hDC |
| GetCurrentBitmap | 返回指向當前選擇的CBitmap對象的指針 |
| GetCurrentBrush | 返回指向當前選擇的CBrush對象的指針 |
| GetCurrentFont | 返回指向當前選擇的CFont對象的指針 |
| GetCurrentPalette | 返回指向當前選擇的CPalette對象的指針 |
| GetCurrentPen | 返回指向當前選擇的CPen對象的指針 |
| GetWindow | 返回顯示設備上下文對應的窗口 |
設備上下文函數
| GetSafeHdc | 返回輸出設備上下文m_hDC |
| SaveDC | 保存設備上下文當前狀態 |
| RestoreDC | 恢復SaveDC保存的設備上下文以前狀態 |
| ResetDC | 更新m_hAttribDC設備上下文 |
| GetDeviceCaps | 獲取有關給定顯示設備功能的指定類型指定設備信息 |
| IsPrinting | 確定正在使用的設備上下文是否用于打印 |
安全型選擇幫助器
| GetBrushOrg | 獲取當前畫刷的起點 |
| SetBrushOrg | 指定選入設備上下文的下一個畫刷的起點 |
| EnumObjects | 枚舉設備上下文中有效的筆和畫刷 |
顏色和顏色調色板函數
| SelectObject | 選擇筆等GDI繪圖對象 |
| SelectStockObject | 選擇Windows提供的預定義的一個筆、畫刷或字體 |
繪圖工具函數
| GetNearestColor | 獲取與給定設備能顯示的指定邏輯顏色最接近的邏輯色 |
| SelectPalette | 選擇邏輯調色板 |
| RealizePalette | 把當前邏輯調色板中的調色板入口映射到系統調色板 |
| UpdateColors | 通過客戶區當前顏色在像素基礎上與系統調色板的匹配,更新設備上下文的客戶區 |
| GetHalftoneBrush | 獲取半色調畫刷 |
繪圖屬性函數
| GetBkColor | 獲取當前背景色 |
| SetBkColor | 設置當前背景色 |
| GetBkMode | 獲取背景模式 |
| SetBkMode | 設置背景模式 |
| GetPolyFillMode | 獲取當前多邊形填充模式 |
| SetPolyFillMode | 設置多邊形填充模式 |
| GetROP2 | 獲取當前繪圖模式 |
| SetROP2 | 設置當前繪圖模式 |
| GetStretchBltMode | 獲取當前位圖拉伸模式 |
| SetStretchBltMode | 設置位圖拉伸模式 |
| GetTextColor | 獲取當前文本顏色 |
| SetTextColor | 設置文本顏色 |
| GetColorAdjustment | 獲取用于設備上下文的顏色調整值 |
| SetColorAdjustment | 使用指定值設置設備上下文的顏色調整值 |
映射函數
| GetMapMode | 獲取當前映射模式 |
| SetMapMode | 設置當前映射模式 |
| GetViewportOrg | 獲取視區起點的X和Y坐標 |
| SetViewportOrg | 設置視區起點 |
| OffsetViewportOrg | 相對于當前視區起點坐標修改視區起點 |
| GetViewportExt | 獲取視區X和Y范圍 |
| SetViewportExt | 設置視區X和Y范圍 |
| ScaleViewportExt | 相對于當前值修改視區范圍 |
| GetWindowOrg | 獲取參應窗口起點的X和Y坐標 |
| SetWindowOrg | 設置設備上下文的窗口起點 |
| OffsetWindowOrg | 相對于當前窗口起點的坐標修改窗口起點 |
| GetWindowExt | 獲取對應窗口的X和Y坐標 |
| SetWindowExt | 設置對應窗口的X和Y坐標 |
| ScaleWindowExt | 相對于當前值修改窗口范圍 |
坐標函數
| DPtoHIMETRIC | 設備單位轉換為HIMETRIC單位 |
| LPtoHIMETRIC | 邏輯單位轉換為HIMETRIC單位 |
| DPtoLP | 設備單位轉換為邏輯單位 |
| LPtoDP | 邏輯單位轉換為設備單位 |
| HIMETRICtoDPHIMETRIC | 單位轉換為設備單位 |
| HIMETRICtoLPHIMETRIC | 單位轉換為邏輯單位 |
區域函數
| FillRgn | 用指定畫刷填充指定區域 |
| FrameRgn | 用畫刷在指定區域周圍繪制邊線 |
| InvertRgn | 反轉區域中的顏色 |
| PaintRgn | 用選取的畫刷填充區域 |
剪切函數
| SetBoundsRect | 控制指定設備上下文綁定的矩形信息的累計 |
| GetBoundsRect | 返回到設備上下文當前累計的綁定矩形 |
| GetClipBox | 獲取當前剪切邊界周圍最緊綁定矩形的維數 |
| SelectClipRgn | 使用指定模式合并給定區域和當前剪切區域 |
| ExcludeClipRect | 創建包含現有剪切區域減掉指定矩形的一個新剪切區域 |
| ExcludeUpdateRgn | 通過從剪切區域排除窗口中的更新區域,防止在窗口的無效區域中繪圖 |
| IntersectClipRect | 通過構成當前區域和矩形的交集創建一個新的剪切區域 |
| OffsetClipRgn | 移動給定設備的剪切區域 |
| PtVisible | 確定給定點是否在剪切區域內 |
| RectVisible | 確定給定矩形的任何部分是否在剪切區域內 |
線輸出函數
| GetCurrentPosition | 獲取筆的當前位置(以邏輯坐標表示) |
| MoveTo | 移動當前位置 |
| LineTo | 從當前位置到一點畫直線,但不包括那個點 |
| Arc | 畫一段橢圓弧 |
| ArcTo | 畫一段橢圓弧。除了更新當前位置以外,這個函數與Arc類似 |
| AngleArc | 畫一條線段和圓弧,把當前位置移到圓弧終點 |
| GetArcDirection | 對設備上下文返回當前圓弧方向 |
| SetArcDirection | 設備圓弧和矩形函數要用到的繪圖方向 |
| PolyDraw | 畫一組線段和Bezier樣條。這個函數更新當前位置Polyline畫一組與指定點連接的線段 |
| PolyPolyline | 畫多組相連線段。這個函數不使用也不更新當前位置 |
| PolylineTo | 畫一條或多條直線,并把當前位置移到最后一條直線的終點 |
| PolyBezier | 畫一條或多條Bezier樣條。不使用也不更新當前位置 |
| PolyBezierTo | 畫一條或多條Bezier樣條,并把當前位置移到最后一條Bezier樣條的終點 |
簡單繪圖函數
| FillRect | 用指定畫刷填充給定矩形 |
| FrameRect | 在矩形周圍繪制邊界 |
| InvertRect | 反轉矩形內容 |
| DrawIcon | 繪制圖標 |
| DrawDragRect | 拖拽矩形時擦除并重繪它 |
| FillSolidRect | 用實顏色填充矩形 |
| Draw3Drect | 繪制三維矩形 |
| DrawEdge | 繪制矩形邊 |
| DrawFrameControl | 繪制幀控件 |
| DrawState | 顯示圖像并應用可視化效果來表示一個狀態 |
橢圓和多邊形函數
| Chord | 繪制橢圓弧(橢圓和一條線段相交圍成的閉合圖形) |
| DrawFocusRect | 繪制用于表示焦點的風格的矩形 |
| Ellipse | 繪制橢圓 |
| Pie | 繪制餅形圖 |
| Polygon | 繪制多邊形,包含由線段連接的一個或多個點(頂點) |
| PolyPolygon | 創建使用當前多邊形填充模式的兩個或多個多邊形,多邊形可以相互分開或疊加 |
| Polyline | 繪制多邊形,包含連接指定點的一組線段 |
| Rectangle | 使用當前筆繪制矩形,用當前畫刷填充 |
| RoundRect | 使用當前筆繪制圓角矩形,用當前畫刷填充 |
位圖函數
| PatBlt | 創建位特征 |
| BitBlt | 從指定設備上下文拷貝位圖 |
| StretchBlt | 把位圖由源矩形和設備移動到目標矩形,必要時拉伸或壓縮位圖以適合目標矩形的維數 |
| GetPixel | 獲取指定點像素的RGB顏色值 |
| SetPixel | 設置指定點像素為最接近指定色的近似值 |
| SetPixelV | 設置指定點坐標為最接近指定色的近似值。SetPixelV比SetPixel快,原因是它不用返回實際繪制點的顏色值 |
| FloodFill | 用當前畫刷填充區域 |
| ExtFloodFill | 用當前畫刷填充區域。比FloodFill成員函數提供更多靈活性 |
| MaskBlt | 使用給定屏蔽和光柵操作對源和目標位圖合并顏色數據 |
| PlgBlt | 從源設備上下文的指定矩形到給定設備上下文中指定平行多邊形,執行顏色數據位的位塊傳遞 |
文本函數
| TextOut | 用當前選取字體在指定位置寫字符串 |
| ExtTextOut | 用當前選取字體在矩形區域寫字符串 |
| TabbedTextOut | 在指定位置寫字符串,制表符擴展為制表符停止位置數組中指定值 |
| DrawText | 在指定矩形內繪制格式化文本 |
| GetTextExtent | 使用當前字體在屬性設備上下文上計算文本行的寬度和高度,確定維數 |
| GetOutputTextExtent | 使用當前字體在輸出設備上下文上計算文本行的寬度和高度,確定維數 |
| GetTabbedTextExtent | 使用當前字體在屬性設備上下文上計算字符串的寬度和高度 |
| GetOutputTabbedTextExtent | 使用當前字體在輸出設備上下文上計算字符串的寬度和高度 |
| GrayString | 在給定位置繪制暗(灰色)文本 |
| GetTextAlign | 獲取文本對齊標記 |
| SetTextAlign | 設置文本對齊標記 |
| GetTextFace | 以空終止字符串形式把當前字體字樣名拷貝到緩沖區 |
| GetTextMetrics | 從屬性設備上下文為當前字體獲取度量 |
| GetOutputTextMetrics | 從輸出設備上下文為當前字體獲取度量 |
| SetTextJustification | 把空格添加到字符串的中斷字符 |
| GetTextCharacterExtra | 對字符間空格數量獲取當前設置 |
| SetTextCharacterExtra | 設置字符間空格數量 |
字體函數
| GetFontData | 從比例字體文件獲取字體度量信息。獲取的信息通過指定字體文件與返回信息長度的偏移量標識 |
| GetKerningPairs | 獲取指定設備上下文中當前選取的字體字符實對 |
| GetOutlineTextMetrics | 獲取用于TrueType字體的字體度量信息 |
| GetGlyphOutline | 獲取用于當前字體中外線字符串的外線曲線或位圖 |
| GetCharABCWidths | 從當前字體獲取給定范圍相繼字符以邏輯單位計數的寬度 |
| GetCharWidth | 從當前字體獲取給定范圍相繼字符的分數寬度 |
| GetOutputCharWidth | 從使用輸出設備上下文的當前字體獲取相繼字符組中各個字符的寬度 |
| SetMapperFlags | 改變字體映射表在從邏輯字體到物理字符映射時使用的算法 |
| GetAspectRatioFilter | 獲取當前長寬比過濾器的設置 |
打印機跳離函數
| QueryAbort | 對打印應用調用AbortPro回滾函數,詢問打印是否應終止 |
| Escape | 允許應用訪問不能通過GDI直接使用的特殊設備的功能。同時允許訪問Windows跳離函數。應用調用的Escape調用經翻譯傳送到設備驅動程序 |
| DrawEscape | 訪問通過圖形設備接口(GDI)不能直接使用的視頻顯示器的繪圖功能 |
| StartDoc | 通告設備驅動程序開始一項新打印作業 |
| StartPage | 通告設備驅動程序開始新頁 |
| EndPage | 通告設備驅動程序頁結束 |
| SetAbortProc | 如果打印作業必須終止,設置Windows調用的由程序員提供的回滾函數 |
| AbortDoc | 終止當前打印任務,擦除自上次調用StartDoc成員函數以來應用寫入設備的任何內容 |
| EndDoc | 結束由StartDoc成員函數啟動的打印作業 |
滾動函數
| ScrollDC | 水平和垂直滾動位矩形 |
元文件函數
| PlayMetaFile | 在給定設備上播放指定元文件類型。增強版本的PlayMetaFile顯示以增強格式元文件保存的圖片。元文件可以播放任意次數 |
| AddMetaFileComment | 從緩沖區把注釋拷貝到指定增強格式元文件 |
路徑函數
| AbortPath | 關閉并拒絕設備上下文中任何路徑 |
| BeginPath | 打開設備上下文中一個路徑括號 |
| CloseFigure | 關閉路徑中一個打開的圖表 |
| EndPath | 關閉一個路徑括號,并把括號定義的路徑選擇到設備上下文 |
| FillPath | 關閉當前路徑中任何打開的圖表,并用當前畫刷和多邊形填充模式填充路徑內部 |
| FlattenPath | 變形選取到當前設備上下文路徑中的任何曲線,把曲線變成一系列直線 |
| GetMiterLimit | 返回用于設備上下文的限制 |
| GetPath | 獲取定義直線端點和從選擇到設備上下文路徑中找到的曲線控制點的坐標 |
| SelectClipPath | 對設備上下文選擇當前路徑作為剪切區域,通過使用指定模式合并新區域和任何現有剪切區域 |
| SetMiterLimit | 設備用于設備上下文的連接長度限制 |
| StrokeAndFillPath | 關閉路徑中任何打開的圖表,使用當前筆點路徑外線,使用當前畫刷填充它內部 |
| StrokePath | 使用當前筆描繪指定路徑 |
| WidenPath | 如果路徑使用過了當前選取到設備上下文中的筆點,重新定義當前路徑為要畫的區域 |
?
?????? *?CClientDC子類?
?????? 1. CClientDC類只能在客戶區繪圖;
?????? 2. 所謂客戶區指窗口區域中去掉邊框、標題欄、菜單欄、工具欄、狀態欄等之外的部分,它是用戶可以操作的區域;
?????? 3. 在使用CClientDC進行繪圖時,一般要調用GetClientRect()函數來獲取客戶區域的大小;
?????? 4. CClientDC類在構造函數中調用Windows API函數GetDC(),在析構時響應ReleaseDC();
?????? 5. CClientDC類的窗口句柄保存在成員變量m_hWnd,為構造CClientDC,需將CWnd作為參數傳遞給構造函數。
??????? *?CWindowDC子類?
?????? 1. CWindowDC對象在構造時調用Windows API函數GetWindowDC,在析構時調用相應的API函數ReleaseDC,這意味著CWindowDC對象可訪問CWnd所指向的為整個全屏幕區域;
?????? 2. CWindowDC允許在顯示器的任意位置繪圖。坐標原點在整個窗口的左上角。
?????? 3. 在使用CWindowDC進行繪圖時,一般要調用GetWindowRect函數來獲取整個應用程序窗口區域的大小;
?????? 4. CWindowDC類的窗口句柄保存在成員變量m_hWnd,為構造CClientDC,需將CWnd作為參數傳遞給構造函數。
??????? *?CPaintDC子類?
?????? 1. 通常CPaintDC用來響應WM_PAINT消息。一般應用在OnPaint函數.?
?????? 2. CClientDC也是從CDC派生出來的.構造時自動調用GetDC函數,析構時自動調用ReleaseDC函數.一般應用于客戶區窗口的繪制.
?????? 3. CPaintDC只能在WM_PAINT消息中使用, 用于有重畫消息發出時才使用的內存設備環境, 而CClientDC和客戶區相關,有重畫消息發出時才使用的內存設備環境, 可在任何地方使用.
?????? 4. 在處理窗口重畫時,必須使用CPaintDC,否則WM_PAINT消息無法從消息隊列中清除,將引起不斷的窗口重畫。
? ? ?? *?CMetaFileDC子類?
?????? 1. 在應用程序中,有一些圖像是需要經常重復顯示的.這樣的圖形最好事先繪制好形成一個文件,并存儲在內存中,當用到它時直接打開就可以了,這種圖形文件叫做圖元文件;?
?????? 2. 制作圖元文件需要一個特殊的設備描述環境CMetaFileDC類.它也是由CDC類繼承來的,因此它包含了CDC類的所有繪圖方法。
?????? 3. 一般先在視圖類的OnCreate()函數中創建圖元文件.具體做法為:先定義一個CMetaFileDC類的對象,然后用該對象的Create()函數創建它,該函數的原型為:BOOL Create(LPCTSTR lpszFilename=NULL);
?????? 4. 接下來使用由CDC繼承來的繪圖方法繪制圖元文件,最后使用Close()函數結束繪制并保存該圖元文件到類的數據成員中(該數據成員的類型應為HMETAFILE)。
?????? 5. 當需要顯示該圖元文件時,使用CDC類的成員函數PlayMetaFile()。當不再使用該圖元文件時,要用函數DeleteMetaFile()將其刪除。
總結
- 上一篇: MFC VC 双缓冲绘图基本原理与实现,
- 下一篇: 为什么设计师创造的编程语言更受欢迎?