MFC筆記 - GDI繪圖和CDC類

學習MFC過程中從書中提煉出來的表格,方便使用。設備描述表屬性、GDI畫筆和CPen類、GDI畫刷和CBrush類、主要的GDI顏色、CDC文本函數、GDI文本對齊方式、常用設備對象。

設備描述表屬性

當使用CDC輸出函數在屏幕畫圖時,輸出的某些特性並沒有在函數調用過程中規定,但可以通過設備描述表自身獲得。如果想忽略背景顏色,可將背景模式設置爲“transparent”。

Attribute            Default                                 Set with                                          Get with

文本顏色   Black                                     CDC::SetTextColor                         CDC::GetTextColor

背景顏色   White                                     CDC::SetBkColor                           CDC::GetBkColor

背景模式   OPAQUE                              CDC::SetBkMode                          CDC::GetBkMode

映射模式   MM_TEXT                          CDC::SetMapMode                       CDC::GetMapMode

繪圖模式   R2_COPYPEN                      CDC::SetROP2                              CDC::GetROP2

當前位置   (0,0)                                       CDC::MoveTo                               CDC::GetCurrentPosition

當前畫筆   BLACK_PEN                       CDC::SelectObject                          CDC::SelectObject

當前畫刷   WHITE_BRUSH                  CDC::SelectObject                          CDC::SelectObject      

當前字體   SYSTEM_FONT                  CDC::SelectObject                          CDC::SelectObject      

 『   不同的CDC函數以不同方式使用設備描述表的屬性。例如,LineTo畫線時,當前畫筆決定線的顏色、寬度和樣式。用Rectangle函數畫矩形時,GDI用當前畫筆畫矩形邊界,並用當前畫筆填充矩形區域。所有文本輸出函數都採用當前字體。文本輸出時,文本顏色決定了字符顏色,而背景顏色決定字符後面的填充色。在使用LineTo函數畫虛線或點時,背景顏色還用於填充線段間空隙。

     可用SelectObject選入設備描述表的6個對象:1、畫筆(Pen) 2、畫刷(Brush) 3、字體(Font) 4、位圖(Bitmap) 5、調色板(Palette) 6、區域(Region)。

     每逢OnPaint被調用時都要將所需要的畫筆和畫刷選入設備描述表。如果不想反覆對它進行初始化設定,可以用CDC::SaveDC函數保存狀態,並在下次使用時用CDC::ResrotreDC將它回覆。另一種方法是,註冊一個自定義的WNDCLASS,其中包含CS_OWNDC樣式。』

GDI畫筆和CPen類

CPen *OldPen = dc.SelectObject(&pen);

如果要改變畫線方式,則需要創建一個GDI畫筆,並由SelectObject將它選入設備描述表。

畫筆樣式                                               描述

PS_SOLID                                              實線

PS_DASH                                               破折虛線

PS_DOT                                                 點虛線

PS_DASHDOT                                      破折-點虛線

PS_DASHDOTDOT                             破折-點-點虛線

PS_NULL                                               空畫筆

PS_INSIDEFRAME                              框內實線*

『   創建畫筆最簡單的方法就是構造一個CPen對象並把參數都傳送給該對象:

     CPen pen(int nPenStyle, int nWidth, COLORREF crColor);

     創建GDI畫筆第二種方法就是調用CPen::CreatePen。還有一種方法時向LOGPEN結構中填充苗粟畫筆特性的參數,然後調用CPen::CreatePenIndirect生成畫筆。』

GDI畫刷和CBrush類

CBrush *OldBrush = dc.SelectObject(&brush);

畫刷有三種基本樣式:單色,帶陰影和帶圖案。當用陰影線畫刷時,Windows用默認背景色(白色)填充陰影線空白處,用CDC::SetBkColor改變背景色,或用CDC::SetBkMode把背景模式OPAQUE改爲TRANSPARENT禁止背景填充。

陰影樣式                                       樣式

HS_BDIAGONAL                         向後對角線

HS_CROSS                                     十字網格

