zoukankan      html  css  js  c++  java
  • 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

    结果:

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

    昨夜雨疏风骤,浓睡不消残酒。试问卷帘人,却道海棠依旧。知否?知否?应是绿肥红瘦。
  • 相关阅读:
    Codeforces Round #436 (Div. 2)
    【bzoj1090】 [SCOI2003]字符串折叠
    【并查集】食物链(带权并查集)
    【图论】二分图
    【图论】关押罪犯
    关于图论的若干巴拉巴拉
    一系列的入门and一堆吐槽
    【分块】八
    9-30刷题记录
    bzoj5055
  • 原文地址:https://www.cnblogs.com/htj10/p/11869735.html
Copyright © 2011-2022 走看看