在好例子网,分享、交流、成长!
您当前所在位置:首页C/C++ 开发实例桌面应用界面/GUI → MFC绘制图形

MFC绘制图形

桌面应用界面/GUI

下载此实例
  • 开发语言:C/C++
  • 实例大小:53.85M
  • 下载次数:66
  • 浏览次数:655
  • 发布时间:2019-12-25
  • 实例类别:桌面应用界面/GUI
  • 发 布 人:53175596709565
  • 文件格式:.zip
  • 所需积分:2
 相关标签: MFC 绘图 c++

实例介绍

【实例简介】利用C 的MFC制作绘制三角形,矩形,圆形的绘图工具

【实例截图】

from clipboard


from clipboard


【核心代码】

AttributeDialog.h

class AttributeDialog : public CDialogEx

{

    DECLARE_DYNAMIC(AttributeDialog)

public:

    AttributeDialog(CWnd* pParent = NULL);   // 标准构造函数

    virtual BOOL OnInitDialog();

    virtual ~AttributeDialog();

// 对话框数据

    enum { IDD = IDD_ATTRIBUTEDIALOG };

protected:

    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持

    DECLARE_MESSAGE_MAP()

public:

    CMFCColorButton borderColorButton;

    int x;

    int y;

    int w;

    int height;

//  CString text;

    COLORREF borderColor;

    COLORREF fillColor;

    CMFCColorButton fillColorButton;

    int borderWidth;

    CListBox fillType;

    CListBox borderType;

    CComboBox shapeType;

    afx_msg void OnBnClickedOk();

    afx_msg void OnBnClickedCancel();

    afx_msg void OnCbnSelchangeComboShapeType();

    // 选项的索引号

    int comboxIndex;

    int borderTypeIndex;

    int filltypeIndex;

    int borderType2;

    int fillType2;

    afx_msg void OnEnChangeEditLineWidth();

    afx_msg void OnBnClickedButtonBorderColor();

    CString text;

};

AttributeDialog.cpp

BOOL AttributeDialog::OnInitDialog()

{

    CDialogEx::OnInitDialog();

    // TODO:  在此添加额外的初始化

    // 初始化列表框中的内容

    CListBox* pListBox = (CListBox*)GetDlgItem(IDC_LIST_BORDER_TYPE);

    pListBox->InsertString(0, L"SOLID");

    pListBox->InsertString(1, L"DASH");

    pListBox->InsertString(2, L"DOT");

    pListBox->InsertString(3, L"DASHDOT");

    pListBox->InsertString(4, L"DASHDOTDOT");

    pListBox->InsertString(5, L"PS_NULL");

    pListBox->InsertString(6, L"PS_INSIDEFRAME");

    pListBox->SetCurSel(0);

    pListBox = (CListBox*)GetDlgItem(IDC_LIST_FILL_TYPE);

    pListBox->InsertString(0, L"HS_HORIZONTAL");

    pListBox->InsertString(1, L"HS_VERTICAL");

    pListBox->InsertString(2, L"HS_FDIAGONAL");

    pListBox->InsertString(3, L"HS_BDIAGONAL");

    pListBox->InsertString(4, L"HS_CROSS");

    pListBox->InsertString(5, L"SOLID");

    pListBox->SetCurSel(0);

    return TRUE;  // return TRUE unless you set the focus to a control

    // 异常: OCX 属性页应返回 FALSE

}

void AttributeDialog::OnCbnSelchangeComboShapeType()

