VC|MFC的CDC類及如何使用畫筆繪制各種圖形(mfc創(chuàng)建畫筆)
CDC對(duì)象提供處理顯示器或打印機(jī)等設(shè)備上下文的成員函數(shù),以及處理與窗口客戶區(qū)對(duì)應(yīng)的顯示上下文的成員。另外還為繪制文本、處理字體,使用打印機(jī)跳轉(zhuǎn),滾動(dòng)和播放元文件提供成員函數(shù)。
它還為獲取和設(shè)置繪圖屬性、映射,處理視點(diǎn)、窗口擴(kuò)展、轉(zhuǎn)換坐標(biāo),處理區(qū)域、剪貼、繪制直線及繪制簡(jiǎn)單橢圓和多邊形等形狀提供了成員函數(shù)。
可以通過CDC對(duì)象的成員函數(shù)進(jìn)行所有的繪圖。
其對(duì)象層次結(jié)構(gòu)如下:
類名 | 說明 |
CPaintDC | 窗口用戶區(qū)的設(shè)備描述環(huán)境,在OnDraw()函數(shù)中來處理WM_PAINT消息 |
CClientDC | 窗口客戶區(qū)的設(shè)備描述環(huán)境,但應(yīng)用在WM_PAINT消息之外的消息處理函數(shù)中 |
CWindowDC | 在整個(gè)窗口內(nèi)(不只是用戶區(qū))繪圖的設(shè)備描述環(huán)境 |
CMetaFileDC | 圖元文件的設(shè)備描述環(huán)境,在創(chuàng)建可以回放的圖像時(shí)使用 |
專門用于在應(yīng)用程序窗口客戶區(qū)繪圖的CPaintDC,是所有CDC子類中最常用的一個(gè)類。為了防止程序設(shè)計(jì)人員誤把繪圖代碼寫到其他位置,MFC規(guī)定,CPaintDC對(duì)象只在CView類的OnDraw( )函數(shù)中有效。并且為了方便和引起程序員注意,MFC AppWizard在自動(dòng)為用戶生成的CVeiw派生類代碼中就生成了如下框架代碼:
OnDraw(CDC *Pdc)
{……..}
其中,函數(shù)的參數(shù)pDC就是指向CPaintDC對(duì)象的指針。
系統(tǒng)每次創(chuàng)建應(yīng)用程序窗口及窗口需要刷新時(shí)就會(huì)產(chǎn)生WM_PAINT消息,系統(tǒng)接收到這個(gè)消息就會(huì)自動(dòng)調(diào)用OnDraw( )函數(shù)。應(yīng)用程序也可以調(diào)用相關(guān)函數(shù)來激活OnDraw( ),所以程序中所有對(duì)窗口客戶區(qū)進(jìn)行繪圖的代碼都應(yīng)該寫在這個(gè)函數(shù)中。
CDC類有很多成員函數(shù),包括繪制點(diǎn)、直線、矩形、橢圓、多邊形、文本以及位圖等的成員函數(shù)。
以下是一個(gè)小實(shí)例:
// Ch9Demo3View.cpp
void CCh9Demo3View::OnDraw(CDC* pDC)
{
CCh9Demo3Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
CPen pen[5];
//創(chuàng)建實(shí)線畫筆
pen[0].CreatePen(PS_SOLID, 5, RGB(255, 0, 0));
//創(chuàng)建虛線畫筆
pen[1].CreatePen(PS_DASH, 1, RGB(0, 255, 0));
//創(chuàng)建點(diǎn)線畫筆
pen[2].CreatePen(PS_DOT, 1, RGB(0, 0, 255));
//創(chuàng)建點(diǎn)劃線畫筆
pen[3].CreatePen(PS_DASHDOT, 1, RGB(0, 255, 255));
// 創(chuàng)建雙點(diǎn)劃線畫筆
pen[4].CreatePen(PS_DASHDOTDOT, 1, RGB(255, 0, 255));
// 保存指向設(shè)備上下文原有畫筆的指針
CPen *pOldPen;
//以實(shí)線畫筆繪制矩形
pOldPen=pDC->SelectObject(&pen[0]);
pDC->Rectangle(10, 10, 110, 110);
pDC->TextOut(10, 115, “Rectangle繪制矩形”);
//使用虛線畫筆和函數(shù)Polyline輸出多段折線
pDC->SelectObject(&pen[1]);//載入畫筆
pDC->Rectangle(180, 10, 330, 110);//繪制矩形
CPoint pts[]={CPoint(190, 20), CPoint(200, 60), CPoint(270, 40), CPoint(210, 80),
CPoint(250, 100), CPoint(300, 30), CPoint(310, 80)};
pDC->Polyline(pts, 7);//繪制多端折線
pDC->TextOut(180, 115, “Polyline繪制多段折線”);
// 使用Pie和Arc輸出餅圖和弧形
pDC->SelectObject(&pen[2]);//載入點(diǎn)線畫筆
pDC->Ellipse(10, 140, 160, 240);
pDC->SelectObject(&pen[3]);//載入點(diǎn)劃線畫筆
pDC->Pie(20, 150, 150, 230, 160, 160, 10, 160);
pDC->SelectObject(&pen[4]);//載入雙點(diǎn)劃線畫筆
pDC->Arc(20, 150, 150, 230, 10, 220, 160, 220);
pDC->TextOut(10, 245, “不同畫筆繪制橢圓、弧形和餅圖”);
//恢復(fù)設(shè)備上下文的原有畫筆
pDC->SelectObject(pOldPen);
//刪除所創(chuàng)建的畫筆資源
for (int i=0; i<5; i )
pen[i].DeleteObject();
}
繪制弧形需要4個(gè)坐標(biāo)點(diǎn),函數(shù)原型如下:
Arc(int x1,int x2, int x3, int x4, int x5, int x6, int x7, int x8)
4個(gè)坐標(biāo)點(diǎn)如下圖所示:
Pie()函數(shù)的參數(shù)與上述Arc()函數(shù)相同。
-End-