畫刷類CBrush
利用畫筆可以畫圖形的邊框,而用畫刷就可以在圖形內(nèi)著色。大多數(shù)的GDI繪圖函數(shù)既使用畫筆又使用畫刷,它們用畫筆繪制各種圖形的周邊,而用畫刷填充圖形,因而可以用一種顏色和風格去設置畫筆,而用另一種顏色和風格去設定畫刷,通過一次函數(shù)調用就可以繪制出形狀復雜的圖形。
畫刷是由CBrush類管理的,創(chuàng)建畫刷有兩種方法:一種是調用構造函數(shù),另一種是調用相關的成員函數(shù)。
1.CBrush的構造函數(shù)
CBrush類的結構函數(shù)定義如下:
① CBrush( );
② CBrush( COLORREF crColor );
throw( CResourceException );
③ CBrush( int nIndex, COLORREF crColor );
throw( CResourceException );
④ CBrush( CBitmap* pBitmap );
throw( CResourceException );
參數(shù)說明:
crColor:設定畫筆顏色。
NIndex:如果畫刷是帶花紋的,則該參數(shù)設定畫刷的花紋類型,其取值如下:
l HS_BDIAGONAL:為左高右低的45度斜花紋。
l HS_CROSS:為由水平線和垂直線構成的方格花紋。
l HS_DIAGCROSS:為斜45度方格花紋。
l HS_FIDAGONAL:為右高左低的45度斜花紋。
l HS_HORIZONTAL:為水平線花紋。
l HS_VERTICAL:為垂直線花紋。
PBitmap:為CBitmap類的指針,用于指定填充時所使用的位圖。
2.CBrush提供的創(chuàng)建畫筆的成員函數(shù)
除了構造函數(shù),CBrush還提供了6個創(chuàng)建畫刷的成員函數(shù):
BOOL CreateSolidBrush( COLORREF crColor )
該函數(shù)創(chuàng)建一個實填充的畫刷。crColor為填充色。
BOOL CreateHatchBrush( int nIndex, COLORREF crColor )
該函數(shù)創(chuàng)建一個帶花紋的畫刷,nIndex為花紋類型,crColor為畫刷顏色。
BOOL CreateBrushIndirect( const LOGBRUSH* lpLogBrush )
調用該函數(shù)可以通過LOGBRUSH結構生成一個畫刷,LOGBRUSH結構的定義如下:
typedef struct tag LOGBRUSH {
UINT lbStyle;
COLORREF lbColor;
LONG lbHatch;
} LOGBRUSH;
其中lbStyle指定的是畫刷的類型,lbColor指定畫刷的顏色,lbHatch指定的是畫刷的花紋類型。
BOOL CreatePatternBrush( CBitmap* pBitmap )
創(chuàng)建一個使用位圖填充的畫刷,畫刷的位圖由pBitmap指定,位圖大小必須8×8。
BOOL CreateDIBPatternBrush( HGLOBAL hPackedDIB, UINT nUsage )
BOOL CreateDIBPatternBrush( const void* lpPackedDIB, UINT nUsage )
創(chuàng)建使用DIB(設備無關位圖)的畫刷,其中hPackedDIB指向存儲位圖數(shù)據(jù)的內(nèi)存塊的地址,lpPackedDIB指向DIB位圖數(shù)據(jù)的指針,nUsage用于設定調色板的屬性。
BOOL CreateSysColorBrush( int nIndex )
該函數(shù)設定帶有系統(tǒng)色的畫刷,nIndex指定為畫刷的花紋類型。
3.CBrush演示實例
(1)創(chuàng)建一個基于對話框的應用程序BrushDemo。
(2)向CBrushDemoDlg類中添加一個成員函數(shù)RunBrush(),它主要完成在指定區(qū)域繪制指定矩形的功能。添加RunBrush()成員函數(shù)的代碼如下:
void CBrushDemoDlg::RunBrush(CPaintDC* dc,CRect rect, COLORREF col,CString text, LONG lbHatch)
{
CBrush cbrush;
CBrush* pBrush; //舊筆刷
cbrush.CreateHatchBrush(lbHatch,col); //建立帶花紋筆刷
dc->DrawText(text,&rect,DT_CENTER|DT_WORDBREAK); //寫提示文本
rect.top=rect.top+40; //調整矩形區(qū)域
pBrush=dc->SelectObject(&cbrush); //載入筆刷
dc->Rectangle(&rect); //繪制矩形
dc->SelectObject(pBrush); //恢復筆刷
cbrush.DeleteObject();
pBrush->DeleteObject();
}
(3)找到CBrushDemoDlg::OnDrow()函數(shù),修改這個函數(shù)的內(nèi)容:
void CBrushDemoDlg::OnPaint()
{
CPaintDC dc(this);
//背景填充為白色
CRect rect,fillrect;
CBrush brush;
brush.CreateSolidBrush(RGB(255,255,255));
this->GetClientRect(&rect);
dc.FillRect(&rect,&brush); //用FillRect成員函數(shù)利用筆刷填充指定區(qū)域
brush.DeleteObject();
//畫矩形區(qū)域
int left=10;
const int MAX=6;
fillrect.top=rect.top+10;
fillrect.bottom=rect.bottom-10;
long style[MAX]={HS_BDIAGONAL,HS_CROSS,HS_DIAGCROSS,\
HS_FDIAGONAL,HS_HORIZONTAL,HS_VERTICAL}; //筆刷的花紋類型
CString text[MAX]={"剖 面 線\n從左到右","網(wǎng) 格 線",\
"斜網(wǎng)格線","剖 面 線\n從右到左","水 平 線","垂 直線"}; //提示文本
for(int i=0;i<MAX;i++)
{
fillrect.left=left;
fillrect.right=fillrect.left+100;
left=fillrect.right+10;
//利用"RGB((i+1)*255/MAX,0,(MAX-i)*255/MAX)"產(chǎn)生不同的顏色
RunBrush(&dc,fillrect,RGB((i+1)*255/MAX,0,(MAX-i)*255/MAX),text[i],style[i]);
}
}