分享

visual c++中的画刷类CBrush使用实例

 昵称16841773 2014-07-31

画刷类CBrush
利用画笔可以画图形的边框,而用画刷就可以在图形内着色。大多数的GDI绘图函数既使用画笔又使用画刷,它们用画笔绘制各种图形的周边,而用画刷填充图形,因而可以用一种颜色和风格去设置画笔,而用另一种颜色和风格去设定画刷,通过一次函数调用就可以绘制出形状复杂的图形。
画刷是由CBrush类管理的,创建画刷有两种方法:一种是调用构造函数,另一种是调用相关的成员函数。
1
CBrush的构造函数
CBrush
类的结构函数定义如下:
CBrush( );
CBrush( COLORREF crColor );
throw( CResourceException );
CBrush( int nIndex, COLORREF crColor );
throw( CResourceException );
CBrush( CBitmap* pBitmap );
t
hrow( CResourceException );
参数说明:
crColor
:设定画笔颜色。
NIndex
:如果画刷是带花纹的,则该参数设定画刷的花纹类型,其取值如下:
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提供的创建画笔的成员函数
除了构造函数,CBrush还提供了6个创建画刷的成员函数:
BOOL CreateSolidBrush( COLORREF crColor )
该函数创建一个实填充的画刷。crColor为填充色。
BOOL CreateHatchBrush( int nIndex, COLORREF crColor )
该函数创建一个带花纹的画刷,nIndex为花纹类型,crColor为画刷颜色。
BOOL CreateBrushIndirect( const LOGBRUSH* lpLogBrush )
调用该函数可以通过LOGBRUSH结构生成一个画刷,LOGBRUSH结构的定义如下:
typedef struct tag LOGBRUSH {
UINT    lbStyle;
COLORREF      lbColor;
LONG   lbHatch;
} LOGBRUSH;
其中lbStyle指定的是画刷的类型,lbColor指定画刷的颜色,lbHatch指定的是画刷的花纹类型。
BOOL CreatePatternBrush( CBitmap* pBitmap )
创建一个使用位图填充的画刷,画刷的位图由pBitmap指定,位图大小必须8×8
BOOL CreateDIBPatternBrush( HGLOBAL hPackedDIB, UINT nUsage )
BOOL CreateDIBPatternBrush( const void* lpPackedDIB, UINT nUsage )
创建使用DIB(设备无关位图)的画刷,其中hPackedDIB指向存储位图数据的内存块的地址,lpPackedDIB指向DIB位图数据的指针,nUsage用于设定调色板的属性。
BOOL CreateSysColorBrush( int nIndex )
该函数设定带有系统色的画刷,nIndex指定为画刷的花纹类型。
3
CBrush演示实例
1)创建一个基于对话框的应用程序BrushDemo
2)向CBrushDemoDlg类中添加一个成员函数RunBrush(),它主要完成在指定区域绘制指定矩形的功能。添加RunBrush()成员函数的代码如下:
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;       //
调整矩形区域
pBrush=dc->SelectObject(&cbrush);     //
载入笔刷
dc->Rectangle(&rect);    //
绘制矩形
dc->SelectObject(pBrush);    //
恢复笔刷
cbrush.DeleteObject();
pBrush->DeleteObject();
}
3)找到CBrushDemoDlg::OnDrow()函数,修改这个函数的内容:
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成员函数利用笔刷填充指定区域
brush.DeleteObject();
//
画矩形区域
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从左到右"," 线",\
"
斜网格线"," 线\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)"产生不同的颜色
RunBrush(&dc,fillrect,RGB((i+1)*255/MAX,0,(MAX-i)*255/MAX),text[i],style[i]);
}
}

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多