CPen 画笔

由CGdiObject类派生,用于修饰线条的颜色、宽度和线型(实线、虚线、点划线等)。

CPen(int nPenStyle, int nWidth, COLORREF crColor) 在构造函数中创建一个画笔
BOOL CreatePen(int nPenStyle, int nWidth, COLORREF crColor) 根据指定数值创建一个画笔
BOOL CreatePenIndirect(LPLOGPEN lpLogPen) 根据LOGPEN结构体创建一个画笔
static CPen* FromHandle(HPEN hPen) 将HPEN句柄转化为CPen对象
operator HPEN() const 从CPen对象中获取HPEN句柄
int GetLogPen(LOGPEN* pLogPen) 获取画笔的颜色、粗度等属性信息
/* Pen Styles */
#define PS_SOLID            0       /* 实线     */
#define PS_DASH             1       /* -------  */
#define PS_DOT              2       /* .......  */
#define PS_DASHDOT          3       /* _._._._  */
#define PS_DASHDOTDOT       4       /* _.._.._  */
#define PS_NULL             5       /* 无边框    */


/* Logical Pen */
typedef struct tagLOGPEN
  {
    UINT        lopnStyle;
    POINT       lopnWidth;
    COLORREF    lopnColor;
  } LOGPEN, *PLOGPEN;

例子:

void CtestDialogDlg::OnPaint()
{
    // CPaintDC 是标准客户区绘画。刷新不消失。CPaintDC中封装了BeginPaint(),EndPaint()
    // 而CClientDC 是临时客户区绘图,刷新会消失。封装了GetDC(),ReleaseDC()
    CPaintDC dc(this); // device context for painting

    //默认画笔是黑色实线,宽度为1
    dc.MoveTo(20, 20);
    dc.LineTo(120, 20);

    //通过一个构造函数创建一个画笔
    CPen p1(PS_SOLID, 5, RGB(255, 0, 0));
    CPen* pOldPen = dc.SelectObject(&p1);
    dc.MoveTo(20, 30);
    dc.LineTo(120, 30);

    //通过CreatePen 创建一个画笔
    CPen p2;
    p2.CreatePen(PS_DASHDOT, 1, RGB(0, 0, 255));//注意,虚线、点线等,只有在宽度为1时,才有效
    dc.SelectObject(&p2);
    dc.MoveTo(20, 40);
    dc.LineTo(120, 40);

    //通过默认画笔画一个矩形
    dc.SelectObject(pOldPen);
    dc.Rectangle(140, 20, 240, 100);
    dc.RoundRect(250, 20, 350, 100, 20, 20);

    //画一个虚线边框的矩形
    dc.SelectObject(&p2);
    dc.Rectangle(20, 50, 110, 100);
    //画一个无边框的矩形
    CPen p3(PS_NULL, 1, RGB(0, 0, 0));
    dc.SelectObject(&p3);
    dc.Rectangle(20, 110, 120, 200);
    //等价的无边框的填充方法
    dc.FillSolidRect(140, 110, 100, 90, RGB(255, 255, 255));

    /*    
    调用FillSolidRect时,以前用SetBkColor设置的背景色,被设置为clr指定的颜色。
    就是说你的背景色已经变成了FillSolidRect设置的颜色了。
    也许正常是看不出来的。
    但当以再用画笔画PS_DOT类的线时,
    你会发现你虚线原来的空白地方变成了FillSolidRect设置的颜色了。
    用FillSolidRect时一定要注意。
    可以用CDC::FillRect()
    CBrush brush;
    brush.CreateSolidBrush(RGB(0,100,255));
    dc.FillRect(&rect,&brush);
    */
    dc.SelectObject(&p2);//选择虚线,FillSolidRect的颜色会是虚线的断的颜色
    dc.FillSolidRect(20, 210, 100, 20, RGB(255, 0, 0));
    dc.MoveTo(20, 240);
    dc.LineTo(120, 240);

    //选择回原来的画笔
    dc.SelectObject(pOldPen);
}

View Code

结果:

MFC中GDI之CPen(画笔)-冯金伟博客园

常记溪亭日暮,沉醉不知归路。兴尽晚回舟,误入藕花深处。争渡,争渡,惊起一滩鸥鹭。

昨夜雨疏风骤,浓睡不消残酒。试问卷帘人,却道海棠依旧。知否?知否?应是绿肥红瘦。