3 設(shè)置繪圖顏色
1.顏色
Windows中的顏色一般用4個字節(jié)表示(0BGR(整數(shù)) = R G B 0(字節(jié)序) [Intel CPU低位字節(jié)在前]),Win32 API中定義了一個專門表示顏色索引值的變量類型COLORREF:(windef.h)
typedef DWORD COLORREF; // 0x00bbggrr
和一個由紅綠藍(lán)三原色構(gòu)造顏色值的宏RGB:(wingdi.h)
#define RGB(r,g,b) ((COLORREF)(((BYTE)(r)|((WORD)((BYTE)(g))<<8))|(((DWORD)(BYTE)(b))<<16)))
其中,r、g、b為字節(jié)變量,取值范圍為0~255。其函數(shù)說明為:
COLORREF RGB(
BYTE bRed, // red component of color
BYTE bGreen, // green component of color
BYTE bBlue // blue component of color
);
例如:
COLORREF red, gray;
red = RGB(255, 0, 0);
gray = RGB(128, 128,128);
在API中還定義了由COLORREF變量獲取各個顏色分量的宏Get?Value:(wingdi.h)
#define GetRValue(rgb) (LOBYTE(rgb))
#define GetGValue(rgb) (LOBYTE(((WORD)(rgb)) >> 8))
#define GetBValue(rgb) (LOBYTE((rgb)>>16))
其中:
typedef unsigned long ULONG_PTR;
typedef ULONG_PTR DWORD_PTR;
#define LOBYTE(w) ((BYTE)((DWORD_PTR)(w) & 0xff))
它們對應(yīng)的函數(shù)說明為:
BYTE GetRValue(DWORD rgb); // DWORD rgb ~ COLORREF col
BYTE GetGValue(DWORD rgb);
BYTE GetBValue(DWORD rgb);
2.點(diǎn)色(像素)
在Windows中,像素(pixel)的顏色是直接由設(shè)備上下文類CDC的成員函數(shù)SetPixel來設(shè)置的,該函數(shù)的原型為:
COLORREF SetPixel( int x, int y, COLORREF crColor );
COLORREF SetPixel( POINT point, COLORREF crColor );
其中,x與y分別為像素點(diǎn)的橫坐標(biāo)與縱坐標(biāo),crColor為像素的顏色值。例如:
pDC->SetPixel(10, 10, RGB(0, 255, 0));
另外,也可以用CDC的成員函數(shù)
COLORREF GetPixel( int x, int y ) const;
COLORREF GetPixel( POINT point ) const;
來獲得指定點(diǎn)(x, y)或point的顏色。例如:
COLORREF col;
col = pDC->GetPixel(10, 10);
3.線色(筆)
在Windows中,線狀圖必須用筆(pen)來畫,所以線的顏色就由筆色來確定。在MFC中,筆的屬性和功能由CPen類提供(CPen是CGDIObject的派生類)。
筆的創(chuàng)建與使用的步驟為:
<!--[if !supportLists]-->l <!--[endif]-->創(chuàng)建筆對象:創(chuàng)建筆類CPen對象的方法有如下兩種:
<!--[if !supportLists]-->n <!--[endif]-->使用構(gòu)造函數(shù)CPen
CPen( int nPenStyle, int nWidth, COLORREF crColor );
其中:
<!--[if !supportLists]-->u <!--[endif]-->nPenStyle為筆的風(fēng)格,可取值:
PS_SOLID, PS_DASH, PS_DOT, PS_DASHDOT, PSDASHDOTDOT
注意:1~4號筆風(fēng)格只是在筆寬=0或1時有效,筆寬>1時總為實(shí)心的。
<!--[if !supportLists]-->u <!--[endif]-->nWidth為筆寬,與映射模式有關(guān),使用缺省映射時為像素數(shù),若nWidth = 0,則不論什么映射模式,筆寬都為一個像素;
<!--[if !supportLists]-->u <!--[endif]-->crColor為筆的顏色值。
例如
CPen* pGrayPen = new CPen(PS_SOLID, 0, RGB(128, 128, 128));
CPen grayPen(PS_SOLID, 0, RGB(128, 128, 128));
<!--[if !supportLists]-->n <!--[endif]-->使用成員函數(shù)CreatePen
BOOL CreatePen( int nPenStyle, int nWidth, COLORREF crColor );
如:
CPen grayPen;
grayPen.CreatePen(PS_SOLID, 0, RGB(128, 128, 128));
<!--[if !supportLists]-->n <!--[endif]-->缺省的筆為單像素寬的實(shí)心黑色筆
<!--[if !supportLists]-->l <!--[endif]-->將筆對象選入設(shè)備上下文:為了能使用我們所創(chuàng)建的筆對象,必須先將它選入設(shè)備上下文,這可以調(diào)用設(shè)備上下文類CDC的成員函數(shù)SelectObject來完成:
CPen* SelectObject( CPen* pPen );
返回值為指向原來筆對象的指針(一般將其保存下來,供下次再裝入時使用)。如
pOldPen = pDC->SelectObject(&pen);
另外,Windows中有一些預(yù)定義的筆對象,可用CDC的另一成員函數(shù)SelectStockObject將其選入DC,其函數(shù)原型為:
virtual CGdiObject* SelectStockObject( int nIndex );
預(yù)定義的筆對象有BLACK_PEN(黑色筆)、WHITE_PEN (白色筆)、NULL_PEN(空筆/無色筆)。例如:
pDC->SelectStockObject(BLACK_PEN);
<!--[if !supportLists]-->l <!--[endif]-->使用設(shè)備上下文畫線狀圖:畫線狀圖以及面狀圖的邊線,所使用的是當(dāng)前設(shè)備上下文中的筆對象。線狀圖有直線、折線、矩形、(橢)圓(弧)等,詳見4)(2)
<!--[if !supportLists]-->l <!--[endif]-->將筆對象從設(shè)備上下文中放出:為了能刪除使用過的筆對象,必須先將它從設(shè)備上下文中釋放出來后,然后才能刪除。釋放的方法是裝入其他的筆對象(一般是重新裝入原來的筆對象)。例如
pDC->SelectObject(pOldPen);
<!--[if !supportLists]-->l <!--[endif]-->刪除筆對象:為了能刪除筆對象,必須先將其從設(shè)備上下文中釋放。刪除方法有如下幾種:
<!--[if !supportLists]-->n <!--[endif]-->調(diào)用筆類CDC的成員函數(shù)DeleteObject刪除筆的當(dāng)前內(nèi)容(但是未刪除筆對象,以后可再用成員函數(shù)CreatePen在筆對象中繼續(xù)創(chuàng)建新的筆內(nèi)容)。如
pen.DeleteObject();
<!--[if !supportLists]-->n <!--[endif]-->使用刪除運(yùn)算符delete將筆對象徹底刪除,如delete pen;
<!--[if !supportLists]-->n <!--[endif]-->自動刪除:若筆對象為局部變量,則在離開其作用域時,會被系統(tǒng)自動刪除
下面為一段較完整地創(chuàng)建與使用筆的例子代碼:
CPen pen, *pOldPen;
for (int j = 0; j <= 255; j++) {
HSLtoRGB(m_hue, m_sat, 255 - j, r, g, b); // 自定義的函數(shù)
pen.CreatePen(PS_SOLID, 0, RGB(r, g, b));
pOldPen = pDC->SelectObject(&pen);
pDC->MoveTo(0, j); pDC->LineTo(40, j);
pDC->SelectObject(pOldPen);
pen.DeleteObject();
}
4.面色(刷)
在Windows中,面狀圖必須用刷(brush)來填充,所以面色是由刷色來確定的。MFC中的刷類為CBrush(它也是CGDIObject的派生類),刷的創(chuàng)建與使用的步驟與筆的相似。
<!--[if !supportLists]-->l <!--[endif]-->構(gòu)造函數(shù)有4個:
<!--[if !supportLists]-->n <!--[endif]-->CBrush( ); // 創(chuàng)建一個刷的空對象
<!--[if !supportLists]-->n <!--[endif]-->CBrush( COLORREF crColor ); // 創(chuàng)建顏色為crColor的實(shí)心刷
<!--[if !supportLists]-->n <!--[endif]-->CBrush( int nIndex, COLORREF crColor ); // 創(chuàng)建風(fēng)格由nIndex指定且顏色為crColor的條紋(hatch孵化)刷,其中nIndex可取條紋風(fēng)格(Hatch Styles)值:
符號常量 數(shù)字常量 風(fēng)格
HS_HORIZONTAL 0 水平線
HS_VERTICAL 1 垂直線
HS_FDIAGONAL 2 正斜線
HS_BDIAGONAL 3 反斜線
HS_CROSS 4 十字線(正網(wǎng)格)
HS_DIAGCROSS 5 斜十字線(斜網(wǎng)格)
<!--[if !supportLists]-->n <!--[endif]-->CBrush( CBitmap* pBitmap ); // 創(chuàng)建位圖為pBitmap的圖案刷
如:pDC->FillRect( &rect, new CBrush( RGB(r, g, b) ) );
<!--[if !supportLists]-->l <!--[endif]-->與構(gòu)造函數(shù)相對應(yīng),有多個創(chuàng)建不同類型刷的成員函數(shù):
<!--[if !supportLists]-->n <!--[endif]-->BOOL CreateSolidBrush( COLORREF crColor );
<!--[if !supportLists]-->n <!--[endif]-->BOOL CreateHatchBrush( int nIndex, COLORREF crColor );
<!--[if !supportLists]-->n <!--[endif]-->BOOL CreatePatternBrush( CBitmap* pBitmap );
<!--[if !supportLists]-->n <!--[endif]-->BOOL CreateDIBPatternBrush( HGLOBAL hPackedDIB, UINT nUsage );
<!--[if !supportLists]-->n <!--[endif]-->BOOL CreateDIBPatternBrush( const void* lpPackedDIB, UINT nUsage );
<!--[if !supportLists]-->n <!--[endif]-->BOOL CreateBrushIndirect( const LOGBRUSH* lpLogBrush );
<!--[if !supportLists]-->n <!--[endif]-->BOOL CreateSysColorBrush( int nIndex );
<!--[if !supportLists]-->l <!--[endif]-->預(yù)定義的刷對象有BLACK_BRUSH(黑刷)、DKGRAY_BRUSH(暗灰刷)、GRAY_BRUSH(灰刷)、HOLLOW_BRUSH(空刷)、LTGRAY_BRUSH(亮灰刷)、NULL_BRUSH(空刷)、WHITE_BRUSH(白刷)
<!--[if !supportLists]-->l <!--[endif]-->缺省的刷為空刷
<!--[if !supportLists]-->l <!--[endif]-->與筆一樣,可以用函數(shù)SelectObject或SelectStockObject將自定義的刷或預(yù)定義的刷選入DC中,供繪面狀圖時使用。
5.文本色
可使用CDC類的成員函數(shù)SetTextColor和SetBkColor來分別設(shè)置輸出文本的前景色和背景色:(缺省的前景色為黑色,背景色空)
COLORREF GetTextColor( ) const;
virtual COLORREF SetTextColor( COLORREF crColor );
COLORREF GetBkColor( ) const;
virtual COLORREF SetBkColor( COLORREF crColor );
例如:
pDC->TextOut(10, 10, "Test text");
pDC->SetTextColor(RGB(0, 128, 0)); pDC->TextOut(10, 30, "Test text");
pDC->SetBkColor(RGB(0, 0, 128)); pDC->TextOut(10, 50, "Test text");
6.繪圖工具
1)GDI對象
Windows的圖形設(shè)備接口(GDI = graphics device interface)對象指各種繪圖工具,如筆、刷、位圖、字體、調(diào)色板、區(qū)域等,對應(yīng)的MFC類為CPen、CBrush、CBitmap、CFont等。這些圖形繪制對象類都是CGDIObject的派生類,而CGDIObject則是直接從CObject類派生的抽象基類。<!--[endif]-->其中,Windws CE不支持調(diào)色板類CPalette;CRgn為區(qū)域類,對應(yīng)于窗口中的一個矩形、多邊形或(橢)圓區(qū)域(region),可用于移動、拷貝、合并、判斷和裁剪。
2)選入
可用設(shè)備上下文類CDC的多態(tài)成員函數(shù)SelectObject,來將繪圖工具對象選入設(shè)備上下文,以供繪圖時使用:
CPen* SelectObject( CPen* pPen );
CBrush* SelectObject( CBrush* pBrush );
virtual CFont* SelectObject( CFont* pFont );
CBitmap* SelectObject( CBitmap* pBitmap );
int SelectObject( CRgn* pRgn );
CGdiObject* SelectObject( CGdiObject* pObject );
3)獲取
可用API函數(shù)GetCurrentObject來獲得當(dāng)前在DC中的指定類型的繪圖對象:
HGDIOBJ GetCurrentObject(
HDC hdc, // handle to device context
UINT uObjectType // specifies the object-type
);
其中,參數(shù)uObjectType可取值:
OBJ_PEN // Returns the current selected pen.
OBJ_BRUSH // Returns the current selected brush.
OBJ_PAL // Returns the current selected palette.
OBJ_FONT // Returns the current selected font.
OBJ_BITMAP // Returns the current selected bitmap.
也可分別調(diào)用CDC類的下列成員函數(shù)來做同樣的事:
CPen* GetCurrentPen( ) const;
CBrush* GetCurrentBrush( ) const;
CFont* GetCurrentFont( ) const;
CBitmap* GetCurrentBitmap( ) const;
CPalette* GetCurrentPalette( ) const;
如:
HPEN hPen = (HPEN)GetCurrentObject(pDC->m_hDC, OBJ_PEN);
CPen* pPen = CPen::FromHandle(hPen);
等價于:
CPen* pPen = pDC-> GetCurrentPen( );
4 畫圖
在Windows中,繪圖一般在視圖窗口的客戶區(qū)進(jìn)行,使用的是設(shè)備上下文類CDC中各種繪圖函數(shù)。
1. 映射模式與坐標(biāo)系
1)默認(rèn)映射模式
映射模式(map mode)影響所有的圖形和文本繪制函數(shù),它定義(將邏輯單位轉(zhuǎn)換為設(shè)備單位所使用的)度量單位和坐標(biāo)方向,Windows總是用邏輯單位來繪圖。
缺省情況下,繪圖的默認(rèn)映射模式為MM_TEXT,其繪圖單位為像素(只要不打印輸出,屏幕繪圖使用該模式就夠了)。若窗口客戶區(qū)的寬和高分別為w和h像素,則其x坐標(biāo)是從左到右,范圍為0 ~ w-1;y坐標(biāo)是從上到下,范圍為0 ~ h-1。
2)設(shè)置映射模式
可以使用CDC類的成員函數(shù)GetMapMode和SetMapMode來獲得和設(shè)置當(dāng)前的映射模式:
int GetMapMode( ) const; // 返回當(dāng)前的映射模式
virtual int SetMapMode( int nMapMode ); // 返回先前的映射模式
映射模式的nMapMode取值與含義
符號常量 數(shù)字常量 x方向 y方向 邏輯單位的大小
MM_TEXT 1 向右 向下 像素
MM_LOMETRIC 2 向右 向上 0.1 mm
MM_HIMETRIC 3 向右 向上 0.01 mm
MM_LOENGLISH 4 向右 向上 0.01 in
MM_HIENGLISH 5 向右 向上 0.001 in
MM_TWIPS 6 向右 向上 1/1440 in
MM_ISOTROPIC 7 自定義 自定義 自定義
MM_ANISOTROPIC 8 自定義 自定義 自定義
可見,除了兩種自定義映射模式外,x方向都是向右,y方向也只有MM_TEXT的向下,其余的都是向上,與數(shù)學(xué)上一致。除了MM_ANISOTROPIC外,其他所有映射模式的x與y方向的單位都是相同的。所有映射模式的邏輯坐標(biāo)的原點(diǎn)(0, 0)最初都是在窗口的左上角,但在CScrollView的派生類中,MFC會隨用戶滾動文檔而自動調(diào)整邏輯原點(diǎn)的相對位置(改變視點(diǎn)的原點(diǎn)屬性)。
3)自定義映射模式
自定義映射模式MM_ISOTROPIC(各向同性,x與y方向的單位必須相同)和MM_ANISOTROPIC(各向異性,x與y方向的單位可以不同)的單位和方向,可以通過用CDC類的成員函數(shù)G/SetWindowExt和G/SetViewportExt來獲取/設(shè)置窗口和視口的大小來確定:
CSize GetWindowExt( ) const;
virtual CSize SetWindowExt( int cx, int cy );
virtual CSize SetWindowExt( SIZE size );
CSize GetViewportExt( ) const;
virtual CSize SetViewportExt( int cx, int cy );
virtual CSize SetViewportExt( SIZE size );
其中,cx或size.cx和cy或size.cy分別為窗口/視口的寬度與高度(邏輯單位)。
還可以用CDC類的成員函數(shù)SetViewportOrg來設(shè)置坐標(biāo)原點(diǎn)的位置:
virtual CPoint SetViewportOrg( int x, int y );
CPoint SetViewportOrg( POINT point );
例如
void CDrawView::On
CRect rect;
GetClientRect(rect);
pDC->SetMapMode(MM_ANISOTROPIC);
pDC->SetWindowExt(1000,1000);
pDC->SetViewportExt(rect.right, -rect.bottom);
pDC->SetViewportOrg(rect.right / 2, rect.bottom /2);
pDC->Ellipse(CRect(-500, -500, 500, 500));
}
將當(dāng)前的映射模式設(shè)置為各向異性自定義映射模式,窗口大小為1000個邏輯單位寬和1000個邏輯單位高,視口大小同當(dāng)前客戶區(qū),視口的坐標(biāo)原點(diǎn)設(shè)置在當(dāng)前客戶區(qū)的中央。由于使用了負(fù)數(shù)作為SetViewportExt函數(shù)的第2個參數(shù),所以y軸方向是向上的。
可見,圓被畫成了橢圓,x與y方向上的邏輯單位不相同。
4)單位轉(zhuǎn)換
對所有非MM_TEXT映射模式,有如下重要規(guī)則:
<!--[if !supportLists]-->l <!--[endif]-->CDC的成員函數(shù)(如各種繪圖函數(shù))具有邏輯坐標(biāo)參數(shù)
<!--[if !supportLists]-->l <!--[endif]-->CWnd的成員函數(shù)(如各種響應(yīng)函數(shù))具有設(shè)備坐標(biāo)參數(shù)(如鼠標(biāo)位置point)
<!--[if !supportLists]-->l <!--[endif]-->位置的測試操作(如CRect的PtInRect函數(shù))只有使用設(shè)備坐標(biāo)時才有效
<!--[if !supportLists]-->l <!--[endif]-->長期使用的值應(yīng)該用邏輯坐標(biāo)保存(如窗口滾動后保存的設(shè)備坐標(biāo)就無效了)
因此,為了使應(yīng)用程序能夠正確工作,除MM_TEXT映射模式外,其他映射模式都需要進(jìn)行單位轉(zhuǎn)換。下面是邏輯單位到設(shè)備單位(如像素)的轉(zhuǎn)換公式:
x比例因子 = 視口寬度 / 窗口寬度
y比例因子 = 視口高度 / 窗口高度
設(shè)備x = 邏輯x * x比例因子 + x原點(diǎn)偏移量
設(shè)備y = 邏輯y * y比例因子 + y原點(diǎn)偏移量
Windows的GDI負(fù)責(zé)邏輯坐標(biāo)和設(shè)備坐標(biāo)之間的轉(zhuǎn)換,這可以調(diào)用CDC類的成員函數(shù)LPtoDP和DPtoLP來進(jìn)行:
void LPtoDP( LPPOINT lpPoints, int nCount = 1 ) const;
void LPtoDP( LPRECT lpRect ) const;
void LPtoDP( LPSIZE lpSize ) const;
void DPtoLP( LPPOINT lpPoints, int nCount = 1 ) const;
void DPtoLP( LPRECT lpRect ) const;
void DPtoLP( LPSIZE lpSize ) const;
例如:
void CDrawView::On
CRect rect = m_rect; // 邏輯坐標(biāo)
CClientDC dc(this);
dc.SetMapMode(MM_LOENGLISH);
dc.LPtoDP(rect); // 轉(zhuǎn)化成設(shè)備坐標(biāo)
if (rect.PtInRect(point)) // 位置的測試操作只有使用設(shè)備坐標(biāo)時才有效
......
}
void CDrawView:: On
float t,y;
char buf[40];
CDC* pDC = GetDC();
pDC->SetMapMode(MM_HIMETRIC);
pDC->DPtoLP(&point); // 轉(zhuǎn)化成邏輯坐標(biāo)
t = t1 + (point.x * dt) / w; sprintf(buf, "%.4fs", t); pSB->SetPaneText(xV, buf);
y = (y0 - point.y) / dy; sprintf(buf, "%.4f", y); pSB->SetPaneText(yV, buf);
......
}
2. 畫像素點(diǎn)
畫像素點(diǎn)就是設(shè)置像素點(diǎn)的顏色,從前面3)(2)已知道這可由CDC的成員函數(shù)SetPixel來做,該函數(shù)的原型為:
COLORREF SetPixel( int x, int y, COLORREF crColor ); 或
COLORREF SetPixel( POINT point, COLORREF crColor );
其中,x與y分別為像素點(diǎn)的橫坐標(biāo)與縱坐標(biāo),crColor為像素的顏色值。例如
pDC->SetPixel(i, j, RGB(r, g, b));
3.畫線狀圖
在Windows中,線狀圖必須用筆來畫(筆的創(chuàng)建與使用見前面的3)(3)),下面是CDC類中可以繪制線狀圖的常用成員函數(shù):
<!--[if !supportLists]-->l <!--[endif]-->當(dāng)前位置:設(shè)置當(dāng)前位置為(x, y)或point:(返回值為原當(dāng)前位置的坐標(biāo))
CPoint MoveTo( int x, int y ); 或 CPoint MoveTo( POINT point );
<!--[if !supportLists]-->l <!--[endif]-->畫線:使用DC中的筆從當(dāng)前位置畫線到點(diǎn)(x, y)或point:(若成功返回非0值):
BOOL LineTo( int x, int y ); 或BOOL LineTo( POINT point );
<!--[if !supportLists]-->l <!--[endif]-->畫折線:使用DC中的筆,依次將點(diǎn)數(shù)組lpPoints中的nCount(≥2)個點(diǎn)連接起來,形成一條折線:
BOOL Polyline( LPPOINT lpPoints, int nCount );
<!--[if !supportLists]-->l <!--[endif]-->畫多邊形:似畫折線,但還會將最后的點(diǎn)與第一個點(diǎn)相連形成多邊形,并用DC中的刷填充其內(nèi)部區(qū)域:
BOOL Polygon( LPPOINT lpPoints, int nCount );
<!--[if !supportLists]-->l <!--[endif]-->畫矩形:使用DC中的筆畫左上角為(x1, y1)、右下角為(x2, y2)或范圍為*lpRect的矩形的邊線,并用DC中的刷填充其內(nèi)部區(qū)域:
BOOL Rectangle( int x1, int y1, int x2, int y2 ); 或
BOOL Rectangle( LPCRECT lpRect );
有時需要根據(jù)用戶給定的兩個任意點(diǎn)來重新構(gòu)造左上角和右下角的點(diǎn),例如:
rect = CRect(min(p0.x, point.x), min(p0.y, point.y), max(p0.x, point.x), max(p0.y, point.y));
<!--[if !supportLists]-->l <!--[endif]-->畫圓角矩形:使用DC中的筆畫左上角為(x1, y1)、右下角為(x2, y2)或范圍為*lpRect的矩形的邊線,并用寬x3或point.x高y3或point.y矩形的內(nèi)接橢圓倒角,再用DC中的刷填充其內(nèi)部區(qū)域:
BOOL RoundRect( int x1, int y1, int x2, int y2, int x3, int y3 );
BOOL RoundRect( LPCRECT lpRect, POINT point );
例如:
int d = min(rect.Width(), rect.Height()) / 4;
pDC-> RoundRect(rect, CPoint(d, d));
<!--[if !supportLists]-->l <!--[endif]-->畫(橢)圓:使用DC中的筆在左上角為(x1, y1)、右下角為(x2, y2)或范圍為*lpRect的矩形中畫內(nèi)接(橢)圓的邊線,并用DC中的刷填充其內(nèi)部區(qū)域:
BOOL Ellipse( int x1, int y1, int x2, int y2 );
BOOL Ellipse( LPCRECT lpRect );
注意,CDC中沒有畫圓的專用函數(shù)。在這里,圓是作為橢圓的(寬高相等)特例來畫的。
<!--[if !supportLists]-->l <!--[endif]-->畫弧:(x1, y1)與(x2, y2)或lpRect的含義同畫(橢)圓,(x3, y3)或ptStart為弧的起點(diǎn),(x4, y4)或ptEnd為弧的終點(diǎn):(逆時針方向旋轉(zhuǎn))
BOOL Arc( int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4 );
BOOL Arc( LPCRECT lpRect, POINT ptStart, POINT ptEnd );
BOOL ArcTo(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4);
BOOL ArcTo(LPCRECT lpRect, POINT ptStart, POINT ptEnd);
畫圓?。海ㄆ渲?x, y)為圓心、nRadius為半徑、fStartAngle為起始角、fSweepAngle為弧段跨角)
BOOL AngleArc(int x, int y, int nRadius, float fStartAngle, float fSweepAngle);
<!--[if !supportLists]-->l <!--[endif]-->畫弓弦:參數(shù)的含義同上,只是用一根弦連接弧的起點(diǎn)和終點(diǎn),形成一個弓形,并用DC中的刷填充其內(nèi)部區(qū)域:
BOOL Chord( int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4 );
BOOL Chord( LPCRECT lpRect, POINT ptStart, POINT ptEnd );
4.畫填充圖
在Windows中,面狀圖必須用刷來填充(刷的創(chuàng)建與使用見前面的3)(4))。上面(2)中的Polygon、Rectangle、Ellipse和Chord等畫閉合線狀圖的函數(shù),只要DC中的刷不是空刷,都可以用來畫對應(yīng)的面狀圖(邊線用當(dāng)前筆畫,內(nèi)部用當(dāng)前刷填充)。下面介紹的是CDC類中只能繪制面狀圖的其他常用成員函數(shù):
<!--[if !supportLists]-->l <!--[endif]-->畫填充矩形:用指定的刷pBrush畫一個以lpRect為區(qū)域的填充矩形,無邊線,填充區(qū)域包括矩形的左邊界和上邊界,但不包括矩形的右邊界和下邊界:
void FillRect( LPCRECT lpRect, CBrush* pBrush );
<!--[if !supportLists]-->l <!--[endif]-->畫單色填充矩形:似FillRect,但只能填充單色,不能填充條紋和圖案:
void FillSolidRect( LPCRECT lpRect, COLORREF clr );
void FillSolidRect( int x, int y, int cx, int cy, COLORREF clr );
<!--[if !supportLists]-->l <!--[endif]-->畫餅圖(扇形):參數(shù)含義同Arc,但將起點(diǎn)和終點(diǎn)都與外接矩形的中心相連接,形成一個扇形區(qū)域,用DC中的刷填充整個扇形區(qū)域,無另外的邊線:
BOOL Pie( int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4 );
BOOL Pie( LPCRECT lpRect, POINT ptStart, POINT ptEnd );
<!--[if !supportLists]-->l <!--[endif]-->畫拖動的矩形:先擦除線寬為sizeLast、填充刷為pBrushLast的原矩形lpRectLast,然后再以線寬為size、填充刷為pBrush畫新矩形lpRectLast。矩形的邊框用灰色的點(diǎn)虛線畫,缺省的填充刷為空刷:
void DrawDragRect( LPCRECT lpRect, SIZE size, LPCRECT lpRectLast,
SIZE sizeLast, CBrush* pBrush = NULL, CBrush* pBrushLast = NULL );
如:pDC->DrawDragRect(rect, size, rect0, size);
<!--[if !supportLists]-->l <!--[endif]-->填充區(qū)域:
<!--[if !supportLists]-->n <!--[endif]-->用當(dāng)前刷從點(diǎn)(x, y)開始向四周填充到顏色為crColor的邊界:
BOOL FloodFill(int x, int y, COLORREF crColor); // 成功返回非0
<!--[if !supportLists]-->n <!--[endif]-->用當(dāng)前刷從點(diǎn)(x, y)開始向四周填充:
BOOL ExtFloodFill(int x, int y, COLORREF crColor,
UINT nFillType); // 成功返回非0
<!--[if !supportLists]-->u <!--[endif]-->nFillType = FLOODFILLBORDER:填充到顏色為crColor的邊界(同F(xiàn)loodFill);(用于填充內(nèi)部顏色不同但邊界顏色相同的區(qū)域)
<!--[if !supportLists]-->u <!--[endif]-->nFillType = FLOODFILLSURFACE:填充所有顏色為crColor的點(diǎn),直到碰到非crColor顏色的點(diǎn)為止。(點(diǎn)(x, y)的顏色也必須為crColor),(用于填充內(nèi)部顏色相同但邊界顏色可以不同的區(qū)域)。例如:
pDC->ExtFloodFill(point.x, point.y, pDC->GetPixel(point), FLOODFILLSURFACE);