Form1.cs 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using System.Windows.Forms;
  10. namespace WindowsFormsGDIDrawPolyline
  11. {
  12. public partial class Form1 : Form
  13. {
  14. public Form1()
  15. {
  16. InitializeComponent();
  17. }
  18. private void Form1_Paint(object sender, PaintEventArgs e)
  19. {
  20. string[] month = new string[12] { "一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月" };
  21. float[] d = new float[12] { 20.5F, 60, 10.8F, 15.6F, 30, 70.9F, 50.3F, 30.7F, 70, 50.4F, 30.8F, 20 };
  22. //画图初始化
  23. //在内存中创建一个位图
  24. Bitmap bMap = new Bitmap(500, 500);
  25. //根据内存中的位图,创建一个画布,采用这种方式创建的画布效果更好,图形更流畅
  26. Graphics gph = Graphics.FromImage(bMap);
  27. //使用白色清空画布,即用白色覆盖画布上的其它内容,以达到清空目的
  28. gph.Clear(Color.White);
  29. PointF cPt = new PointF(40, 420);//要绘制图形的中心点
  30. PointF[] xPt = new PointF[3] { new PointF(cPt.Y + 15, cPt.Y), new PointF(cPt.Y, cPt.Y - 8), new PointF(cPt.Y, cPt.Y + 8) };//X轴三角形
  31. PointF[] yPt = new PointF[3] { new PointF(cPt.X, cPt.X - 15), new PointF(cPt.X - 8, cPt.X), new PointF(cPt.X + 8, cPt.X) };//Y轴三角形
  32. gph.DrawString("某工厂某产品月生产量图表", new Font("宋体", 14), Brushes.Black, new PointF(cPt.X + 60, cPt.X));//图表标题
  33. //画X轴
  34. gph.DrawLine(Pens.Black, cPt.X, cPt.Y, cPt.Y, cPt.Y);
  35. gph.DrawPolygon(Pens.Black, xPt);
  36. gph.FillPolygon(new SolidBrush(Color.Black), xPt);
  37. gph.DrawString("月份", new Font("宋体", 12), Brushes.Black, new PointF(cPt.Y + 10, cPt.Y + 10));
  38. //画Y轴
  39. gph.DrawLine(Pens.Black, cPt.X, cPt.Y, cPt.X, cPt.X);
  40. gph.DrawPolygon(Pens.Black, yPt);
  41. gph.FillPolygon(new SolidBrush(Color.Black), yPt);
  42. gph.DrawString("单位(万)", new Font("宋体", 12), Brushes.Black, new PointF(0, 7));
  43. //for语句用来绘制12个月的折线
  44. for (int i = 1; i <= 12; i++)
  45. {
  46. //画Y轴刻度
  47. if (i < 11)
  48. {
  49. gph.DrawString((i * 10).ToString(), new Font("宋体", 11), Brushes.Black, new PointF(cPt.X - 30, cPt.Y - i * 30 - 6));
  50. gph.DrawLine(Pens.Black, cPt.X - 3, cPt.Y - i * 30, cPt.X, cPt.Y - i * 30);
  51. }
  52. //画X轴项目
  53. gph.DrawString(month[i - 1].Substring(0, 1), new Font("宋体", 11), Brushes.Black, new PointF(cPt.X + i * 30 - 5, cPt.Y + 5));
  54. gph.DrawString(month[i - 1].Substring(1, 1), new Font("宋体", 11), Brushes.Black, new PointF(cPt.X + i * 30 - 5, cPt.Y + 20));
  55. if (month[i - 1].Length > 2) gph.DrawString(month[i - 1].Substring(2, 1), new Font("宋体", 11), Brushes.Black, new PointF(cPt.X + i * 30 - 5, cPt.Y + 35));
  56. //画点
  57. gph.DrawEllipse(Pens.Black, cPt.X + i * 30 - 1.5F, cPt.Y - d[i - 1] * 3 - 1.5F, 3, 3);
  58. gph.FillEllipse(new SolidBrush(Color.Black), cPt.X + i * 30 - 1.5F, cPt.Y - d[i - 1] * 3 - 1.5F, 3, 3);
  59. //画数值
  60. gph.DrawString(d[i - 1].ToString(), new Font("宋体", 11), Brushes.Black, new PointF(cPt.X + i * 30, cPt.Y - d[i - 1] * 3));
  61. //画折线
  62. if (i > 1) gph.DrawLine(Pens.Red, cPt.X + (i - 1) * 30, cPt.Y - d[i - 2] * 3, cPt.X + i * 30, cPt.Y - d[i - 1] * 3);
  63. }
  64. pictureBox1.Image = bMap;
  65. }
  66. }
  67. }