• MFC中GDI之CPen(画笔)


    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

    结果:

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

    昨夜雨疏风骤,浓睡不消残酒。试问卷帘人,却道海棠依旧。知否?知否?应是绿肥红瘦。
  • 相关阅读:
    利用dockerfile定制镜像
    发布Docker 镜像到dockerhub
    Docker 停止容器
    133. Clone Graph
    132. Palindrome Partitioning II
    131. Palindrome Partitioning
    130. Surrounded Regions
    129. Sum Root to Leaf Numbers
    128. Longest Consecutive Sequence
    127. Word Ladder
  • 原文地址:https://www.cnblogs.com/htj10/p/11869735.html
Copyright © 2020-2023  润新知