MFC画图

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011292087/article/details/55668921
                                        <link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-e2445db1a8.css">
                    <div class="htmledit_views">

我创建的工程名字是默认的,叫MFCApplication3

首先在MFCApplication3Dlg.h这个文件中添加构造说明:


  
  
  1. public:
  2. CPen m_pen[5];
  3. CPoint m_point[5];
  4. public:
  5. void DrawLine(CDC *pDC);
  6. void DrawPolyline(CDC *pDC);
  7. void DrawPolygon(CDC *pDC);
  8. void DrawRect(CDC *pDC);
  9. void DrawRoundRect(CDC *pDC);
  10. void DrawEllipse(CDC *pDC);
  11. void DrawArc(CDC *pDC);
  12. void DrawAngleArc(CDC *pDC);
然后在MFCApplication3Dlg.cpp这个文件里面更改些东西和加点程序:

首先找到这个CMFCApplication3Dlg::CMFCApplication3Dlg(CWnd* pParent /*=NULL*/): CDialogEx(CMFCApplication3Dlg::IDD, pParent),这个创建的时候就自动产生了,改成这样:


  
  
  1. CMFCApplication3Dlg::CMFCApplication3Dlg(CWnd* pParent / =NULL/)
  2. : CDialogEx(CMFCApplication3Dlg::IDD, pParent)
  3. {
  4. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  5. //初始化画笔、点变量数组
  6. m_pen[0].CreatePen(PS_SOLID, 1, RGB(255, 0, 0)); //红色实线,1像素宽---参数:样式、宽度、颜色
  7. m_pen[1].CreatePen(PS_SOLID, 6, RGB(0, 255, 0)); //绿色实线,6像素宽
  8. m_pen[2].CreatePen(PS_DASH, 1, RGB(255, 0, 0)); //红色虚线,必须为一个像素宽
  9. m_pen[3].CreatePen(PS_DOT, 1, RGB(0, 0, 255)); //蓝色点线,必须为一个像素宽
  10. m_pen[4].CreatePen(PS_DASHDOTDOT, 1, RGB(255, 0, 0));//红色双点虚线,必须为一个像素宽
  11. //绘制多边形的点数组
  12. m_point[0].x = 10;
  13. m_point[0].y = 100;
  14. m_point[1].x = 10;
  15. m_point[1].y = 120;
  16. m_point[2].x = 100;
  17. m_point[2].y = 105;
  18. m_point[3].x = 170;
  19. m_point[3].y = 120;
  20. m_point[4].x = 170;
  21. m_point[4].y = 100;
  22. }

然后再继续找到这个函数void CMFCApplication3Dlg::OnPaint(),将里面的东西改成这样:


  
  
  1. void CMFCApplication3Dlg::OnPaint()
  2. {
  3. CPaintDC dc(this); // 用于绘制的设备上下文
  4. CBrush brush(RGB(190, 190, 190));//画刷
  5. dc.SelectObject(&brush);//将画刷选入DC
  6. DrawLine(&dc);
  7. DrawPolyline(&dc);
  8. DrawPolygon(&dc);
  9. DrawRect(&dc);
  10. DrawRoundRect(&dc);
  11. DrawEllipse(&dc);
  12. DrawArc(&dc);
  13. DrawAngleArc(&dc);
  14. if (IsIconic())
  15. {
  16. CPaintDC dc(this); // 用于绘制的设备上下文
  17. SendMessage(WM_ICONERASEBKGND, reinterpret_cast <WPARAM>(dc.GetSafeHdc()), 0);
  18. // 使图标在工作区矩形中居中
  19. int cxIcon = GetSystemMetrics(SM_CXICON);
  20. int cyIcon = GetSystemMetrics(SM_CYICON);
  21. CRect rect;
  22. GetClientRect(&rect);
  23. int x = (rect.Width() - cxIcon + 1) / 2;
  24. int y = (rect.Height() - cyIcon + 1) / 2;
  25. // 绘制图标
  26. dc.DrawIcon(x, y, m_hIcon);
  27. }
  28. else
  29. {
  30. CDialogEx::OnPaint();
  31. }
  32. }