{

    UpdateData(FALSE);

    // TODO: 在此添加控件通知处理程序代码

    int index = shapeType.GetCurSel(); // 根据用户选项调整界面

    CEdit* pEdit = (CEdit*)GetDlgItem(IDC_EDIT_TEXT);

    pEdit->ShowWindow(SW_HIDE);

    pEdit = (CEdit*)GetDlgItem(IDC_EDIT_HEIGHT);

    pEdit->ShowWindow(SW_HIDE);

    if (index == 5)

    {

        CEdit* pEdit = (CEdit*)GetDlgItem(IDC_EDIT_TEXT);

        pEdit->ShowWindow(SW_SHOW);

    }

    if (index == 1||index== 4)

    {

        CEdit* pEdit = (CEdit*)GetDlgItem(IDC_EDIT_HEIGHT);

        pEdit->ShowWindow(SW_SHOW);

    }

    UpdateData(FALSE);

}

void AttributeDialog::OnBnClickedOk()

{

    // TODO: 在此添加控件通知处理程序代码

        CDialogEx::OnOK();

        comboxIndex = shapeType.GetCurSel(); // 获取图形类型选项值

        borderTypeIndex = borderType.GetCurSel(); // 获取边框类型选项值

        filltypeIndex = fillType.GetCurSel(); //获取填充类型选项值

        borderColor = borderColorButton.GetColor(); // 获取边框颜色值

        fillColor = fillColorButton.GetColor(); // 获取填充颜色值

}

DrawingView.h

class CDrawingView : public CScrollView

{

protected: // 仅从序列化创建

    CDrawingView();

    DECLARE_DYNCREATE(CDrawingView)

// 特性

public:

    CDrawingDoc* GetDocument() const;

// 操作

public:

// 重写

public:

    virtual void OnDraw(CDC* pDC);  // 重写以绘制该视图

    virtual BOOL PreCreateWindow(CREATESTRUCT& cs);

protected:

    virtual void OnInitialUpdate(); // 构造后第一次调用

public:

    virtual ~CDrawingView();

#ifdef _DEBUG

    virtual void AssertValid() const;

    virtual void Dump(CDumpContext& dc) const;

#endif

protected:

// 生成的消息映射函数

protected:

    afx_msg void OnContextMenu(CWnd* pWnd, CPoint point);

    DECLARE_MESSAGE_MAP();

    afx_msg void OnLButtonDown(UINT nFlags, CPoint point);

public:

    afx_msg void OnLButtonDblClk(UINT nFlags, CPoint point);

    afx_msg void OnRButtonUp(UINT nFlags, CPoint point);

    afx_msg void OnRButtonDblClk(UINT nFlags, CPoint point);

};

#ifndef _DEBUG  // DrawingView.cpp 中的调试版本

inline CDrawingDoc* CDrawingView::GetDocument() const

   { return reinterpret_cast<CDrawingDoc*>(m_pDocument); }

#endi

DrawingView.cpp

void CDrawingView::OnLButtonDown(UINT nFlags, CPoint point)

