C++ MFC画笔CPen类

MFC的CPen类封装了画笔对象,其中的成员函数CreatePen实现创建画笔的功能,函数原型如下:

BOOL CreatePen(
    int      nPenStyle,  //画笔风格
    int      nWidth,     //画笔宽度
    COLORREF crColor     //画笔颜色
);
一旦不再需要画笔,记得用DeleteObject函数将其删除。

设置线型

创建画笔的函数中,nPenStyle参数表示画笔风格,可以设置下列值之一。nPenStyle ------ Long,指定画笔样式,可以是下述常数之一:

  • PS_SOLID : 画笔画出的是实线。
  • PS_DASH: 画笔画出的是虚线(nWidth必须不大于1)。
  • PS_DOT: 画笔画出的是点线(nWidth必须不大于1)。
  • PS_DASHDOT:画笔画出的是点划线(nWidth必须不大于1)。
  • PS_DASHDOTDOT:  画笔画出的是点-点-划线(nWidth必须不大于1)。
  • PS_NULL: 空画笔,画笔不能画图。
  • PS_INSIDEFRAME:内侧实线画笔  由椭圆、矩形、圆角矩形、饼图以及弦等生成的封闭对象框时,画线宽度向内扩展。如指定的准确RGB颜色不存在,就进行抖动处理。

设置线宽

创建画笔的函数中,nWidth表示画笔线宽,是一个逻辑值,这个值越小,画出的图形线越细;这个值越大,绘制的图形线条越粗。

设置画笔颜色

画笔颜色通过RGB宏控制,例如需要画红色的图形,RGB(255,0,0)。MFC中有许多引用颜色宏RGB,这里总结了一些常见的颜色的宏,供大家参考。

基本颜色三种:红绿蓝,其他的颜色都是由这三种基本的颜色组成。例如,红RGB(255,0,0)、绿RGB(0, 255,0)、蓝RGB(0,0, 255)、浅粉红 #FFB6C1 255,182,193、紫色 #800080 128,0,128等。

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

编写一个程序,练习一下画笔的创建。上面有八种不同风格的画笔,现在用这八种不同风格的画笔分别话一个圆,同时修改画笔的线宽和颜色。

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

1) 定义数据结构:

struct my_Eclipse{
    CRect rect;  //图形显示区域
    CPen pen;  //画笔
};
2) 定义成员变量
//定义8个结构,用于绘制8个图形
my_Eclipse  m_myEclipse[8];


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

void CSDITestView::InitRect()
{
    //界面上要显示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*150;
            rect.top=20;
            rect.right=100+i*150;
            rect.bottom=120;

            m_myEclipse[i].rect.CopyRect(rect);
        }
        else
        {
            //第二行图形
            CRect rect;
            rect.left=20+(i-4)*150;
            rect.top=250;
            rect.right=100+(i-4)*150;
            rect.bottom=350;

            m_myEclipse[i].rect.CopyRect(rect);
        }
       
    }
}
4) 在View类中初始化画笔:
void CSDITestView::InitPen()
{
    //创建普通画笔
    m_myEclipse[0].pen.CreatePen(PS_SOLID,10,RGB(255,0,0));
    m_myEclipse[1].pen.CreatePen(PS_DASH,5,RGB(0,255,0));
    m_myEclipse[2].pen.CreatePen(PS_DOT,1,RGB(0,0,255));
    m_myEclipse[3].pen.CreatePen(PS_DASHDOT,10,RGB(0,0,0));
    m_myEclipse[4].pen.CreatePen(PS_DASHDOTDOT,5,RGB(255,0,255));
    m_myEclipse[5].pen.CreatePen(PS_NULL,1,RGB(0,255,255));
    m_myEclipse[6].pen.CreatePen(PS_INSIDEFRAME,10,RGB(0,255,255));

    //创建集合画笔
    LOGBRUSH LogBrush;
    LogBrush.lbStyle=BS_HATCHED;
    LogBrush.lbColor=RGB(0,0,255);
    LogBrush.lbHatch=HS_DIAGCROSS;
    m_myEclipse[7].pen.CreatePen(PS_GEOMETRIC,20,&LogBrush);
}
5) 在View类中的OnDraw函数中添加画图代码,代码如下:
//采用GDI绘图
CClientDC cdc(this);
CPen* pOldPen = NULL;
for (int i=0;i<8;i++)
{
    //把当前的画笔选入DC
    pOldPen = cdc.SelectObject(&m_myEclipse[i].pen);
    cdc.Ellipse(m_myEclipse[i].rect);
    cdc.SelectObject(pOldPen);
}


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


图4-2-1 用不同风格不同颜色的画笔画图效果图


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

  • 1号:PS_SOLID风格,实现画笔;
  • 2号:PS_DASH 风格,实现画笔;
  • 3号:PS_DOT  风格,实现画笔;
  • 4号:PS_DASHDOT风格,实现画笔;
  • 5号:PS_DASHDOTDOT风格,实现画笔;
  • 6号:PS_NULL 风格,实现画笔;
  • 7号:PS_INSIDEFRAME风格,实现画笔;
  • 8号:PS_GEOMETRIC 风格,实现画笔。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值