C++ MFC画刷CBrush类

本文详细介绍了在MFC中如何使用CBrush类创建不同类型的画刷,包括单色画刷、阴影画刷和图案画刷,并通过实例展示了每种画刷的创建方法及效果。

画刷其实是一个像素大小为8*8的位图,用多个相同的位图对封闭图形的内部进行填充。

MFC的CBrush类封装了画刷对象,创建画刷时,首先定义一个画刷对象,然后调用CreateSolidBrush、CreateHatchBrush或CreatePatternBrush函数。可以采用下面三种方式创建画刷。

1) 创建单色画刷

BOOL CreateSolidBrush(
    COLORREF crColor  //画刷颜色
);


2) 创建阴影画刷

BOOL CreateHatchBrush(
    int nIndex,  //阴影画刷类型
    COLORREF crColor  //画刷颜色
);

参数nIndex指定画刷的样式。可以设置的样式如下所示:

  • HS_BDIAGONAL:表示45度向上,从左至右的阴影(/////);
  • HS_CROSS:水平和垂直交叉阴影(+++++);
  • HS_DIAGCROSS:45度交叉阴影(XXXXX);
  • HS_FDIAGONAL:45度向下,自左至右阴影(\\\\\\);
  • HS_HORIZONTAL:水平阴影(-----);
  • HS_VERTICAL:垂直阴影(|||||)。
  • crColor:指定用于阴影的刷子的前景色。


3) 创建按图画刷

BOOL CreatePatternBrush(
    CBitmap* pBitmap  //画刷位图,只使用左上角的8*8大小
);

示例:使用GDI对象CBrush绘图示例

编写一个程序,练习一下画刷的创建。上面有八种不同风格的画刷。

代码写在前面新建的工程SDITest中,读者可以从网站提供的链接中获取。阅读程序是请参考注释。

1) 定义数据结构

//定义数据结构
struct my_EclipseBrush{
    //图形显示区域
    CRect rect;
    //画笔
    CBrush brush;
};

2) 定义成员变量
my_EclipseBrush m_myEclipseBrush[8];


3) 在View类中初始化绘图区域

//初始化绘图区域
void CSDITestView::InitRectBrush()
{
    //界面上要显示8个图形,准备好8个区域,分两行显示,每一行显示四个
    //图形左右间隔10个像素,上下间隔20个像素
    //左上 右下
    CRect rect(0,0,100,100);
    for (int i=0;i<8;i++)
    {
        if (i<4)
        {
            //第一行图形
            CRect rect;
            rect.left=20+i*160;
            rect.top=280;
            rect.right=100+i*160;
            rect.bottom=380;

            m_myEclipseBrush[i].rect.CopyRect(rect);
        }
        else
        {
            //第二行图形
            CRect rect;
            rect.left=20+(i-4)*160;
            rect.top=400;
            rect.right=100+(i-4)*160;
            rect.bottom=500;

            m_myEclipseBrush[i].rect.CopyRect(rect);
        }

    }
}

4) 在View类中初始化画刷
//初始化画刷
void CSDITestView::InitBrush()
{
    //创建单色画刷
    m_myEclipseBrush[0].brush.CreateSolidBrush(RGB(255,0,0));
    //创建阴影画刷
    m_myEclipseBrush[1].brush.CreateHatchBrush(HS_BDIAGONAL,RGB(0,255,0));
    m_myEclipseBrush[2].brush.CreateHatchBrush(HS_CROSS,RGB(0,0,255));
    m_myEclipseBrush[3].brush.CreateHatchBrush(HS_DIAGCROSS,RGB(0,0,0));
    m_myEclipseBrush[4].brush.CreateHatchBrush(HS_FDIAGONAL,RGB(255,0,255));
    m_myEclipseBrush[5].brush.CreateHatchBrush(HS_HORIZONTAL,RGB(0,255,255));
    m_myEclipseBrush[6].brush.CreateHatchBrush(HS_VERTICAL,RGB(0,255,255));

    //创建几何画笔
    CBitmap bmp;
    //注意,这里要先加载一个位图图片,方法前面已经做个介绍
    bmp.LoadBitmapW(IDB_BRUSH);
    m_myEclipseBrush[7].brush.CreatePatternBrush(&bmp);
}

5) 在View类中的OnDraw函数中添加画图代码,代码如下:
CBrush* pOldBrush = NULL;
for (int i=0;i<8;++i)
{
    //把当前的画笔选入DC
    pOldBrush = cdc.SelectObject(&m_myEclipseBrush[i].brush);
    //在指定的区域绘制椭圆,区域为正方形,因而实际为圆
    cdc.Ellipse(m_myEclipseBrush[i].rect);
    //还原DC
    cdc.SelectObject(pOldBrush);
}


6) 编译并运行程序,生成结果如图4-3-1所示:


图4-3-1用不同风格不同颜色的画刷画图效果图


示例中演示了8种画笔效果

  • 1号:单色画刷,用CreateSolidBrush函数创建;
  • 2号:HS_BDIAGONAL风格,CreateHatchBrush函数创建;
  • 3号:HS_CROSS风格,CreateHatchBrush函数创建;
  • 4号:HS_DIAGCROSS风格,CreateHatchBrush函数创建;
  • 5号:HS_FDIAGONAL风格,CreateHatchBrush函数创建;
  • 6号:HS_HORIZONTAL风格,CreateHatchBrush函数创建;
  • 7号:HS_VERTICAL风格,CreateHatchBrush函数创建;
  • 8号:几何画刷,自定义位图。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值