{

    // TODO: 在此添加消息处理程序代码和/或调用默认值

    if ((nFlags&MK_CONTROL) == MK_CONTROL)//Ctrl键按下

    {  

        CDrawingDoc* pDoc = GetDocument();

        ASSERT_VALID(pDoc);

        if (!pDoc)  return;

        CClientDC dc(this);

        CPoint pntLogical = point;

        OnPrepareDC(&dc);

        dc.DPtoLP(&pntLogical);//DP->LP进行转换

        AttributeDialog dlg;

        dlg.x= pntLogical.x;

        dlg.y = pntLogical.y;

        if(dlg.DoModal()==IDOK)

        {//获取图形的属性

           int orgX = dlg.x;

           int orgY = dlg.y;

           int width = dlg.w;

           int height = dlg.height;

           CString text = dlg.text;

           int borderWidth = dlg.borderWidth;

           int borderType = dlg.borderTypeIndex;

           COLORREF borderColor = dlg.borderColor;

           int fillType = dlg.filltypeIndex;

           int fillColor = dlg.fillColor;

           int comboxIndex = dlg.comboxIndex;

           switch(comboxIndex)

           {

           case 0:

               {

                   // 正方形

                   CSquare *p = new CSquare(orgX, orgY, width, borderWidth, borderType, borderColor, fillType, fillColor);

                   pDoc->m_Elements.Add(p);

                   break;

               }

           case 1:

               {

                   // 矩形

                   CRectangle *p = new CRectangle(orgX, orgY, width, height, borderWidth, borderType, borderColor, fillType, fillColor);

                   pDoc->m_Elements.Add(p);

                   break;

               }

           case 2:

               {

                   // 正三角形

                   CTriangle *p = new CTriangle(orgX, orgY, width, borderWidth, borderType, borderColor, fillType, fillColor);

                   pDoc->m_Elements.Add(p);

                   break;

               }

           case 3:

               {

                   // 圆形

                   CCircle *p = new CCircle(orgX, orgY, width, borderWidth, borderType, borderColor, fillType, fillColor);

                   pDoc->m_Elements.Add(p);

                   break;

               }

               case 4:

                   {

                       // 椭圆形

                       CEllipse *p = new CEllipse(orgX, orgY, width, height, borderWidth, borderType, borderColor, fillType, fillColor);

                       pDoc->m_Elements.Add(p);

                       break;

                   }

               case 5:

                   {

                       // 文本

                       CText *p = new CText(orgX, orgY, width, text, borderWidth, borderType, borderColor, fillType, fillColor);

                       pDoc->m_Elements.Add(p);

                       break;

                   }

           default:

               {

                   MessageBox(L"请您选择图形类型!");

                   break;

               }

           }

           Invalidate();//刷新窗口

        }

    }

    CScrollView::OnLButtonDown(nFlags, point);

}

void CDrawingView::OnLButtonDblClk(UINT nFlags, CPoint point)

{

    // TODO: 在此添加消息处理程序代码和/或调用默认值

    CScrollView::OnLButtonDblClk(nFlags, point);

    CDrawingDoc* pDoc = GetDocument();

    int i;

    CShape* p;

    CClientDC   dc(this);

    CPoint pntLogical = point;

    OnPrepareDC(&dc);

    dc.DPtoLP(&pntLogical);//DP->LP进行坐标转换

    for (i = 0; i < pDoc->m_Elements.GetCount(); i )

    {

        p = (CShape*)pDoc->m_Elements[i];

        if (p->IsMatched(pntLogical)) //鼠标点point是否落在图元p之中

        {

           //AfxMessageBox(L"Matched!"); //选中图元p,在此编写处理代码

           pDoc->m_Elements.RemoveAt(i);

           AfxMessageBox(L"已删除!");

        }  

    }

    pDoc->CDocument::UpdateAllViews(NULL);

    CScrollView::OnRButtonDblClk(nFlags, point);

}

void CDrawingView::OnRButtonDblClk(UINT nFlags, CPoint point)

{

    // TODO: 在此添加消息处理程序代码和/或调用默认值

    CScrollView::OnRButtonDblClk(nFlags, point);

    CDrawingDoc* pDoc = GetDocument();

    CShape *p = NULL;

    int count = pDoc->m_Elements.GetCount();

    CClientDC   dc(this);

    CPoint pntLogical = point;

    OnPrepareDC(&dc);

    dc.DPtoLP(&pntLogical);//DP->LP进行坐标转换

    for (int i = 0; i < count; i )

    {

        p = (CShape*)pDoc->m_Elements[i];

        if (p->IsMatched(pntLogical))

        {

           //修改图元属性,从图元属性值里面取值赋值给对话框的变量

           AttributeDialog dialog;

           dialog.x = p->OrgX;

           dialog.y = p->OrgY;

           dialog.w=p->Getw();

           dialog.borderColor = p->BorderColor;

           dialog.borderWidth = p->BorderWidth;

           dialog.borderTypeIndex = p->BorderType;

           if (dialog.DoModal() == IDOK)

           {

                //利用改了以后对话框中图元的属性更新到文档图元数组的对象中

               p->OrgX = dialog.x;

               p->OrgY = dialog.y;

               p->Setw(dialog.w);

               p->BorderColor = dialog.borderColor;

               p->BorderWidth = dialog.borderWidth;

               p->BorderType = dialog.borderTypeIndex;

               p->FillColor = dialog.fillColor;

               p->FillType = dialog.filltypeIndex;

               p->SetAttribute(p->OrgX, p->OrgY, p->BorderColor, p->BorderType, p->BorderWidth, p->FillColor, p->FillType);

           }

           Invalidate();//刷新窗口

        }

    }

}

 Shape.h

