上一節(jié)中雞啄米講了文本輸出的知識,本節(jié)的主要內(nèi)容是CDC類及其屏幕繪圖函數(shù)。

       CDC類簡介

       CDC類是一個(gè)設(shè)備上下文類。

       CDC類提供了用來處理顯示器或打印機(jī)等設(shè)備上下文的成員函數(shù),還有處理與窗口客戶區(qū)關(guān)聯(lián)的顯示上下文的成員函數(shù)。使用CDC的成員函數(shù)可以進(jìn)行所有的繪圖操作,包括處理繪圖工具、GDI對象的選擇、顏色和調(diào)色板的處理、獲取和設(shè)置繪圖屬性、映射、窗口范圍、坐標(biāo)轉(zhuǎn)換、剪切以及繪制直線、簡單圖形、橢圓和多邊形等,另外它還為文本輸出、處理字體、使用打印機(jī)跳轉(zhuǎn)和滾動(dòng)等提供了成員函數(shù)。

       如上所述,CDC類幾乎封裝了所有的Windows GDI函數(shù),另外,MFC中還有幾個(gè)由CDC類派生的子類,包括CWindowDC、CPaintDC、CClientDC、CMetaFileDC,它們用來進(jìn)行一些特定的繪圖操作。

       一般我們在使用完CDC對象后要記得刪除它,否則會(huì)有內(nèi)存泄露。很多情況下我們可以調(diào)用CWnd::GetDC()函數(shù)來獲取設(shè)備上下文指針,即CDC指針,這個(gè)時(shí)候記得用完后調(diào)用CWnd::ReleaseDC()函數(shù)釋放設(shè)備上下文。

       CDC類的屏幕繪圖成員函數(shù)

       CDC類有很多成員函數(shù),雞啄米在這里只大概講下比較常用的繪圖函數(shù),包括繪制點(diǎn)、直線、矩形、橢圓、多邊形、文本以及位圖等的成員函數(shù)。

       COLORREF SetPixel(int x,int y,COLORREF crColor);
       COLORREF SetPixel(POINT point,COLORREF crColor);

       上面兩個(gè)成員函數(shù)用來將指定坐標(biāo)點(diǎn)的像素設(shè)置為指定的顏色,這樣就實(shí)現(xiàn)了畫點(diǎn)功能。參數(shù)x為點(diǎn)的邏輯x坐標(biāo);參數(shù)y為點(diǎn)的邏輯y坐標(biāo);參數(shù)crColor為要為點(diǎn)設(shè)置的顏色;參數(shù)point指定點(diǎn)的邏輯x坐標(biāo)和邏輯y坐標(biāo),可以為其傳入POINT結(jié)構(gòu)體變量或者CPoint對象。

       CPoint MoveTo(int x,int y);
       CPoint MoveTo(POINT point);

       將當(dāng)前點(diǎn)移動(dòng)到指定位置。參數(shù)x指定新位置的邏輯x坐標(biāo);參數(shù)y指定新位置的邏輯y坐標(biāo);參數(shù)point指定新位置的邏輯x坐標(biāo)和邏輯y坐標(biāo),可以為其傳入POINT結(jié)構(gòu)體變量或者CPoint對象。

       BOOL LineTo(int x,int y);
       BOOL LineTo(POINT point);

       繪制一條從當(dāng)前點(diǎn)到指定點(diǎn)(不包括指定點(diǎn))的直線。參數(shù)x為指定點(diǎn)的邏輯x坐標(biāo);參數(shù)y為指定點(diǎn)的邏輯y坐標(biāo);參數(shù)point為指定點(diǎn)的邏輯x坐標(biāo)和邏輯y坐標(biāo)。一般我們繪制直線時(shí)就可以先調(diào)用MoveTo函數(shù)移動(dòng)當(dāng)前點(diǎn)到某個(gè)位置,然后調(diào)用LineTo畫直線。

       BOOL Rectangle(int x1,int y1,int x2,int y2);
       BOOL Rectangle(LPCRECT lpRect);

       使用當(dāng)前畫筆繪制矩形。參數(shù)x1指定矩形左上角的x坐標(biāo);參數(shù)y1指定矩形左上角的y坐標(biāo);參數(shù)x2指定矩形右下角的x坐標(biāo);參數(shù)y2指定矩形右下角的y坐標(biāo);以上坐標(biāo)均為邏輯單位。參數(shù)lpRect為矩形對象的指針,可以為其傳入CRect對象或RECT結(jié)構(gòu)體變量的指針。

       BOOL Ellipse(int x1,int y1,int x2,int y2);
       BOOL Ellipse(LPCRECT lpRect);

       繪制橢圓。參數(shù)x1指定橢圓的包圍矩形左上角的x坐標(biāo);參數(shù)y1指定橢圓的包圍矩形左上角的y坐標(biāo);參數(shù)x2指定橢圓的包圍矩形右下角的x坐標(biāo);參數(shù)y2指定橢圓的包圍矩形右下角的y坐標(biāo);以上坐標(biāo)均為邏輯單位。參數(shù)lpRect指定橢圓的包圍矩形,可以傳入CRect對象或RECT結(jié)構(gòu)體變量的指針。

       BOOL Polyline(LPPOINT lpPoints,int nCount);

       由指定的多邊形頂點(diǎn)繪制多邊形。參數(shù)lpPoints為指向一個(gè)POINT結(jié)構(gòu)體變量數(shù)組或CPoint對象數(shù)組的指針,其中的POINT結(jié)構(gòu)體變量或CPoint對象代表了多邊形頂點(diǎn)的坐標(biāo);參數(shù)nCount為數(shù)組中點(diǎn)的個(gè)數(shù),至少為2。

       virtual BOOL TextOut(int x,int y,LPCTSTR lpszString,int nCount);
       BOOL TextOut(int x,int y,const CString& str);

       使用當(dāng)前選擇的字體在指定位置輸出文本。 參數(shù)x指定文本起始點(diǎn)的x坐標(biāo);參數(shù)y指定文本起始點(diǎn)的y坐標(biāo);參數(shù)lpszString為要輸出的文本字符串;參數(shù)nCount指定字符串中的字節(jié)個(gè)數(shù);參數(shù)str為包含要輸出的字符的CString對象。這兩個(gè)函數(shù)在上一節(jié)中其實(shí)已經(jīng)講到了。

       BOOL BitBlt(
              int x,
              int y,
              int nWidth,
              int nHeight,
              CDC* pSrcDC,
              int xSrc,
              int ySrc,
              DWORD dwRop
       );

       從源設(shè)備上下文拷貝一幅位圖到當(dāng)前設(shè)備上下文。參數(shù)x指定目標(biāo)矩形區(qū)域左上角的邏輯x坐標(biāo);參數(shù)y指定目標(biāo)矩形區(qū)域左上角的邏輯y坐標(biāo);參數(shù)nWidth指定目標(biāo)矩形區(qū)域和源位圖的寬度(邏輯單位);參數(shù)nHeight指定目標(biāo)矩形區(qū)域和源位圖的高度(邏輯單位);參數(shù)pSrcDC為指向源設(shè)備上下文的CDC對象的指針,如果dwRop指定了一個(gè)不包含源的光柵操作,那么pSrcDC可以為NULL;參數(shù)xSrc指定源位圖左上角的邏輯x坐標(biāo);參數(shù)ySrc指定源位圖左上角的邏輯y坐標(biāo);參數(shù)dwRop指定要執(zhí)行的光柵操作,光柵操作碼定義了GDI如何將當(dāng)前畫刷顏色、源位圖顏色和目標(biāo)位圖顏色組合形成新的顏色,下面是一些常用的光柵操作碼及含義:

       BLACKNESS:表示使用與物理調(diào)色板的索引0相關(guān)的色彩來填充目標(biāo)矩形區(qū)域,(對缺省的物理調(diào)色板而言,該顏色為黑色)。
       DSTINVERT:表示使目標(biāo)矩形區(qū)域顏色取反。 
       MERGECOPY:表示使用布爾型的AND(與)操作符將源矩形區(qū)域的顏色與特定模式組合一起。
       MERGEPAINT:通過使用布爾型的OR(或)操作符將反向的源矩形區(qū)域的顏色與目標(biāo)矩形區(qū)域的顏色合并。
       NOTSRCCOPY:將源矩形區(qū)域顏色取反,于拷貝到目標(biāo)矩形區(qū)域。
       NOTSRCERASE:使用布爾類型的OR(或)操作符組合源和目標(biāo)矩形區(qū)域的顏色值,然后將合成的顏色取反。
       PATCOPY:將特定的模式拷貝到目標(biāo)位圖上。 
       PATPAINT:通過使用布爾OR(或)操作符將源矩形區(qū)域取反后的顏色值與特定模式的顏色合并。然后使用OR(或)操作符將該操作的結(jié)果與目標(biāo)矩形區(qū)域內(nèi)的顏色合并。
       PATINVERT:通過使用XOR(異或)操作符將源和目標(biāo)矩形區(qū)域內(nèi)的顏色合并。 
       SRCAND:通過使用AND(與)操作符來將源和目標(biāo)矩形區(qū)域內(nèi)的顏色合并。
       SRCCOPY:將源矩形區(qū)域直接拷貝到目標(biāo)矩形區(qū)域。
       SRCERASE:通過使用AND(與)操作符將目標(biāo)矩形區(qū)域顏色取反后與源矩形區(qū)域的顏色值合并。 
       SRCINVERT:通過使用布爾型的XOR(異或)操作符將源和目標(biāo)矩形區(qū)域的顏色合并。
       SRCPAINT:通過使用布爾型的OR(或)操作符將源和目標(biāo)矩形區(qū)域的顏色合并。
       WHITENESS:使用與物理調(diào)色板中索引1有關(guān)的顏色填充目標(biāo)矩形區(qū)域。(對于缺省物理調(diào)色板來說,這個(gè)顏色就是白色)。

       好了,本節(jié)就講到這里了,主要就是大概講了講CDC類,又介紹了CDC類一些常用的繪圖函數(shù)。如果想了解更多的資料可以查閱MSDN。謝謝關(guān)注雞啄米的VS2010/MFC教程。