HS_DIAGCROSS                           斜十字網格

HS_FDIAGONAL                         向前對角線

HS_HORIZONTAL                       水平線

HS_VERTICAL                              豎直線

『   創建畫刷有兩種方式,使用構造函數或Create函數。

     構造函數:CBrush(COLORREF crColor);

     CBrush(int nIndex, COLORREF crColor);

     CBrush(Cbitmap *pBitmap)。

     Create函數:CBrush::CreateSolidBrush(COLORREF crColor);

     CBrush::CreateHatchBrush(int nIndex, COLORREF crColor);』

主要的GDI顏色

顏色           R                G                B                                  顏色           R                G                B

黑               0                 0                 0                                   淺灰           192             192             192

藍               0                 0                 192                               亮藍           0                 0                 255

綠               0                 192             0                                   亮綠           0                 255             0

青               0                 192             192                               亮青           0                 255             255

紅               192             0                 0                                   亮紅           255             0                 0

品紅           192             0                 192                               亮品紅       255             0                 255

黃               192             192             0                                   亮黃           255             255             0

深灰           128             128             128                               白               255             255             255

CDC文本函數

函數                             說明

DrawText                      在式化矩形中顯示文本

TextOut                         在當前或指定位置輸出一行文本

TabbedTextOut             輸出一行含有製表符的文本

ExTextOut                     輸出一行文本,並有選擇地給矩形填充背景顏色或改變字符間距

GetTextExtent               計算當前字體下一個字符串寬度

GetTabbedTextExtent    計算當前字體下含有製表符字符串地寬度

GetTextMetrics             返回當前字體度量(字符高度、字符平均寬度等)

SetTextAlign                  給TextOut和其他輸出函數設定對齊參數

SetTextJustification       確定對齊一串文本時需要增加的寬度

SetTextColor                 設定設備描述表的文本輸出顏色

SetBkColor                    設定設備描述表的背景顏色,即確定輸出字符背後的填充色


GDI文本對齊方式

UINT CDC::SetTextAlign(UINT nFlags);

默認方式下,傳遞給TextOut等函數的座標值都確定了文本最左上角的位置。函數SetTextAlign指定了點和文本外矩形的對齊方式。設置TA_UPDATECP後,TextOut忽略參數座標而使用DC當前位置。

對齊方式                                       樣式

TA_CENTER                                  矩形水平方向中點對齊到點

TA_LEFT                                        矩形左邊界對齊到點(默認)

TA_RIGHT                                     矩形右邊界對齊到點

TA_BASELINE                               字體基線對齊到點

TA_BOTTOM                                矩形下邊界對齊到點

TA_TOP                                          矩形上邊界對齊到點(默認)

TA_NOUPDATECP                       輸出文本後不更新當前位置(默認)

TA_UPDATECP                             輸出文本後更新當前X位置至文本右邊界處

 

 

常用設備對象

Window預先定義了一些畫筆、畫刷等GDI對象。用CDC::SelectStockObject將這些備用對象選入設備描述表,或用CgdiObject::CreateStockObject將它們賦給已有的CPen、CBrush等對象。CgdiObject表示GDI對象的一個基本類。

設備對象                                      說明

NULL_PEN                                   不畫任何東西的畫筆

BLACK_PEN                                畫一個象素寬實現的黑筆

WHITE_PEN                                 畫一個象素寬的白筆

NULL_BRUSH                              不畫任何東西的畫刷

HOLLOW_BRUSH                       不畫任何東西的畫刷(同NULL_BRUSH)

BLACK_BRUSH                           黑色畫刷

DKGRAY_BRUSH                       深灰色畫刷

GRAY_BRUSH                             中性灰色畫刷

LTGRAY_BRUSH                        淺灰色畫刷

WHITE_BRUSH                           白色畫刷

ANSI_FIXED_FONT                   固定間距的ANSI字體

ANSI_VAR_FONT                       變間距的ANSI字體

SYSTEM_FONT                           變間距系統字體

SYSTEM_FIXED_FONT             固定間距系統字體

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