enum ElementType { NOTSET, SQUARE, RECTANGLE, CIRCLE, ELLIPSE, TRIANGLE, TEXT };

class CShape : public CObject

{

public:

    CShape();

    virtual void Setw(int x)=0;

    virtual int Getw()=0;

    virtual void Draw(CDC*pDC)=0;//绘制图元

    virtual bool IsMatched(CPoint pnt)=0;//点是否落在图形内部

    virtual void Serialize(CArchive& ar) = 0;

    void SetAttribute(int orgX, int orgY, COLORREF borderColor, int borderType, int borderWidth, COLORREF fillColor, int fillType); //修改图形属性表函数

    virtual ~CShape();

public:

    ElementType Type;//图元类型

    int OrgX;//原点坐标

    int OrgY;

    COLORREF   BorderColor;//边界颜色

    int BorderType;//边界线型--实线、虚线、虚点线等

    int BorderWidth;//边界宽度

    COLORREF  FillColor;//填充颜色

    int FillType;//填充类型--实心、双对角、十字交叉等

};

Square.cpp

void CSquare::Draw(CDC* pDC)//绘制图形函数

{

    CPen pen, *pOldPen;

    pen.CreatePen(BorderType, BorderWidth, BorderColor);

    pOldPen = (CPen*)pDC->SelectObject(&pen);

    CBrush brush, *pOldBrush;

    if ( FillType >= HS_HORIZONTAL && FillType <= HS_DIAGCROSS)

        brush.CreateHatchBrush(FillType, FillColor);

    else

        brush.CreateSolidBrush(FillColor);

    pOldBrush = (CBrush*)pDC->SelectObject(&brush);

    pDC->Rectangle(OrgX - width / 2, OrgY - width / 2, OrgX width / 2, OrgY width / 2);

    pDC->SelectObject(pOldPen);

    pDC->SelectObject(pOldBrush);

}

bool CSquare::IsMatched(CPoint pnt)//图元匹配函数

{

    CRgn rgn;

    rgn.CreateRectRgn(OrgX - width / 2, OrgY - width / 2, OrgX width / 2, OrgY width / 2);

    BOOL flag = rgn.PtInRegion(pnt);

    if (flag)

        return true;

    else

        return false;

}

Rectangle.cpp

void CRectangle::Draw(CDC* pDC)//绘制图形函数

{

    CPen pen, *pOldPen;

    pen.CreatePen(BorderType, BorderWidth, BorderColor);

    pOldPen = (CPen*)pDC->SelectObject(&pen);

    CBrush brush, *pOldBrush;

    if ( FillType >= HS_HORIZONTAL && FillType <= HS_DIAGCROSS)

        brush.CreateHatchBrush(FillType, FillColor);

    else

        brush.CreateSolidBrush(FillColor);

    pOldBrush = (CBrush*)pDC->SelectObject(&brush);

    pDC->Rectangle(OrgX - width / 2, OrgY - height / 2, OrgX width / 2, OrgY height / 2);

    pDC->SelectObject(pOldPen);

    pDC->SelectObject(pOldBrush);

}

bool CRectangle::IsMatched(CPoint pnt)//图元匹配函数

{

    CRgn rgn;

    rgn.CreateRectRgn(OrgX - width / 2, OrgY - height / 2, OrgX width / 2, OrgY height / 2);

    BOOL flag = rgn.PtInRegion(pnt);

    if (flag)

        return true;

    else

        return false;

}