然后继续在刚刚的同一个的MFCApplication3Dlg.cpp : 实现文件中,添加绘图函数:


  
  
  1. //绘制直线函数
  2. void CLineTestDlg::DrawLine(CDC pDC)
  3. {
  4. CPen *oldPen=pDC->SelectObject(&m_pen[0]);//保存DC原始画笔
  5. for(int i=0;i <5;i++)
  6. {
  7. pDC->SelectObject(&m_pen[i]); //将画笔选入DC
  8. pDC->MoveTo(20,20+i*15); //设置DC当前点
  9. pDC->LineTo(170,20+i*15); //绘制直线
  10. }
  11. pDC->SelectObject(oldPen); //回复DC原画笔
  12. }
  13. //绘制折线
  14. void CLineTestDlg::DrawPolyline(CDC *pDC)
  15. {
  16. CPen *oldPen=pDC->SelectObject(&m_pen[0]);//保存DC原始画笔
  17. for(int i=0;i <5;i++)
  18. {
  19. for(int j=0;j<5;j++)
  20. {
  21. m_point[j].y+=35; //每次下移35个像素
  22. }
  23. pDC->SelectObject(&m_pen[i]);
  24. pDC->Polyline(m_point,5);
  25. }
  26. pDC->SelectObject(oldPen);
  27. }
  28. //绘制多边形
  29. void CLineTestDlg::DrawPolygon(CDC *pDC)
  30. {
  31. for(int j=0;j <5;j++)
  32. m_point[ j] .y+= 75; //数组中的点下移 75个像素
  33. CPen oldPen= pDC->SelectObject(&m_pen[0]);//保存DC原始画笔
  34. for(int i=0;i <5;i++)
  35. {
  36. for(int j=0;j<5;j++)
  37. {
  38. m_point[j].y+=35; //每次绘制图形下移35个像素
  39. }
  40. pDC->SelectObject(&m_pen[i]);
  41. pDC->Polygon(m_point,5); //绘制多边形
  42. }
  43. pDC->SelectObject(oldPen);
  44. }
  45. //绘制矩形
  46. void CLineTestDlg::DrawRect(CDC *pDC)
  47. {
  48. CRect rect(150,20,220,80);
  49. CPen *oldPen=pDC->SelectObject(&m_pen[0]);
  50. for(int i=0;i <5;i++)
  51. {
  52. rect.OffsetRect( 80, 0);//每次绘图右移 80个像素
  53. pDC->SelectObject(&m_pen[i]);
  54. pDC->Rectangle(&rect);//绘制矩形
  55. }
  56. pDC->SelectObject(oldPen);
  57. }
  58. //绘制圆角矩形
  59. void CLineTestDlg::DrawRoundRect(CDC *pDC)
  60. {
  61. CRect rect(150,150,220,230);
  62. CPen *oldPen=pDC->SelectObject(&m_pen[0]);
  63. for(int i=0;i <5;i++)
  64. {
  65. rect.OffsetRect( 80, 0);//每次绘图右移 80个像素
  66. pDC->SelectObject(&m_pen[i]);
  67. pDC->RoundRect(&rect,CPoint(15,15));
  68. }
  69. pDC->SelectObject(oldPen);
  70. }
  71. //绘制椭圆
  72. void CLineTestDlg::DrawEllipse(CDC *pDC)
  73. {
  74. CRect rect(150,260,220,310);
  75. CPen *oldPen=pDC->SelectObject(&m_pen[0]);
  76. for(int i=0;i <5;i++)
  77. {
  78. rect.OffsetRect( 80, 0);
  79. pDC->SelectObject(&m_pen[i]);
  80. pDC->Ellipse(&rect);
  81. }
  82. pDC->SelectObject(oldPen);
  83. }
  84. //绘制弧线
  85. void CLineTestDlg::DrawArc(CDC *pDC)
  86. {
  87. CRect rect(150,400,220,460);
  88. CPoint ptStart(170,440);
  89. CPoint ptEnd(210,400);
  90. CPen *oldPen=pDC->SelectObject(&m_pen[0]);
  91. for(int i=0;i <5;i++)
  92. {
  93. rect.OffsetRect( 80, 0);
  94. ptStart+= CPoint(80,0);
  95. ptEnd+= CPoint(80,0);
  96. pDC->SelectObject(&m_pen[i]);
  97. pDC->Arc(&rect,ptStart,ptEnd);
  98. }
  99. pDC->SelectObject(oldPen);
  100. }
  101. //绘制直线与弧线
  102. void CLineTestDlg::DrawAngleArc(CDC *pDC)
  103. {
  104. CRect rect(150,500,220,560);
  105. CPoint ptCenter(185,600);
  106. CPoint ptStart(150,630);
  107. int r=30;
  108. float angleStart=0;
  109. float angleEnd=180;
  110. CPen *oldPen=pDC->SelectObject(&m_pen[0]);
  111. for(int i=0;i <5;i++)
  112. {
  113. rect.OffsetRect( 80, 0);
  114. ptStart+= CPoint(80,0);
  115. pDC->MoveTo(ptStart);
  116. pDC->SelectObject(&m_pen[i]);
  117. pDC->AngleArc(ptCenter.x,ptCenter.y,r,angleStart,angleEnd);
  118. }
  119. pDC->SelectObject(oldPen);
  120. }

然后点击运行,图就出来了,里面什么都有,大家想用哪个就用哪个吧。



结束了!MFC太难了,好多都看不懂了,哎,还是需要学习啊。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值