设为首页收藏本站

中国膜结构网

 找回密码
 立即注册
膜结构车棚
膜结构车棚膜结构资质国产膜材 膜结构网中国膜结构协会
查看: 24|回复: 1

MFC 直线 虚线 折线 圆 椭圆 矩形 弧形

[复制链接]
  • TA的每日心情
    开心
    2021-3-7 10:01
  • 签到天数: 1440 天

    连续签到: 19 天

    [LV.10]以坛为家III

    发表于 2021-2-20 12:00 | 显示全部楼层 |阅读模式
    http://www.mjgw.org/ 专业从事膜结构设计、制作加工、施工安装的膜结构咨询服务,能够为客户提供专业的膜结构整体解决方案。做中国最好的膜结构综合服务平台。欢迎大家联系QQ:463017170.
    ****Dlg.h头文件加入:

    //为project加入画笔、点变量数组
    public:
            CPen m_pen[5];
            CPoint m_point[5];
    public:
            void DrawLine(CDC *pDC);
            void DrawPolyline(CDC *pDC);
            void DrawPolygon(CDC *pDC);
            void DrawRect(CDC *pDC);
            void DrawRoundRect(CDC *pDC);
            void DrawEllipse(CDC *pDC);
            void DrawArc(CDC *pDC);
            void DrawAngleArc(CDC *pDC);

    ****Dlg.cpp构造函数改动:
    CLineTestDlg::CLineTestDlg(CWnd* pParent /*=NULL*/)
            : CDialogEx(CLineTestDlg::IDD, pParent)
    {
            m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

            //初始化画笔、点变量数组
            m_pen[0].CreatePen(PS_SOLID,1,RGB(255,0,0));         //红色实线。1像素宽---參数:样式、宽度、颜色
            m_pen[1].CreatePen(PS_SOLID,6,RGB(0,255,0));         //绿色实线,6像素宽
            m_pen[2].CreatePen(PS_DASH,1,RGB(255,0,0));                 //红色虚线,必须为一个像素宽
            m_pen[3].CreatePen(PS_DOT,1,RGB(0,0,255));                 //蓝色点线。必须为一个像素宽
            m_pen[4].CreatePen(PS_DASHDOTDOT,1,RGB(255,0,0));//红色双点虚线,必须为一个像素宽

            //绘制多边形的点数组
            m_point[0].x=10;
            m_point[0].y=100;
            m_point[1].x=10;
            m_point[1].y=120;
            m_point[2].x=100;
            m_point[2].y=105;
            m_point[3].x=170;
            m_point[3].y=120;
            m_point[4].x=170;
            m_point[4].y=100;
    }
    ***Dlg.cpp       onpaint函数
    void CLineTestDlg::OnPaint()
    {
            CPaintDC dc(this); // 用于绘制的设备上下文
            CBrush brush(RGB(190,190,190));//画刷
            dc.SelectObject(&brush);//将画刷选入DC
            DrawLine(&dc);
            DrawPolyline(&dc);
            DrawPolygon(&dc);
            DrawRect(&dc);
            DrawRoundRect(&dc);
            DrawEllipse(&dc);
            DrawArc(&dc);
            DrawAngleArc(&dc);

            if (IsIconic())
            {
                    CPaintDC dc(this); // 用于绘制的设备上下文
                    SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

                    // 使图标在工作区矩形中居中
                    int cxIcon = GetSystemMetrics(SM_CXICON);
                    int cyIcon = GetSystemMetrics(SM_CYICON);
                    CRect rect;
                    GetClientRect(&rect);
                    int x = (rect.Width() - cxIcon + 1) / 2;
                    int y = (rect.Height() - cyIcon + 1) / 2;

                    // 绘制图标
                    dc.DrawIcon(x, y, m_hIcon);

                   
            }
            else
            {
                    CDialogEx::OnPaint();
            }
    }
    定义画图函数:
    //绘制直线函数
    void CLineTestDlg:rawLine(CDC *pDC)
    {
            CPen *oldPen=pDC->SelectObject(&m_pen[0]);//保存DC原始画笔
            for(int i=0;i<5;i++)       
            {
                    pDC->SelectObject(&m_pen[i]);                //将画笔选入DC
                    pDC->MoveTo(20,20+i*15);                        //设置DC当前点
                    pDC->LineTo(170,20+i*15);                        //绘制直线
            }
            pDC->SelectObject(oldPen);                //回复DC原画笔
    }

    //绘制折线
    void CLineTestDlg:rawPolyline(CDC *pDC)
    {
            CPen *oldPen=pDC->SelectObject(&m_pen[0]);//保存DC原始画笔
            for(int i=0;i<5;i++)
            {
                    for(int j=0;j<5;j++)
                    {
                            m_point[j].y+=35;                //每次下移35个像素
                    }
                    pDC->SelectObject(&m_pen[i]);
                    pDC->olyline(m_point,5);
            }
            pDC->SelectObject(oldPen);
    }

    //绘制多边形
    void CLineTestDlg:rawPolygon(CDC *pDC)
    {
            for(int j=0;j<5;j++)
                    m_point[j].y+=75;        //数组中的点下移75个像素
            CPen *oldPen=pDC->SelectObject(&m_pen[0]);//保存DC原始画笔
            for(int i=0;i<5;i++)
            {
                    for(int j=0;j<5;j++)
                    {
                            m_point[j].y+=35;        //每次绘制图形下移35个像素
                    }
                    pDC->SelectObject(&m_pen[i]);
                    pDC->olygon(m_point,5); //绘制多边形
            }
            pDC->SelectObject(oldPen);
    }

    //绘制矩形
    void CLineTestDlg:rawRect(CDC *pDC)
    {
            CRect rect(150,20,220,80);
            CPen *oldPen=pDC->SelectObject(&m_pen[0]);
            for(int i=0;i<5;i++)
            {
                    rect.OffsetRect(80,0);//每次画图右移80个像素
                    pDC->SelectObject(&m_pen[i]);
                    pDC->Rectangle(&rect);//绘制矩形
            }
            pDC->SelectObject(oldPen);
    }

    //绘制圆角矩形
    void CLineTestDlg:rawRoundRect(CDC *pDC)
    {
            CRect rect(150,150,220,230);
            CPen *oldPen=pDC->SelectObject(&m_pen[0]);
            for(int i=0;i<5;i++)
            {
                    rect.OffsetRect(80,0);//每次画图右移80个像素
                    pDC->SelectObject(&m_pen[i]);
                    pDC->RoundRect(&rect,CPoint(15,15));
            }
            pDC->SelectObject(oldPen);
    }

    //绘制椭圆
    void CLineTestDlg:rawEllipse(CDC *pDC)
    {
            CRect rect(150,260,220,310);
            CPen *oldPen=pDC->SelectObject(&m_pen[0]);
            for(int i=0;i<5;i++)
            {
                    rect.OffsetRect(80,0);
                    pDC->SelectObject(&m_pen[i]);
                    pDC->Ellipse(&rect);
            }
            pDC->SelectObject(oldPen);
    }

    //绘制弧线
    void CLineTestDlg:rawArc(CDC *pDC)
    {
            CRect rect(150,400,220,460);
            CPoint ptStart(170,440);
            CPoint ptEnd(210,400);
            CPen *oldPen=pDC->SelectObject(&m_pen[0]);
            for(int i=0;i<5;i++)
            {
                    rect.OffsetRect(80,0);
                    ptStart+=CPoint(80,0);
                    ptEnd+=CPoint(80,0);
                    pDC->SelectObject(&m_pen[i]);
                    pDC->Arc(&rect,ptStart,ptEnd);
            }
            pDC->SelectObject(oldPen);
    }

    //绘制直线与弧线
    void CLineTestDlg:rawAngleArc(CDC *pDC)
    {
            CRect rect(150,500,220,560);
            CPoint ptCenter(185,600);
            CPoint ptStart(150,630);
            int r=30;
            float angleStart=0;
            float angleEnd=180;
            CPen *oldPen=pDC->SelectObject(&m_pen[0]);
            for(int i=0;i<5;i++)
            {
                    rect.OffsetRect(80,0);
                    ptStart+=CPoint(80,0);
                    pDC->MoveTo(ptStart);
                    pDC->SelectObject(&m_pen[i]);
                    pDC->AngleArc(ptCenter.x,ptCenter.y,r,angleStart,angleEnd);
            }
            pDC->SelectObject(oldPen);
    }
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2021-3-7 10:01
  • 签到天数: 1440 天

    连续签到: 19 天

    [LV.10]以坛为家III

     楼主| 发表于 2021-2-20 12:03 | 显示全部楼层
    画刷类CBrush
    利用画笔可以画图形的边框,而用画刷就可以在图形内着色。大多数的GDI绘图函数既使用画笔又使用画刷,它们用画笔绘制各种图形的周边,而用画刷填充图形,因而可以用一种颜色和风格去设置画笔,而用另一种颜色和风格去设定画刷,通过一次函数调用就可以绘制出形状复杂的图形。
    画刷是由CBrush类管理的,创建画刷有两种方法:一种是调用构造函数,另一种是调用相关的成员函数。
    1.CBrush的构造函数
    CBrush类的结构函数定义如下:
    ① CBrush( );
    ② CBrush( COLORREF crColor );
    throw( CResourceException );
    ③ CBrush( int nIndex, COLORREF crColor );
    throw( CResourceException );
    ④ CBrush( CBitmap* pBitmap );
    throw( CResourceException );
    参数说明:
    crColor:设定画笔颜色。
    NIndex:如果画刷是带花纹的,则该参数设定画刷的花纹类型,其取值如下:
    l HS_BDIAGONAL:为左高右低的45度斜花纹。
    l HS_CROSS:为由水平线和垂直线构成的方格花纹。
    l HS_DIAGCROSS:为斜45度方格花纹。
    l HS_FIDAGONAL:为右高左低的45度斜花纹。
    l HS_HORIZONTAL:为水平线花纹。
    l HS_VERTICAL:为垂直线花纹。
    PBitmap:为CBitmap类的指针,用于指定填充时所使用的位图。
    2.CBrush提供的创建画笔的成员函数
    除了构造函数,CBrush还提供了6个创建画刷的成员函数:
    BOOL CreateSolidBrush( COLORREF crColor )
    该函数创建一个实填充的画刷。crColor为填充色。
    BOOL CreateHatchBrush( int nIndex, COLORREF crColor )
    该函数创建一个带花纹的画刷,nIndex为花纹类型,crColor为画刷颜色。
    BOOL CreateBrushIndirect( const LOGBRUSH* lpLogBrush )
    调用该函数可以通过LOGBRUSH结构生成一个画刷,LOGBRUSH结构的定义如下:
    typedef struct tag LOGBRUSH {
    UINT lbStyle;
    COLORREF lbColor;
    LONG lbHatch;
    } LOGBRUSH;
    其中lbStyle指定的是画刷的类型,lbColor指定画刷的颜色,lbHatch指定的是画刷的花纹类型。
    BOOL CreatePatternBrush( CBitmap* pBitmap )
    创建一个使用位图填充的画刷,画刷的位图由pBitmap指定,位图大小必须8×8。
    BOOL CreateDIBPatternBrush( HGLOBAL hPackedDIB, UINT nUsage )
    BOOL CreateDIBPatternBrush( const void* lpPackedDIB, UINT nUsage )
    创建使用DIB(设备无关位图)的画刷,其中hPackedDIB指向存储位图数据的内存块的地址,lpPackedDIB指向DIB位图数据的指针,nUsage用于设定调色板的属性。
    BOOL CreateSysColorBrush( int nIndex )
    该函数设定带有系统色的画刷,nIndex指定为画刷的花纹类型。
    3.CBrush演示实例
    (1)创建一个基于对话框的应用程序BrushDemo。
    (2)向CBrushDemoDlg类中添加一个成员函数RunBrush(),它主要完成在指定区域绘制指定矩形的功能。添加RunBrush()成员函数的代码如下:
    void CBrushDemoDlg::RunBrush(CPaintDC* dc,CRect rect, COLORREF col,CString text, LONG lbHatch)
    {
    CBrush cbrush;
    CBrush* pBrush; //旧笔刷
    cbrush.CreateHatchBrush(lbHatch,col); //建立带花纹笔刷
    dc->DrawText(text,&rect,DT_CENTER|DT_WORDBREAK); //写提示文本
    rect.top=rect.top+40; //调整矩形区域
    pBrush=dc->SelectObject(&cbrush); //载入笔刷
    dc->Rectangle(&rect); //绘制矩形
    dc->SelectObject(pBrush); //恢复笔刷
    cbrush.DeleteObject();
    pBrush->DeleteObject();
    }
    (3)找到CBrushDemoDlg::OnDrow()函数,修改这个函数的内容:
    void CBrushDemoDlg::OnPaint()
    {
    CPaintDC dc(this);
    //背景填充为白色,不建议这么做
    CRect rect,fillrect;
    CBrush brush;
    brush.CreateSolidBrush(RGB(255,255,255));
    this->GetClientRect(&rect);
    dc.FillRect(&rect,&brush); //用FillRect成员函数利用笔刷填充指定区域
    brush.DeleteObject();
    //画矩形区域
    int left=10;
    const int MAX=6;
    fillrect.top=rect.top+10;
    fillrect.bottom=rect.bottom-10;
    long style[MAX]={HS_BDIAGONAL,HS_CROSS,HS_DIAGCROSS,\
    HS_FDIAGONAL,HS_HORIZONTAL,HS_VERTICAL}; //笔刷的花纹类型

    CString text[MAX]={"剖 面 线\n从左到右","网 格 线",\
    "斜网格线","剖 面 线\n从右到左","水 平 线","垂 直 线"}; //提示文本
    for(int i=0;i<MAX;i++)
    {
    fillrect.left=left;
    fillrect.right=fillrect.left+100;
    left=fillrect.right+10;
    //利用"RGB((i+1)*255/MAX,0,(MAX-i)*255/MAX)"产生不同的颜色
    RunBrush(&dc,fillrect,RGB((i+1)*255/MAX,0,(MAX-i)*255/MAX),text[i],style[i]);
    }
    }
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    关闭

    推荐膜材品牌上一条 /5 下一条

    进口膜材 国产膜材 pvdf膜材ptfe膜材ETFE膜材
    最好的膜结构公司 一级膜结构资质 膜结构一级资质
    膜结构设计-膜结构十大品牌-etfe设计-充气膜结构
    诺科膜结构
    遨都膜结构设计
    中国膜结构网
    中国空间膜结构协会

    QQ|申请友链|Archiver|手机版|中国膜结构论坛

    GMT+8, 2021-3-8 02:33 , Processed in 0.301102 second(s), 22 queries .

    Powered by 中国膜结构网->膜材采购->膜结构设计->膜结构安装->膜结构维修

    © 2014-2020 膜结构协会->进口膜材->国产膜材->PVDF膜材->PTFE膜材->ETFE膜材.

    快速回复 返回顶部 返回列表