Triangle.cpp:

void CTriangle::Draw(CDC* pDC)//绘制图形函数

{

    CPen pen, *pOldPen;

    pen.CreatePen(BorderType, BorderWidth, BorderColor);

    pOldPen = (CPen*)pDC->SelectObject(&pen);

    CBrush brush, *pOldBrush;

    if ( FillType >= HS_HORIZONTAL && FillType <= HS_DIAGCROSS)

        brush.CreateHatchBrush(FillType, FillColor);

    else

        brush.CreateSolidBrush(FillColor);

    pOldBrush = (CBrush*)pDC->SelectObject(&brush);

    double x1 = double(OrgX), y1 = double(OrgY) double(width) / SQRT3;

    double x2 = double(OrgX) - double(width) / 2, y2 = double(OrgY) - double(width) / (2 * SQRT3);

    double x3 = double(OrgX) double(width) / 2, y3 = double(OrgY) - double(width) / (2 * SQRT3);

    CPoint points[3] = { CPoint(int(x1), int(y1)), CPoint(int(x2), int(y2)), CPoint(int(x3), int(y3))};

    pDC->Polygon(points, 3);

    pDC->SelectObject(pOldPen);

    pDC->SelectObject(pOldBrush);

}

bool CTriangle::IsMatched(CPoint pnt)//图元匹配函数

{

    CRgn rgn ;

    CPoint ptVertex[3];

    ptVertex[0].x = long(OrgX - width / 2);

    ptVertex[0].y = long(OrgY (sqrt(1.0 / 12)) * width);

    ptVertex[1].x = long(OrgX);

    ptVertex[1].y = long(OrgY - (sqrt(1.0 / 3)) * width);

    ptVertex[2].x = long(OrgX (width / 2));

    ptVertex[2].y = long(OrgY (sqrt(1.0 / 12)) * width);

    rgn.CreatePolygonRgn(ptVertex , 3 , ALTERNATE);

    BOOL flag= rgn.PtInRegion(pnt);

    if (flag)

    {

        return true;      

    }  

    else

        return false;

}

Circle.cpp:

void CCircle::Draw(CDC* pDC)

{

    CPen pen, *pOldPen;

    pen.CreatePen(BorderType, BorderWidth, BorderColor);

    pOldPen = (CPen*)pDC->SelectObject(&pen);

    CBrush brush, *pOldBrush;

    if ( FillType >= HS_HORIZONTAL && FillType <= HS_DIAGCROSS)

        brush.CreateHatchBrush(FillType, FillColor);

    else

        brush.CreateSolidBrush(FillColor);

    pOldBrush = (CBrush*)pDC->SelectObject(&brush);

    pDC->Ellipse(OrgX - width/ 2, OrgY width / 2, OrgX width / 2, OrgY - width / 2);

    pDC->SelectObject(pOldPen);

    pDC->SelectObject(pOldBrush);

}

bool CCircle::IsMatched(CPoint pnt)

{

    CRgn rgn;

    rgn.CreateEllipticRgn(OrgX-width,OrgY-width,OrgX width,OrgY width);

    BOOL flag = rgn.PtInRegion(pnt);

    if (flag)

    {

        return true;

    }

    else

        return false;

}

Ellipse.cpp:

void CEllipse::Draw(CDC* pDC)

{

    CPen pen, *pOldPen;

    pen.CreatePen(BorderType, BorderWidth, BorderColor);

    pOldPen = (CPen*)pDC->SelectObject(&pen);

    CBrush brush, *pOldBrush;

    if ( FillType >= HS_HORIZONTAL && FillType <= HS_DIAGCROSS)

        brush.CreateHatchBrush(FillType, FillColor);

    else

        brush.CreateSolidBrush(FillColor);

    pOldBrush = (CBrush*)pDC->SelectObject(&brush);

    pDC->Ellipse(OrgX - width/ 2, OrgY height / 2, OrgX width / 2, OrgY - height / 2);

    pDC->SelectObject(pOldPen);

    pDC->SelectObject(pOldBrush);

}

bool CEllipse::IsMatched(CPoint pnt)

 {

    CRgn rgn;

    rgn.CreateEllipticRgn(OrgX - width / 2, OrgY - height / 2, OrgX width / 2, OrgY height / 2);

    BOOL flag = rgn.PtInRegion(pnt);

    if (flag)

        return true;

    else

        return false;

}

Text.cpp:

void CText::Draw(CDC* pDC)

 {

    CPen pen, *pOldPen;

    pen.CreatePen(BorderType, BorderWidth, BorderColor);

    pOldPen = (CPen*)pDC->SelectObject(&pen);

    CBrush brush, *pOldBrush;

    if ( FillType >= HS_HORIZONTAL && FillType <= HS_DIAGCROSS)

        brush.CreateHatchBrush(FillType, FillColor);

    else

        brush.CreateSolidBrush(FillColor);

    pOldBrush = (CBrush*)pDC->SelectObject(&brush);

    LOGFONT logfont;

    lstrcpy(logfont.lfFaceName, _T("楷?体¬?_GB2312"));

    logfont.lfWeight = 0;

    logfont.lfWidth = 40;

    logfont.lfHeight = 70;

    logfont.lfEscapement = width;

    logfont.lfUnderline = FALSE;

    logfont.lfItalic = FALSE;

    logfont.lfStrikeOut = FALSE;

    logfont.lfCharSet = GB2312_CHARSET;

    HFONT hFont, *hOldFont;

    hFont = CreateFontIndirect(&logfont);

    hOldFont = (HFONT*)pDC->SelectObject(hFont);

    pDC->SetBkColor(FillColor);

    pDC->SetTextColor(BorderColor);

    pDC->TextOutW(OrgX, OrgY, text);

    pDC->SelectObject(hOldFont);

    pDC->SelectObject(pOldPen);

    pDC->SelectObject(pOldBrush);

}

bool CText::IsMatched(CPoint pnt) //图元匹配函数

{

    SIZE  size;

    double a = width * 3.1415926 / 180.0;

    HFONT pNewFont = CreateFont(70, 40, width,0, 40, FALSE, FALSE, FALSE, GB2312_CHARSET, OUT_CHARACTER_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH&FF_SWISS, _T("楷?体¬?_GB2312"));

    HDC hDC = CreateCompatibleDC(NULL);

    SelectObject(hDC, pNewFont);

    if (GetTextExtentPoint32(hDC, text, wcslen(text), &size))

    {

        CRgn rgn;

        POINT ptVertex[4];

        ptVertex[0].x = OrgX;

        ptVertex[0].y = OrgY;

        ptVertex[1].x = long(OrgX cos(a) * size.cx);

        ptVertex[1].y = long(OrgY - sin(a) * size.cx);

        ptVertex[2].x = long(OrgX sin(a) * size.cy cos(a) * size.cx);

        ptVertex[2].y = long(OrgY cos(a) * size.cy - sin(a) * size.cx);

        ptVertex[3].x = long(OrgX sin(a) * size.cy);

        ptVertex[3].y = long(OrgY cos(a) * size.cy);

        rgn.CreatePolygonRgn(ptVertex, 4, WINDING);

        BOOL flag = rgn.PtInRegion(pnt);

        if (flag)

        {

           return true;

        }

        else

           return false;

    }

    else

        return false;

}



标签: MFC 绘图 c++

实例下载地址

MFC绘制图形

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

第 1 楼 栗子阿静 发表于: 2020-06-28 09:12 23
为什么绘图按钮是灰色的,怎么绘制想要的图形呢

支持(0) 盖楼(回复)

第 2 楼 L_ 发表于: 2021-04-06 11:54 46
绘不了图呀

支持(0) 盖楼(回复)

发表评论

(您的评论需要经过审核才能显示)

查看所有2条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警