前提
入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章。
GitHub:https://github.com/kwwwvagaa/NetWinformControl
码云:https://gitee.com/kwwwvagaa/net_winform_custom_control.git
如果觉得写的还行,请点个 star 支持一下吧
麻烦博客下方点个【推荐】,谢谢
NuGet
Install-Package HZH_Controls
目录
https://www.cnblogs.com/bfyx/p/11364884.html
用处及效果
准备工作
请先了解GDI+相关知识
开始
添加一个类UCCurve 继承自UserControl
添加一些控制属性
1 /// <summary> 2 /// The value count maximum 3 /// </summary> 4 private const int value_count_max = 4096; 5 6 /// <summary> 7 /// The value maximum left 8 /// </summary> 9 private float value_max_left = 100f; 10 11 /// <summary> 12 /// The value minimum left 13 /// </summary> 14 private float value_min_left = 0f; 15 16 /// <summary> 17 /// The value maximum right 18 /// </summary> 19 private float value_max_right = 100f; 20 21 /// <summary> 22 /// The value minimum right 23 /// </summary> 24 private float value_min_right = 0f; 25 26 /// <summary> 27 /// The value segment 28 /// </summary> 29 private int value_Segment = 5; 30 31 /// <summary> 32 /// The value is abscissa strech 33 /// </summary> 34 private bool value_IsAbscissaStrech = false; 35 36 /// <summary> 37 /// The value strech data count maximum 38 /// </summary> 39 private int value_StrechDataCountMax = 300; 40 41 /// <summary> 42 /// The value is render dash line 43 /// </summary> 44 private bool value_IsRenderDashLine = true; 45 46 /// <summary> 47 /// The text format 48 /// </summary> 49 private string textFormat = "HH:mm"; 50 51 /// <summary> 52 /// The value interval abscissa text 53 /// </summary> 54 private int value_IntervalAbscissaText = 100; 55 56 /// <summary> 57 /// The random 58 /// </summary> 59 private Random random = null; 60 61 /// <summary> 62 /// The value title 63 /// </summary> 64 private string value_title = ""; 65 66 /// <summary> 67 /// The left right 68 /// </summary> 69 private int leftRight = 50; 70 71 /// <summary> 72 /// Up dowm 73 /// </summary> 74 private int upDowm = 50; 75 76 /// <summary> 77 /// The data list 78 /// </summary> 79 private Dictionary<string, CurveItem> data_list = null; 80 81 /// <summary> 82 /// The data text 83 /// </summary> 84 private string[] data_text = null; 85 86 /// <summary> 87 /// The auxiliary lines 88 /// </summary> 89 private List<AuxiliaryLine> auxiliary_lines; 90 91 /// <summary> 92 /// The auxiliary labels 93 /// </summary> 94 private List<AuxiliaryLable> auxiliary_Labels; 95 96 /// <summary> 97 /// The mark texts 98 /// </summary> 99 private List<MarkText> MarkTexts; 100 101 /// <summary> 102 /// The font size9 103 /// </summary> 104 private Font font_size9 = null; 105 106 /// <summary> 107 /// The font size12 108 /// </summary> 109 private Font font_size12 = null; 110 111 /// <summary> 112 /// The brush deep 113 /// </summary> 114 private Brush brush_deep = null; 115 116 /// <summary> 117 /// The pen normal 118 /// </summary> 119 private Pen pen_normal = null; 120 121 /// <summary> 122 /// The pen dash 123 /// </summary> 124 private Pen pen_dash = null; 125 126 /// <summary> 127 /// The color normal 128 /// </summary> 129 private Color color_normal = Color.DeepPink; 130 131 /// <summary> 132 /// The color deep 133 /// </summary> 134 private Color color_deep = Color.DimGray; 135 136 /// <summary> 137 /// The color dash 138 /// </summary> 139 private Color color_dash = Color.FromArgb(232, 232, 232); 140 141 /// <summary> 142 /// The color mark font 143 /// </summary> 144 private Color color_mark_font = Color.DodgerBlue; 145 146 /// <summary> 147 /// The brush mark font 148 /// </summary> 149 private Brush brush_mark_font = Brushes.DodgerBlue; 150 151 /// <summary> 152 /// The format left 153 /// </summary> 154 private StringFormat format_left = null; 155 156 /// <summary> 157 /// The format right 158 /// </summary> 159 private StringFormat format_right = null; 160 161 /// <summary> 162 /// The format center 163 /// </summary> 164 private StringFormat format_center = null; 165 166 /// <summary> 167 /// The is render right coordinate 168 /// </summary> 169 private bool isRenderRightCoordinate = true; 170 171 /// <summary> 172 /// The curve name width 173 /// </summary> 174 private int curveNameWidth = 100; 175 176 /// <summary> 177 /// The components 178 /// </summary> 179 private IContainer components = null; 180 181 /// <summary> 182 /// 获取或设置控件的背景色。 183 /// </summary> 184 /// <value>The color of the back.</value> 185 /// <PermissionSet> 186 /// <IPermission class="System.Security.Permissions.FileIOPermission, mscorlib, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Unrestricted="true" /> 187 /// </PermissionSet> 188 [Browsable(true)] 189 [Description("获取或设置控件的背景色")] 190 [Category("自定义")] 191 [DefaultValue(typeof(Color), "Transparent")] 192 [EditorBrowsable(EditorBrowsableState.Always)] 193 public override Color BackColor 194 { 195 get 196 { 197 return base.BackColor; 198 } 199 set 200 { 201 base.BackColor = value; 202 } 203 } 204 205 /// <summary> 206 /// Gets or sets the value maximum left. 207 /// </summary> 208 /// <value>The value maximum left.</value> 209 [Category("自定义")] 210 [Description("获取或设置图形的左纵坐标的最大值,该值必须大于最小值")] 211 [Browsable(true)] 212 [DefaultValue(100f)] 213 public float ValueMaxLeft 214 { 215 get 216 { 217 return value_max_left; 218 } 219 set 220 { 221 value_max_left = value; 222 Invalidate(); 223 } 224 } 225 226 /// <summary> 227 /// Gets or sets the value minimum left. 228 /// </summary> 229 /// <value>The value minimum left.</value> 230 [Category("自定义")] 231 [Description("获取或设置图形的左纵坐标的最小值,该值必须小于最大值")] 232 [Browsable(true)] 233 [DefaultValue(0f)] 234 public float ValueMinLeft 235 { 236 get 237 { 238 return value_min_left; 239 } 240 set 241 { 242 value_min_left = value; 243 Invalidate(); 244 } 245 } 246 247 /// <summary> 248 /// Gets or sets the value maximum right. 249 /// </summary> 250 /// <value>The value maximum right.</value> 251 [Category("自定义")] 252 [Description("获取或设置图形的右纵坐标的最大值,该值必须大于最小值")] 253 [Browsable(true)] 254 [DefaultValue(100f)] 255 public float ValueMaxRight 256 { 257 get 258 { 259 return value_max_right; 260 } 261 set 262 { 263 value_max_right = value; 264 Invalidate(); 265 } 266 } 267 268 /// <summary> 269 /// Gets or sets the value minimum right. 270 /// </summary> 271 /// <value>The value minimum right.</value> 272 [Category("自定义")] 273 [Description("获取或设置图形的右纵坐标的最小值,该值必须小于最大值")] 274 [Browsable(true)] 275 [DefaultValue(0f)] 276 public float ValueMinRight 277 { 278 get 279 { 280 return value_min_right; 281 } 282 set 283 { 284 value_min_right = value; 285 Invalidate(); 286 } 287 } 288 289 /// <summary> 290 /// Gets or sets the value segment. 291 /// </summary> 292 /// <value>The value segment.</value> 293 [Category("自定义")] 294 [Description("获取或设置图形的纵轴分段数")] 295 [Browsable(true)] 296 [DefaultValue(5)] 297 public int ValueSegment 298 { 299 get 300 { 301 return value_Segment; 302 } 303 set 304 { 305 value_Segment = value; 306 Invalidate(); 307 } 308 } 309 310 /// <summary> 311 /// Gets or sets a value indicating whether this instance is abscissa strech. 312 /// </summary> 313 /// <value><c>true</c> if this instance is abscissa strech; otherwise, <c>false</c>.</value> 314 [Category("自定义")] 315 [Description("获取或设置所有的数据是否强制在一个界面里显示")] 316 [Browsable(true)] 317 [DefaultValue(false)] 318 public bool IsAbscissaStrech 319 { 320 get 321 { 322 return value_IsAbscissaStrech; 323 } 324 set 325 { 326 value_IsAbscissaStrech = value; 327 Invalidate(); 328 } 329 } 330 331 /// <summary> 332 /// Gets or sets the strech data count maximum. 333 /// </summary> 334 /// <value>The strech data count maximum.</value> 335 [Category("自定义")] 336 [Description("获取或设置拉伸模式下的最大数据量")] 337 [Browsable(true)] 338 [DefaultValue(300)] 339 public int StrechDataCountMax 340 { 341 get 342 { 343 return value_StrechDataCountMax; 344 } 345 set 346 { 347 value_StrechDataCountMax = value; 348 Invalidate(); 349 } 350 } 351 352 /// <summary> 353 /// Gets or sets a value indicating whether this instance is render dash line. 354 /// </summary> 355 /// <value><c>true</c> if this instance is render dash line; otherwise, <c>false</c>.</value> 356 [Category("自定义")] 357 [Description("获取或设置虚线是否进行显示")] 358 [Browsable(true)] 359 [DefaultValue(true)] 360 public bool IsRenderDashLine 361 { 362 get 363 { 364 return value_IsRenderDashLine; 365 } 366 set 367 { 368 value_IsRenderDashLine = value; 369 Invalidate(); 370 } 371 } 372 373 /// <summary> 374 /// Gets or sets the color lines and text. 375 /// </summary> 376 /// <value>The color lines and text.</value> 377 [Category("自定义")] 378 [Description("获取或设置坐标轴及相关信息文本的颜色")] 379 [Browsable(true)] 380 [DefaultValue(typeof(Color), "DimGray")] 381 public Color ColorLinesAndText 382 { 383 get 384 { 385 return color_deep; 386 } 387 set 388 { 389 color_deep = value; 390 InitializationColor(); 391 Invalidate(); 392 } 393 } 394 395 /// <summary> 396 /// Gets or sets the color dash lines. 397 /// </summary> 398 /// <value>The color dash lines.</value> 399 [Category("自定义")] 400 [Description("获取或设置虚线的颜色")] 401 [Browsable(true)] 402 public Color ColorDashLines 403 { 404 get 405 { 406 return color_dash; 407 } 408 set 409 { 410 color_dash = value; 411 if (pen_dash != null) 412 pen_dash.Dispose(); 413 pen_dash = new Pen(color_dash); 414 pen_dash.DashStyle = DashStyle.Custom; 415 pen_dash.DashPattern = new float[2] 416 { 417 5f, 418 5f 419 }; 420 Invalidate(); 421 } 422 } 423 424 /// <summary> 425 /// Gets or sets the interval abscissa text. 426 /// </summary> 427 /// <value>The interval abscissa text.</value> 428 [Category("自定义")] 429 [Description("获取或设置纵向虚线的分隔情况,单位为多少个数据")] 430 [Browsable(true)] 431 [DefaultValue(100)] 432 public int IntervalAbscissaText 433 { 434 get 435 { 436 return value_IntervalAbscissaText; 437 } 438 set 439 { 440 value_IntervalAbscissaText = value; 441 Invalidate(); 442 } 443 } 444 445 /// <summary> 446 /// Gets or sets the text add format. 447 /// </summary> 448 /// <value>The text add format.</value> 449 [Category("自定义")] 450 [Description("获取或设置实时数据新增时文本相对应于时间的格式化字符串,默认HH:mm")] 451 [Browsable(true)] 452 [DefaultValue("HH:mm")] 453 public string TextAddFormat 454 { 455 get 456 { 457 return textFormat; 458 } 459 set 460 { 461 textFormat = value; 462 Invalidate(); 463 } 464 } 465 466 /// <summary> 467 /// Gets or sets the title. 468 /// </summary> 469 /// <value>The title.</value> 470 [Category("自定义")] 471 [Description("获取或设置图标的标题信息")] 472 [Browsable(true)] 473 [DefaultValue("")] 474 public string Title 475 { 476 get 477 { 478 return value_title; 479 } 480 set 481 { 482 value_title = value; 483 Invalidate(); 484 } 485 } 486 487 /// <summary> 488 /// Gets or sets a value indicating whether this instance is render right coordinate. 489 /// </summary> 490 /// <value><c>true</c> if this instance is render right coordinate; otherwise, <c>false</c>.</value> 491 [Category("自定义")] 492 [Description("获取或设置是否显示右侧的坐标系信息")] 493 [Browsable(true)] 494 [DefaultValue(true)] 495 public bool IsRenderRightCoordinate 496 { 497 get 498 { 499 return isRenderRightCoordinate; 500 } 501 set 502 { 503 isRenderRightCoordinate = value; 504 Invalidate(); 505 } 506 } 507 508 /// <summary> 509 /// Gets or sets the width of the curve name. 510 /// </summary> 511 /// <value>The width of the curve name.</value> 512 [Browsable(true)] 513 [Description("获取或设置曲线名称的布局宽度")] 514 [Category("自定义")] 515 [DefaultValue(100)] 516 public int CurveNameWidth 517 { 518 get 519 { 520 return curveNameWidth; 521 } 522 set 523 { 524 if (value > 10) 525 { 526 curveNameWidth = value; 527 } 528 } 529 }
构造函数做一些初始化
1 public UCCurve() 2 { 3 InitializeComponent(); 4 random = new Random(); 5 data_list = new Dictionary<string, CurveItem>(); 6 auxiliary_lines = new List<AuxiliaryLine>(); 7 MarkTexts = new List<MarkText>(); 8 auxiliary_Labels = new List<AuxiliaryLable>(); 9 format_left = new StringFormat 10 { 11 LineAlignment = StringAlignment.Center, 12 Alignment = StringAlignment.Near 13 }; 14 format_right = new StringFormat 15 { 16 LineAlignment = StringAlignment.Center, 17 Alignment = StringAlignment.Far 18 }; 19 format_center = new StringFormat 20 { 21 LineAlignment = StringAlignment.Center, 22 Alignment = StringAlignment.Center 23 }; 24 font_size9 = new Font("微软雅黑", 9f); 25 font_size12 = new Font("微软雅黑", 12f); 26 InitializationColor(); 27 pen_dash = new Pen(color_deep); 28 pen_dash.DashStyle = DashStyle.Custom; 29 pen_dash.DashPattern = new float[2] 30 { 31 5f, 32 5f 33 }; 34 SetStyle(ControlStyles.UserPaint | ControlStyles.SupportsTransparentBackColor, true); 35 SetStyle(ControlStyles.ResizeRedraw, true); 36 SetStyle(ControlStyles.OptimizedDoubleBuffer, true); 37 SetStyle(ControlStyles.AllPaintingInWmPaint, true); 38 }
重绘
1 protected override void OnPaint(PaintEventArgs e) 2 { 3 try 4 { 5 Graphics graphics = e.Graphics; 6 graphics.SetGDIHigh(); 7 if (BackColor != Color.Transparent) 8 { 9 graphics.Clear(BackColor); 10 } 11 int width = base.Width; 12 int height = base.Height; 13 if (width < 120 || height < 60) 14 { 15 return; 16 } 17 Point[] array = new Point[4] 18 { 19 new Point(leftRight - 1, upDowm - 8), 20 new Point(leftRight - 1, height - upDowm), 21 new Point(width - leftRight, height - upDowm), 22 new Point(width - leftRight, upDowm - 8) 23 }; 24 graphics.DrawLine(pen_normal, array[0], array[1]); 25 graphics.DrawLine(pen_normal, array[1], array[2]); 26 if (isRenderRightCoordinate) 27 { 28 graphics.DrawLine(pen_normal, array[2], array[3]); 29 } 30 31 if (!string.IsNullOrEmpty(value_title)) 32 { 33 graphics.DrawString(value_title, font_size9, brush_deep, new Rectangle(0, 0, width - 1, 20), format_center); 34 } 35 36 if (data_list.Count > 0) 37 { 38 float num = leftRight + 10; 39 foreach (KeyValuePair<string, CurveItem> item in data_list) 40 { 41 if (item.Value.Visible) 42 { 43 var titleSize=graphics.MeasureString(item.Key, Font); 44 SolidBrush solidBrush = item.Value.LineRenderVisiable ? new SolidBrush(item.Value.LineColor) : new SolidBrush(Color.FromArgb(80, item.Value.LineColor)); 45 graphics.FillRectangle(solidBrush, num + 8f, 24f, 20f, 14f); 46 graphics.DrawString(item.Key, Font, solidBrush, new PointF(num + 30f, 24f+(14 - titleSize.Height) / 2)); 47 item.Value.TitleRegion = new RectangleF(num, 24f, 60f, 18f); 48 solidBrush.Dispose(); 49 num += titleSize.Width + 30; 50 } 51 } 52 } 53 54 55 for (int i = 0; i < auxiliary_Labels.Count; i++) 56 { 57 if (!string.IsNullOrEmpty(auxiliary_Labels[i].Text)) 58 { 59 int num2 = (auxiliary_Labels[i].LocationX > 1f) ? ((int)auxiliary_Labels[i].LocationX) : ((int)(auxiliary_Labels[i].LocationX * (float)width)); 60 int num3 = (int)graphics.MeasureString(auxiliary_Labels[i].Text, Font).Width + 3; 61 Point[] points = new Point[6] 62 { 63 new Point(num2, 11), 64 new Point(num2 + 10, 20), 65 new Point(num2 + num3 + 10, 20), 66 new Point(num2 + num3 + 10, 0), 67 new Point(num2 + 10, 0), 68 new Point(num2, 11) 69 }; 70 graphics.FillPolygon(auxiliary_Labels[i].TextBack, points); 71 graphics.DrawString(auxiliary_Labels[i].Text, Font, auxiliary_Labels[i].TextBrush, new Rectangle(num2 + 7, 0, num3 + 3, 20), format_center); 72 } 73 } 74 ControlHelper.PaintTriangle(graphics, brush_deep, new Point(leftRight - 1, upDowm - 8), 4, GraphDirection.Upward); 75 if (isRenderRightCoordinate) 76 { 77 ControlHelper.PaintTriangle(graphics, brush_deep, new Point(width - leftRight, upDowm - 8), 4, GraphDirection.Upward); 78 } 79 for (int j = 0; j < auxiliary_lines.Count; j++) 80 { 81 if (auxiliary_lines[j].IsLeftFrame) 82 { 83 auxiliary_lines[j].PaintValue = ControlHelper.ComputePaintLocationY(value_max_left, value_min_left, height - upDowm - upDowm, auxiliary_lines[j].Value) + (float)upDowm; 84 } 85 else 86 { 87 auxiliary_lines[j].PaintValue = ControlHelper.ComputePaintLocationY(value_max_right, value_min_right, height - upDowm - upDowm, auxiliary_lines[j].Value) + (float)upDowm; 88 } 89 } 90 for (int k = 0; k <= value_Segment; k++) 91 { 92 float value = (float)((double)k * (double)(value_max_left - value_min_left) / (double)value_Segment + (double)value_min_left); 93 float num4 = ControlHelper.ComputePaintLocationY(value_max_left, value_min_left, height - upDowm - upDowm, value) + (float)upDowm; 94 if (IsNeedPaintDash(num4)) 95 { 96 graphics.DrawLine(pen_normal, leftRight - 4, num4, leftRight - 1, num4); 97 RectangleF layoutRectangle = new RectangleF(0f, num4 - 9f, leftRight - 4, 20f); 98 graphics.DrawString(value.ToString(), font_size9, brush_deep, layoutRectangle, format_right); 99 if (isRenderRightCoordinate) 100 { 101 float num5 = (float)k * (value_max_right - value_min_right) / (float)value_Segment + value_min_right; 102 graphics.DrawLine(pen_normal, width - leftRight + 1, num4, width - leftRight + 4, num4); 103 layoutRectangle.Location = new PointF(width - leftRight + 4, num4 - 9f); 104 graphics.DrawString(num5.ToString(), font_size9, brush_deep, layoutRectangle, format_left); 105 } 106 if (k > 0 && value_IsRenderDashLine) 107 { 108 graphics.DrawLine(pen_dash, leftRight, num4, width - leftRight, num4); 109 } 110 } 111 } 112 if (value_IsRenderDashLine) 113 { 114 if (value_IsAbscissaStrech) 115 { 116 float num6 = (float)(width - leftRight * 2) * 1f / (float)(value_StrechDataCountMax - 1); 117 int num7 = CalculateDataCountByOffect(num6); 118 for (int l = 0; l < value_StrechDataCountMax; l += num7) 119 { 120 if (l > 0 && l < value_StrechDataCountMax - 1) 121 { 122 graphics.DrawLine(pen_dash, (float)l * num6 + (float)leftRight, upDowm, (float)l * num6 + (float)leftRight, height - upDowm - 1); 123 } 124 if (data_text != null && l < data_text.Length && (float)l * num6 + (float)leftRight < (float)(data_text.Length - 1) * num6 + (float)leftRight - 40f) 125 { 126 graphics.DrawString(layoutRectangle: new Rectangle((int)((float)l * num6), height - upDowm + 1, leftRight * 2, upDowm), s: data_text[l], font: font_size9, brush: brush_deep, format: format_center); 127 } 128 } 129 string[] array2 = data_text; 130 if (array2 != null && array2.Length > 1) 131 { 132 if (data_text.Length < value_StrechDataCountMax) 133 { 134 graphics.DrawLine(pen_dash, (float)(data_text.Length - 1) * num6 + (float)leftRight, upDowm, (float)(data_text.Length - 1) * num6 + (float)leftRight, height - upDowm - 1); 135 } 136 graphics.DrawString(layoutRectangle: new Rectangle((int)((float)(data_text.Length - 1) * num6 + (float)leftRight) - leftRight, height - upDowm + 1, leftRight * 2, upDowm), s: data_text[data_text.Length - 1], font: font_size9, brush: brush_deep, format: format_center); 137 } 138 } 139 else if (value_IntervalAbscissaText > 0) 140 { 141 int num8 = width - 2 * leftRight + 1; 142 for (int m = leftRight; m < width - leftRight; m += value_IntervalAbscissaText) 143 { 144 if (m != leftRight) 145 { 146 graphics.DrawLine(pen_dash, m, upDowm, m, height - upDowm - 1); 147 } 148 if (data_text == null) 149 { 150 continue; 151 } 152 int num9 = (num8 > data_text.Length) ? data_text.Length : num8; 153 if (m - leftRight < data_text.Length && num9 - (m - leftRight) > 40) 154 { 155 if (data_text.Length <= num8) 156 { 157 graphics.DrawString(layoutRectangle: new Rectangle(m - leftRight, height - upDowm + 1, leftRight * 2, upDowm), s: data_text[m - leftRight], font: font_size9, brush: brush_deep, format: format_center); 158 } 159 else 160 { 161 graphics.DrawString(layoutRectangle: new Rectangle(m - leftRight, height - upDowm + 1, leftRight * 2, upDowm), s: data_text[m - leftRight + data_text.Length - num8], font: font_size9, brush: brush_deep, format: format_center); 162 } 163 } 164 } 165 string[] array3 = data_text; 166 if (array3 != null && array3.Length > 1) 167 { 168 if (data_text.Length >= num8) 169 { 170 graphics.DrawString(layoutRectangle: new Rectangle(width - leftRight - leftRight, height - upDowm + 1, leftRight * 2, upDowm), s: data_text[data_text.Length - 1], font: font_size9, brush: brush_deep, format: format_center); 171 } 172 else 173 { 174 graphics.DrawLine(pen_dash, data_text.Length + leftRight - 1, upDowm, data_text.Length + leftRight - 1, height - upDowm - 1); 175 graphics.DrawString(layoutRectangle: new Rectangle(data_text.Length + leftRight - 1 - leftRight, height - upDowm + 1, leftRight * 2, upDowm), s: data_text[data_text.Length - 1], font: font_size9, brush: brush_deep, format: format_center); 176 } 177 } 178 } 179 } 180 for (int n = 0; n < auxiliary_lines.Count; n++) 181 { 182 if (auxiliary_lines[n].IsLeftFrame) 183 { 184 graphics.DrawLine(auxiliary_lines[n].GetPen(), leftRight - 4, auxiliary_lines[n].PaintValue, leftRight - 1, auxiliary_lines[n].PaintValue); 185 graphics.DrawString(layoutRectangle: new RectangleF(0f, auxiliary_lines[n].PaintValue - 9f, leftRight - 4, 20f), s: auxiliary_lines[n].Value.ToString(), font: font_size9, brush: auxiliary_lines[n].LineTextBrush, format: format_right); 186 } 187 else 188 { 189 graphics.DrawLine(auxiliary_lines[n].GetPen(), width - leftRight + 1, auxiliary_lines[n].PaintValue, width - leftRight + 4, auxiliary_lines[n].PaintValue); 190 graphics.DrawString(layoutRectangle: new RectangleF(width - leftRight + 4, auxiliary_lines[n].PaintValue - 9f, leftRight - 4, 20f), s: auxiliary_lines[n].Value.ToString(), font: font_size9, brush: auxiliary_lines[n].LineTextBrush, format: format_left); 191 } 192 graphics.DrawLine(auxiliary_lines[n].GetPen(), leftRight, auxiliary_lines[n].PaintValue, width - leftRight, auxiliary_lines[n].PaintValue); 193 } 194 if (value_IsAbscissaStrech) 195 { 196 foreach (MarkText MarkText in MarkTexts) 197 { 198 foreach (KeyValuePair<string, CurveItem> item2 in data_list) 199 { 200 if (item2.Value.Visible && item2.Value.LineRenderVisiable && !(item2.Key != MarkText.CurveKey)) 201 { 202 float[] data = item2.Value.Data; 203 if (data != null && data.Length > 1) 204 { 205 float num10 = (float)(width - leftRight * 2) * 1f / (float)(value_StrechDataCountMax - 1); 206 if (MarkText.Index >= 0 && MarkText.Index < item2.Value.Data.Length) 207 { 208 PointF pointF = new PointF((float)leftRight + (float)MarkText.Index * num10, ControlHelper.ComputePaintLocationY(item2.Value.IsLeftFrame ? value_max_left : value_max_right, item2.Value.IsLeftFrame ? value_min_left : value_min_right, height - upDowm - upDowm, item2.Value.Data[MarkText.Index]) + (float)upDowm); 209 graphics.FillEllipse(new SolidBrush(MarkText.TextColor ?? item2.Value.LineColor), new RectangleF(pointF.X - 3f, pointF.Y - 3f, 6f, 6f)); 210 switch ((MarkText.PositionStyle == MarkTextPositionStyle.Auto) ? MarkText.CalculateDirectionFromDataIndex(item2.Value.Data, MarkText.Index) : MarkText.PositionStyle) 211 { 212 case MarkTextPositionStyle.Left: 213 graphics.DrawString(MarkText.Text, Font, new SolidBrush(MarkText.TextColor ?? item2.Value.LineColor), new RectangleF(pointF.X - 100f, pointF.Y - (float)Font.Height, 100 - MarkText.MarkTextOffect, Font.Height * 2), format_right); 214 break; 215 case MarkTextPositionStyle.Up: 216 graphics.DrawString(MarkText.Text, Font, new SolidBrush(MarkText.TextColor ?? item2.Value.LineColor), new RectangleF(pointF.X - 100f, pointF.Y - (float)Font.Height - (float)MarkText.MarkTextOffect, 200f, Font.Height + 2), format_center); 217 break; 218 case MarkTextPositionStyle.Right: 219 graphics.DrawString(MarkText.Text, Font, new SolidBrush(MarkText.TextColor ?? item2.Value.LineColor), new RectangleF(pointF.X + (float)MarkText.MarkTextOffect, pointF.Y - (float)Font.Height, 100f, Font.Height * 2), format_left); 220 break; 221 case MarkTextPositionStyle.Down: 222 graphics.DrawString(MarkText.Text, Font, new SolidBrush(MarkText.TextColor ?? item2.Value.LineColor), new RectangleF(pointF.X - 100f, pointF.Y + (float)MarkText.MarkTextOffect, 200f, Font.Height + 2), format_center); 223 break; 224 } 225 } 226 } 227 } 228 } 229 } 230 foreach (CurveItem value2 in data_list.Values) 231 { 232 if (value2.Visible && value2.LineRenderVisiable) 233 { 234 float[] data2 = value2.Data; 235 if (data2 != null && data2.Length > 1) 236 { 237 float num11 = (float)(width - leftRight * 2) * 1f / (float)(value_StrechDataCountMax - 1); 238 PointF[] array4 = new PointF[value2.Data.Length]; 239 for (int num12 = 0; num12 < value2.Data.Length; num12++) 240 { 241 array4[num12].X = (float)leftRight + (float)num12 * num11; 242 array4[num12].Y = ControlHelper.ComputePaintLocationY(value2.IsLeftFrame ? value_max_left : value_max_right, value2.IsLeftFrame ? value_min_left : value_min_right, height - upDowm - upDowm, value2.Data[num12]) + (float)upDowm; 243 if (!string.IsNullOrEmpty(value2.MarkText[num12])) 244 { 245 using (Brush brush = new SolidBrush(value2.LineColor)) 246 { 247 graphics.FillEllipse(brush, new RectangleF(array4[num12].X - 3f, array4[num12].Y - 3f, 6f, 6f)); 248 switch (MarkText.CalculateDirectionFromDataIndex(value2.Data, num12)) 249 { 250 case MarkTextPositionStyle.Left: 251 graphics.DrawString(value2.MarkText[num12], Font, brush, new RectangleF(array4[num12].X - 100f, array4[num12].Y - (float)Font.Height, 100 - MarkText.MarkTextOffect, Font.Height * 2), format_right); 252 break; 253 case MarkTextPositionStyle.Up: 254 graphics.DrawString(value2.MarkText[num12], Font, brush, new RectangleF(array4[num12].X - 100f, array4[num12].Y - (float)Font.Height - (float)MarkText.MarkTextOffect, 200f, Font.Height + 2), format_center); 255 break; 256 case MarkTextPositionStyle.Right: 257 graphics.DrawString(value2.MarkText[num12], Font, brush, new RectangleF(array4[num12].X + (float)MarkText.MarkTextOffect, array4[num12].Y - (float)Font.Height, 100f, Font.Height * 2), format_left); 258 break; 259 case MarkTextPositionStyle.Down: 260 graphics.DrawString(value2.MarkText[num12], Font, brush, new RectangleF(array4[num12].X - 100f, array4[num12].Y + (float)MarkText.MarkTextOffect, 200f, Font.Height + 2), format_center); 261 break; 262 } 263 } 264 } 265 } 266 using (Pen pen2 = new Pen(value2.LineColor, value2.LineThickness)) 267 { 268 if (value2.IsSmoothCurve) 269 { 270 graphics.DrawCurve(pen2, array4); 271 } 272 else 273 { 274 graphics.DrawLines(pen2, array4); 275 } 276 } 277 } 278 } 279 } 280 } 281 else 282 { 283 foreach (MarkText MarkText2 in MarkTexts) 284 { 285 foreach (KeyValuePair<string, CurveItem> item3 in data_list) 286 { 287 if (item3.Value.Visible && item3.Value.LineRenderVisiable && !(item3.Key != MarkText2.CurveKey)) 288 { 289 float[] data3 = item3.Value.Data; 290 if (data3 != null && data3.Length > 1 && MarkText2.Index >= 0 && MarkText2.Index < item3.Value.Data.Length) 291 { 292 PointF pointF2 = new PointF(leftRight + MarkText2.Index, ControlHelper.ComputePaintLocationY(item3.Value.IsLeftFrame ? value_max_left : value_max_right, item3.Value.IsLeftFrame ? value_min_left : value_min_right, height - upDowm - upDowm, item3.Value.Data[MarkText2.Index]) + (float)upDowm); 293 graphics.FillEllipse(new SolidBrush(MarkText2.TextColor ?? item3.Value.LineColor), new RectangleF(pointF2.X - 3f, pointF2.Y - 3f, 6f, 6f)); 294 switch ((MarkText2.PositionStyle == MarkTextPositionStyle.Auto) ? MarkText.CalculateDirectionFromDataIndex(item3.Value.Data, MarkText2.Index) : MarkText2.PositionStyle) 295 { 296 case MarkTextPositionStyle.Left: 297 graphics.DrawString(MarkText2.Text, Font, new SolidBrush(MarkText2.TextColor ?? item3.Value.LineColor), new RectangleF(pointF2.X - 100f, pointF2.Y - (float)Font.Height, 100 - MarkText.MarkTextOffect, Font.Height * 2), format_right); 298 break; 299 case MarkTextPositionStyle.Up: 300 graphics.DrawString(MarkText2.Text, Font, new SolidBrush(MarkText2.TextColor ?? item3.Value.LineColor), new RectangleF(pointF2.X - 100f, pointF2.Y - (float)Font.Height - (float)MarkText.MarkTextOffect, 200f, Font.Height + 2), format_center); 301 break; 302 case MarkTextPositionStyle.Right: 303 graphics.DrawString(MarkText2.Text, Font, new SolidBrush(MarkText2.TextColor ?? item3.Value.LineColor), new RectangleF(pointF2.X + (float)MarkText.MarkTextOffect, pointF2.Y - (float)Font.Height, 100f, Font.Height * 2), format_left); 304 break; 305 case MarkTextPositionStyle.Down: 306 graphics.DrawString(MarkText2.Text, Font, new SolidBrush(MarkText2.TextColor ?? item3.Value.LineColor), new RectangleF(pointF2.X - 100f, pointF2.Y + (float)MarkText.MarkTextOffect, 200f, Font.Height + 2), format_center); 307 break; 308 } 309 } 310 } 311 } 312 } 313 foreach (CurveItem value3 in data_list.Values) 314 { 315 if (value3.Visible && value3.LineRenderVisiable) 316 { 317 float[] data4 = value3.Data; 318 if (data4 != null && data4.Length > 1) 319 { 320 int num13 = width - 2 * leftRight + 1; 321 PointF[] array5; 322 if (value3.Data.Length <= num13) 323 { 324 array5 = new PointF[value3.Data.Length]; 325 for (int num14 = 0; num14 < value3.Data.Length; num14++) 326 { 327 array5[num14].X = leftRight + num14; 328 array5[num14].Y = ControlHelper.ComputePaintLocationY(value3.IsLeftFrame ? value_max_left : value_max_right, value3.IsLeftFrame ? value_min_left : value_min_right, height - upDowm - upDowm, value3.Data[num14]) + (float)upDowm; 329 DrawMarkPoint(graphics, value3.MarkText[num14], array5[num14], value3.LineColor, MarkText.CalculateDirectionFromDataIndex(value3.Data, num14)); 330 } 331 } 332 else 333 { 334 array5 = new PointF[num13]; 335 for (int num15 = 0; num15 < array5.Length; num15++) 336 { 337 int num16 = num15 + value3.Data.Length - num13; 338 array5[num15].X = leftRight + num15; 339 array5[num15].Y = ControlHelper.ComputePaintLocationY(value3.IsLeftFrame ? value_max_left : value_max_right, value3.IsLeftFrame ? value_min_left : value_min_right, height - upDowm - upDowm, value3.Data[num16]) + (float)upDowm; 340 DrawMarkPoint(graphics, value3.MarkText[num16], array5[num15], value3.LineColor, MarkText.CalculateDirectionFromDataIndex(value3.Data, num16)); 341 } 342 } 343 using (Pen pen3 = new Pen(value3.LineColor, value3.LineThickness)) 344 { 345 if (value3.IsSmoothCurve) 346 { 347 graphics.DrawCurve(pen3, array5); 348 } 349 else 350 { 351 graphics.DrawLines(pen3, array5); 352 } 353 } 354 } 355 } 356 } 357 } 358 base.OnPaint(e); 359 } 360 catch (Exception exc) 361 { 362 e.Graphics.DrawString(exc.Message, this.Font, Brushes.Black, 10, 10); 363 } 364 }
辅助函数
1 /// <summary> 2 /// Draws the mark point. 3 /// </summary> 4 /// <param name="g">The g.</param> 5 /// <param name="markText">The mark text.</param> 6 /// <param name="center">The center.</param> 7 /// <param name="color">The color.</param> 8 /// <param name="markTextPosition">The mark text position.</param> 9 private void DrawMarkPoint(Graphics g, string markText, PointF center, Color color, MarkTextPositionStyle markTextPosition) 10 { 11 if (!string.IsNullOrEmpty(markText)) 12 { 13 using (Brush brush = new SolidBrush(color)) 14 { 15 DrawMarkPoint(g, markText, center, brush, markTextPosition); 16 } 17 } 18 } 19 20 /// <summary> 21 /// Draws the mark point. 22 /// </summary> 23 /// <param name="g">The g.</param> 24 /// <param name="markText">The mark text.</param> 25 /// <param name="center">The center.</param> 26 /// <param name="brush">The brush.</param> 27 /// <param name="markTextPosition">The mark text position.</param> 28 private void DrawMarkPoint(Graphics g, string markText, PointF center, Brush brush, MarkTextPositionStyle markTextPosition) 29 { 30 if (!string.IsNullOrEmpty(markText)) 31 { 32 g.FillEllipse(brush, new RectangleF(center.X - 3f, center.Y - 3f, 6f, 6f)); 33 switch (markTextPosition) 34 { 35 case MarkTextPositionStyle.Left: 36 g.DrawString(markText, Font, brush, new RectangleF(center.X - 100f, center.Y - (float)Font.Height, 100 - MarkText.MarkTextOffect, Font.Height * 2), format_right); 37 break; 38 case MarkTextPositionStyle.Up: 39 g.DrawString(markText, Font, brush, new RectangleF(center.X - 100f, center.Y - (float)Font.Height - (float)MarkText.MarkTextOffect, 200f, Font.Height + 2), format_center); 40 break; 41 case MarkTextPositionStyle.Right: 42 g.DrawString(markText, Font, brush, new RectangleF(center.X + (float)MarkText.MarkTextOffect, center.Y - (float)Font.Height, 100f, Font.Height * 2), format_left); 43 break; 44 case MarkTextPositionStyle.Down: 45 g.DrawString(markText, Font, brush, new RectangleF(center.X - 100f, center.Y + (float)MarkText.MarkTextOffect, 200f, Font.Height + 2), format_center); 46 break; 47 } 48 } 49 } 50 51 /// <summary> 52 /// Determines whether [is need paint dash] [the specified paint value]. 53 /// </summary> 54 /// <param name="paintValue">The paint value.</param> 55 /// <returns><c>true</c> if [is need paint dash] [the specified paint value]; otherwise, <c>false</c>.</returns> 56 private bool IsNeedPaintDash(float paintValue) 57 { 58 for (int i = 0; i < auxiliary_lines.Count; i++) 59 { 60 if (Math.Abs(auxiliary_lines[i].PaintValue - paintValue) < (float)font_size9.Height) 61 { 62 return false; 63 } 64 } 65 return true; 66 } 67 68 /// <summary> 69 /// Calculates the data count by offect. 70 /// </summary> 71 /// <param name="offect">The offect.</param> 72 /// <returns>System.Int32.</returns> 73 private int CalculateDataCountByOffect(float offect) 74 { 75 if (value_IntervalAbscissaText > 0) 76 { 77 return value_IntervalAbscissaText; 78 } 79 if (offect > 40f) 80 { 81 return 1; 82 } 83 offect = 40f / offect; 84 return (int)Math.Ceiling(offect); 85 }
一些公开函数
1 /// <summary> 2 /// Sets the curve text. 3 /// </summary> 4 /// <param name="descriptions">The descriptions.</param> 5 public void SetCurveText(string[] descriptions) 6 { 7 data_text = descriptions; 8 Invalidate(); 9 } 10 11 /// <summary> 12 /// Sets the left curve. 13 /// </summary> 14 /// <param name="key">The key.</param> 15 /// <param name="data">The data.</param> 16 /// <param name="lineColor">Color of the line.</param> 17 public void SetLeftCurve(string key, float[] data, Color? lineColor = null) 18 { 19 SetCurve(key, true, data, lineColor, 1f, false); 20 } 21 22 /// <summary> 23 /// Sets the left curve. 24 /// </summary> 25 /// <param name="key">The key.</param> 26 /// <param name="data">The data.</param> 27 /// <param name="lineColor">Color of the line.</param> 28 /// <param name="isSmooth">if set to <c>true</c> [is smooth].</param> 29 public void SetLeftCurve(string key, float[] data, Color? lineColor, bool isSmooth = false) 30 { 31 SetCurve(key, true, data, lineColor, 1f, isSmooth); 32 } 33 34 /// <summary> 35 /// Sets the right curve. 36 /// </summary> 37 /// <param name="key">The key.</param> 38 /// <param name="data">The data.</param> 39 /// <param name="lineColor">Color of the line.</param> 40 public void SetRightCurve(string key, float[] data, Color? lineColor = null) 41 { 42 SetCurve(key, false, data, lineColor, 1f, false); 43 } 44 45 /// <summary> 46 /// Sets the right curve. 47 /// </summary> 48 /// <param name="key">The key.</param> 49 /// <param name="data">The data.</param> 50 /// <param name="lineColor">Color of the line.</param> 51 /// <param name="isSmooth">if set to <c>true</c> [is smooth].</param> 52 public void SetRightCurve(string key, float[] data, Color? lineColor, bool isSmooth = false) 53 { 54 SetCurve(key, false, data, lineColor, 1f, isSmooth); 55 } 56 57 /// <summary> 58 /// Sets the curve. 59 /// </summary> 60 /// <param name="key">The key.</param> 61 /// <param name="isLeft">if set to <c>true</c> [is left].</param> 62 /// <param name="data">The data.</param> 63 /// <param name="lineColor">Color of the line.</param> 64 /// <param name="thickness">The thickness.</param> 65 /// <param name="isSmooth">if set to <c>true</c> [is smooth].</param> 66 public void SetCurve(string key, bool isLeft, float[] data, Color? lineColor, float thickness, bool isSmooth) 67 { 68 if (data_list.ContainsKey(key)) 69 { 70 if (data == null) 71 { 72 data = new float[0]; 73 } 74 data_list[key].Data = data; 75 } 76 else 77 { 78 if (data == null) 79 { 80 data = new float[0]; 81 } 82 data_list.Add(key, new CurveItem 83 { 84 Data = data, 85 MarkText = new string[data.Length], 86 LineThickness = thickness, 87 LineColor = lineColor ?? ControlHelper.Colors[data_list.Count + 13], 88 IsLeftFrame = isLeft, 89 IsSmoothCurve = isSmooth 90 }); 91 if (data_text == null) 92 { 93 data_text = new string[data.Length]; 94 } 95 } 96 Invalidate(); 97 } 98 99 /// <summary> 100 /// Removes the curve. 101 /// </summary> 102 /// <param name="key">The key.</param> 103 public void RemoveCurve(string key) 104 { 105 if (data_list.ContainsKey(key)) 106 { 107 data_list.Remove(key); 108 } 109 if (data_list.Count == 0) 110 { 111 data_text = new string[0]; 112 } 113 Invalidate(); 114 } 115 116 /// <summary> 117 /// Removes all curve. 118 /// </summary> 119 public void RemoveAllCurve() 120 { 121 int count = data_list.Count; 122 data_list.Clear(); 123 if (data_list.Count == 0) 124 { 125 data_text = new string[0]; 126 } 127 if (count > 0) 128 { 129 Invalidate(); 130 } 131 } 132 133 /// <summary> 134 /// Removes all curve data. 135 /// </summary> 136 public void RemoveAllCurveData() 137 { 138 int count = data_list.Count; 139 foreach (KeyValuePair<string, CurveItem> item in data_list) 140 { 141 item.Value.Data = new float[0]; 142 item.Value.MarkText = new string[0]; 143 } 144 data_text = new string[0]; 145 if (count > 0) 146 { 147 Invalidate(); 148 } 149 } 150 151 /// <summary> 152 /// Gets the curve item. 153 /// </summary> 154 /// <param name="key">The key.</param> 155 /// <returns>CurveItem.</returns> 156 public CurveItem GetCurveItem(string key) 157 { 158 if (data_list.ContainsKey(key)) 159 { 160 return data_list[key]; 161 } 162 return null; 163 } 164 165 /// <summary> 166 /// Saves to bitmap. 167 /// </summary> 168 /// <returns>Bitmap.</returns> 169 public Bitmap SaveToBitmap() 170 { 171 return SaveToBitmap(base.Width, base.Height); 172 } 173 174 /// <summary> 175 /// Saves to bitmap. 176 /// </summary> 177 /// <param name="width">The width.</param> 178 /// <param name="height">The height.</param> 179 /// <returns>Bitmap.</returns> 180 public Bitmap SaveToBitmap(int width, int height) 181 { 182 Bitmap bitmap = new Bitmap(width, height); 183 Graphics graphics = Graphics.FromImage(bitmap); 184 OnPaint(new PaintEventArgs(graphics, new Rectangle(0, 0, width, height))); 185 return bitmap; 186 } 187 188 /// <summary> 189 /// Adds the curve data. 190 /// </summary> 191 /// <param name="key">The key.</param> 192 /// <param name="values">The values.</param> 193 /// <param name="markTexts">The mark texts.</param> 194 /// <param name="isUpdateUI">if set to <c>true</c> [is update UI].</param> 195 private void AddCurveData(string key, float[] values, string[] markTexts, bool isUpdateUI) 196 { 197 if ((values != null && values.Length < 1) || !data_list.ContainsKey(key)) 198 { 199 return; 200 } 201 CurveItem CurveItem = data_list[key]; 202 if (CurveItem.Data != null) 203 { 204 if (value_IsAbscissaStrech) 205 { 206 ControlHelper.AddArrayData(ref CurveItem.Data, values, value_StrechDataCountMax); 207 ControlHelper.AddArrayData(ref CurveItem.MarkText, markTexts, value_StrechDataCountMax); 208 } 209 else 210 { 211 ControlHelper.AddArrayData(ref CurveItem.Data, values, 4096); 212 ControlHelper.AddArrayData(ref CurveItem.MarkText, markTexts, 4096); 213 } 214 if (isUpdateUI) 215 { 216 Invalidate(); 217 } 218 } 219 } 220 221 /// <summary> 222 /// Adds the curve time. 223 /// </summary> 224 /// <param name="count">The count.</param> 225 private void AddCurveTime(int count) 226 { 227 AddCurveTime(count, DateTime.Now.ToString(textFormat)); 228 } 229 230 /// <summary> 231 /// Adds the curve time. 232 /// </summary> 233 /// <param name="count">The count.</param> 234 /// <param name="text">The text.</param> 235 private void AddCurveTime(int count, string text) 236 { 237 if (data_text != null) 238 { 239 string[] array = new string[count]; 240 for (int i = 0; i < array.Length; i++) 241 { 242 array[i] = text; 243 } 244 if (value_IsAbscissaStrech) 245 { 246 ControlHelper.AddArrayData(ref data_text, array, value_StrechDataCountMax); 247 } 248 else 249 { 250 ControlHelper.AddArrayData(ref data_text, array, 4096); 251 } 252 } 253 } 254 255 /// <summary> 256 /// Adds the curve data. 257 /// </summary> 258 /// <param name="key">The key.</param> 259 /// <param name="value">The value.</param> 260 public void AddCurveData(string key, float value) 261 { 262 AddCurveData(key, new float[1] 263 { 264 value 265 }); 266 } 267 268 /// <summary> 269 /// Adds the curve data. 270 /// </summary> 271 /// <param name="key">The key.</param> 272 /// <param name="value">The value.</param> 273 /// <param name="markText">The mark text.</param> 274 public void AddCurveData(string key, float value, string markText) 275 { 276 AddCurveData(key, new float[1] 277 { 278 value 279 }, new string[1] 280 { 281 markText 282 }); 283 } 284 285 /// <summary> 286 /// Adds the curve data. 287 /// </summary> 288 /// <param name="key">The key.</param> 289 /// <param name="values">The values.</param> 290 public void AddCurveData(string key, float[] values) 291 { 292 AddCurveData(key, values, null); 293 } 294 295 /// <summary> 296 /// Adds the curve data. 297 /// </summary> 298 /// <param name="key">The key.</param> 299 /// <param name="values">The values.</param> 300 /// <param name="markTexts">The mark texts.</param> 301 public void AddCurveData(string key, float[] values, string[] markTexts) 302 { 303 if (markTexts == null) 304 { 305 markTexts = new string[values.Length]; 306 } 307 AddCurveData(key, values, markTexts, false); 308 if (values != null && values.Length != 0) 309 { 310 AddCurveTime(values.Length); 311 } 312 Invalidate(); 313 } 314 315 /// <summary> 316 /// Adds the curve data. 317 /// </summary> 318 /// <param name="keys">The keys.</param> 319 /// <param name="values">The values.</param> 320 public void AddCurveData(string[] keys, float[] values) 321 { 322 AddCurveData(keys, values, null); 323 } 324 325 /// <summary> 326 /// Adds the curve data. 327 /// </summary> 328 /// <param name="axisText">The axis text.</param> 329 /// <param name="keys">The keys.</param> 330 /// <param name="values">The values.</param> 331 public void AddCurveData(string axisText, string[] keys, float[] values) 332 { 333 AddCurveData(axisText, keys, values, null); 334 } 335 336 /// <summary> 337 /// Adds the curve data. 338 /// </summary> 339 /// <param name="keys">The keys.</param> 340 /// <param name="values">The values.</param> 341 /// <param name="markTexts">The mark texts.</param> 342 /// <exception cref="ArgumentNullException">keys 343 /// or 344 /// values</exception> 345 /// <exception cref="Exception">两个参数的数组长度不一致。 346 /// or 347 /// 两个参数的数组长度不一致。</exception> 348 public void AddCurveData(string[] keys, float[] values, string[] markTexts) 349 { 350 if (keys == null) 351 { 352 throw new ArgumentNullException("keys"); 353 } 354 if (values == null) 355 { 356 throw new ArgumentNullException("values"); 357 } 358 if (markTexts == null) 359 { 360 markTexts = new string[keys.Length]; 361 } 362 if (keys.Length != values.Length) 363 { 364 throw new Exception("两个参数的数组长度不一致。"); 365 } 366 if (keys.Length != markTexts.Length) 367 { 368 throw new Exception("两个参数的数组长度不一致。"); 369 } 370 for (int i = 0; i < keys.Length; i++) 371 { 372 AddCurveData(keys[i], new float[1] 373 { 374 values[i] 375 }, new string[1] 376 { 377 markTexts[i] 378 }, false); 379 } 380 AddCurveTime(1); 381 Invalidate(); 382 } 383 384 /// <summary> 385 /// Adds the curve data. 386 /// </summary> 387 /// <param name="axisText">The axis text.</param> 388 /// <param name="keys">The keys.</param> 389 /// <param name="values">The values.</param> 390 /// <param name="markTexts">The mark texts.</param> 391 /// <exception cref="ArgumentNullException">keys 392 /// or 393 /// values</exception> 394 /// <exception cref="Exception">两个参数的数组长度不一致。 395 /// or 396 /// 两个参数的数组长度不一致。</exception> 397 public void AddCurveData(string axisText, string[] keys, float[] values, string[] markTexts) 398 { 399 if (keys == null) 400 { 401 throw new ArgumentNullException("keys"); 402 } 403 if (values == null) 404 { 405 throw new ArgumentNullException("values"); 406 } 407 if (markTexts == null) 408 { 409 markTexts = new string[keys.Length]; 410 } 411 if (keys.Length != values.Length) 412 { 413 throw new Exception("两个参数的数组长度不一致。"); 414 } 415 if (keys.Length != markTexts.Length) 416 { 417 throw new Exception("两个参数的数组长度不一致。"); 418 } 419 for (int i = 0; i < keys.Length; i++) 420 { 421 AddCurveData(keys[i], new float[1] 422 { 423 values[i] 424 }, new string[1] 425 { 426 markTexts[i] 427 }, false); 428 } 429 AddCurveTime(1, axisText); 430 Invalidate(); 431 } 432 433 /// <summary> 434 /// Sets the curve visible. 435 /// </summary> 436 /// <param name="key">The key.</param> 437 /// <param name="visible">if set to <c>true</c> [visible].</param> 438 public void SetCurveVisible(string key, bool visible) 439 { 440 if (data_list.ContainsKey(key)) 441 { 442 CurveItem CurveItem = data_list[key]; 443 CurveItem.Visible = visible; 444 Invalidate(); 445 } 446 } 447 448 /// <summary> 449 /// Sets the curve visible. 450 /// </summary> 451 /// <param name="keys">The keys.</param> 452 /// <param name="visible">if set to <c>true</c> [visible].</param> 453 public void SetCurveVisible(string[] keys, bool visible) 454 { 455 foreach (string key in keys) 456 { 457 if (data_list.ContainsKey(key)) 458 { 459 CurveItem CurveItem = data_list[key]; 460 CurveItem.Visible = visible; 461 } 462 } 463 Invalidate(); 464 } 465 466 /// <summary> 467 /// Adds the left auxiliary. 468 /// </summary> 469 /// <param name="value">The value.</param> 470 public void AddLeftAuxiliary(float value) 471 { 472 AddLeftAuxiliary(value, ColorLinesAndText); 473 } 474 475 /// <summary> 476 /// Adds the left auxiliary. 477 /// </summary> 478 /// <param name="value">The value.</param> 479 /// <param name="lineColor">Color of the line.</param> 480 public void AddLeftAuxiliary(float value, Color lineColor) 481 { 482 AddLeftAuxiliary(value, lineColor, 1f, true); 483 } 484 485 /// <summary> 486 /// Adds the left auxiliary. 487 /// </summary> 488 /// <param name="value">The value.</param> 489 /// <param name="lineColor">Color of the line.</param> 490 /// <param name="lineThickness">The line thickness.</param> 491 /// <param name="isDashLine">if set to <c>true</c> [is dash line].</param> 492 public void AddLeftAuxiliary(float value, Color lineColor, float lineThickness, bool isDashLine) 493 { 494 AddAuxiliary(value, lineColor, lineThickness, isDashLine, true); 495 } 496 497 /// <summary> 498 /// Adds the right auxiliary. 499 /// </summary> 500 /// <param name="value">The value.</param> 501 public void AddRightAuxiliary(float value) 502 { 503 AddRightAuxiliary(value, ColorLinesAndText); 504 } 505 506 /// <summary> 507 /// Adds the right auxiliary. 508 /// </summary> 509 /// <param name="value">The value.</param> 510 /// <param name="lineColor">Color of the line.</param> 511 public void AddRightAuxiliary(float value, Color lineColor) 512 { 513 AddRightAuxiliary(value, lineColor, 1f, true); 514 } 515 516 /// <summary> 517 /// Adds the right auxiliary. 518 /// </summary> 519 /// <param name="value">The value.</param> 520 /// <param name="lineColor">Color of the line.</param> 521 /// <param name="lineThickness">The line thickness.</param> 522 /// <param name="isDashLine">if set to <c>true</c> [is dash line].</param> 523 public void AddRightAuxiliary(float value, Color lineColor, float lineThickness, bool isDashLine) 524 { 525 AddAuxiliary(value, lineColor, lineThickness, isDashLine, false); 526 } 527 528 /// <summary> 529 /// Adds the auxiliary. 530 /// </summary> 531 /// <param name="value">The value.</param> 532 /// <param name="lineColor">Color of the line.</param> 533 /// <param name="lineThickness">The line thickness.</param> 534 /// <param name="isDashLine">if set to <c>true</c> [is dash line].</param> 535 /// <param name="isLeft">if set to <c>true</c> [is left].</param> 536 private void AddAuxiliary(float value, Color lineColor, float lineThickness, bool isDashLine, bool isLeft) 537 { 538 auxiliary_lines.Add(new AuxiliaryLine 539 { 540 Value = value, 541 LineColor = lineColor, 542 PenDash = new Pen(lineColor) 543 { 544 DashStyle = DashStyle.Custom, 545 DashPattern = new float[2] 546 { 547 5f, 548 5f 549 } 550 }, 551 PenSolid = new Pen(lineColor), 552 IsDashStyle = isDashLine, 553 IsLeftFrame = isLeft, 554 LineThickness = lineThickness, 555 LineTextBrush = new SolidBrush(lineColor) 556 }); 557 Invalidate(); 558 } 559 560 /// <summary> 561 /// Removes the auxiliary. 562 /// </summary> 563 /// <param name="value">The value.</param> 564 public void RemoveAuxiliary(float value) 565 { 566 int num = 0; 567 for (int num2 = auxiliary_lines.Count - 1; num2 >= 0; num2--) 568 { 569 if (auxiliary_lines[num2].Value == value) 570 { 571 auxiliary_lines[num2].Dispose(); 572 auxiliary_lines.RemoveAt(num2); 573 num++; 574 } 575 } 576 if (num > 0) 577 { 578 Invalidate(); 579 } 580 } 581 582 /// <summary> 583 /// Removes all auxiliary. 584 /// </summary> 585 public void RemoveAllAuxiliary() 586 { 587 int count = auxiliary_lines.Count; 588 auxiliary_lines.Clear(); 589 if (count > 0) 590 { 591 Invalidate(); 592 } 593 } 594 595 /// <summary> 596 /// Adds the auxiliary label. 597 /// </summary> 598 /// <param name="auxiliaryLable">The auxiliary lable.</param> 599 public void AddAuxiliaryLabel(AuxiliaryLable auxiliaryLable) 600 { 601 auxiliary_Labels.Add(auxiliaryLable); 602 } 603 604 /// <summary> 605 /// Removes the auxiliary lable. 606 /// </summary> 607 /// <param name="auxiliaryLable">The auxiliary lable.</param> 608 public void RemoveAuxiliaryLable(AuxiliaryLable auxiliaryLable) 609 { 610 if (auxiliary_Labels.Remove(auxiliaryLable)) 611 { 612 Invalidate(); 613 } 614 } 615 616 /// <summary> 617 /// Removes all auxiliary lable. 618 /// </summary> 619 public void RemoveAllAuxiliaryLable() 620 { 621 int count = auxiliary_Labels.Count; 622 auxiliary_Labels.Clear(); 623 if (count > 0) 624 { 625 Invalidate(); 626 } 627 } 628 629 /// <summary> 630 /// Adds the mark text. 631 /// </summary> 632 /// <param name="markText">The mark text.</param> 633 public void AddMarkText(MarkText markText) 634 { 635 MarkTexts.Add(markText); 636 if (data_list.Count > 0) 637 { 638 Invalidate(); 639 } 640 } 641 642 /// <summary> 643 /// Adds the mark text. 644 /// </summary> 645 /// <param name="strCurveKey">The string curve key.</param> 646 /// <param name="intValueIndex">Index of the int value.</param> 647 /// <param name="strText">The string text.</param> 648 /// <param name="textColor">Color of the text.</param> 649 public void AddMarkText(string strCurveKey, int intValueIndex, string strText, Color? textColor = null) 650 { 651 AddMarkText(new MarkText() { CurveKey = strCurveKey, PositionStyle = MarkTextPositionStyle.Auto, Text = strText, TextColor = textColor, Index = intValueIndex }); 652 } 653 654 /// <summary> 655 /// Removes the mark text. 656 /// </summary> 657 /// <param name="markText">The mark text.</param> 658 public void RemoveMarkText(MarkText markText) 659 { 660 MarkTexts.Remove(markText); 661 if (data_list.Count > 0) 662 { 663 Invalidate(); 664 } 665 } 666 667 /// <summary> 668 /// Removes all mark text. 669 /// </summary> 670 public void RemoveAllMarkText() 671 { 672 MarkTexts.Clear(); 673 if (data_list.Count > 0) 674 { 675 Invalidate(); 676 } 677 }
其中
MarkText为标注文字相关
AuxiliaryLabel为提示信息相关
Auxiliary为节点信息相关
完整代码
1 // *********************************************************************** 2 // Assembly : HZH_Controls 3 // Created : 2019-09-23 4 // 5 // *********************************************************************** 6 // <copyright file="UCCurve.cs"> 7 // Copyright by Huang Zhenghui(黄正辉) All, QQ group:568015492 QQ:623128629 Email:623128629@qq.com 8 // </copyright> 9 // 10 // Blog: https://www.cnblogs.com/bfyx 11 // GitHub:https://github.com/kwwwvagaa/NetWinformControl 12 // gitee:https://gitee.com/kwwwvagaa/net_winform_custom_control.git 13 // 14 // If you use this code, please keep this note. 15 // *********************************************************************** 16 using System; 17 using System.Collections.Generic; 18 using System.ComponentModel; 19 using System.Drawing; 20 using System.Drawing.Drawing2D; 21 using System.Drawing.Text; 22 using System.Windows.Forms; 23 24 namespace HZH_Controls.Controls 25 { 26 /// <summary> 27 /// Class UCCurve. 28 /// Implements the <see cref="System.Windows.Forms.UserControl" /> 29 /// </summary> 30 /// <seealso cref="System.Windows.Forms.UserControl" /> 31 public class UCCurve : UserControl 32 { 33 /// <summary> 34 /// The value count maximum 35 /// </summary> 36 private const int value_count_max = 4096; 37 38 /// <summary> 39 /// The value maximum left 40 /// </summary> 41 private float value_max_left = 100f; 42 43 /// <summary> 44 /// The value minimum left 45 /// </summary> 46 private float value_min_left = 0f; 47 48 /// <summary> 49 /// The value maximum right 50 /// </summary> 51 private float value_max_right = 100f; 52 53 /// <summary> 54 /// The value minimum right 55 /// </summary> 56 private float value_min_right = 0f; 57 58 /// <summary> 59 /// The value segment 60 /// </summary> 61 private int value_Segment = 5; 62 63 /// <summary> 64 /// The value is abscissa strech 65 /// </summary> 66 private bool value_IsAbscissaStrech = false; 67 68 /// <summary> 69 /// The value strech data count maximum 70 /// </summary> 71 private int value_StrechDataCountMax = 300; 72 73 /// <summary> 74 /// The value is render dash line 75 /// </summary> 76 private bool value_IsRenderDashLine = true; 77 78 /// <summary> 79 /// The text format 80 /// </summary> 81 private string textFormat = "HH:mm"; 82 83 /// <summary> 84 /// The value interval abscissa text 85 /// </summary> 86 private int value_IntervalAbscissaText = 100; 87 88 /// <summary> 89 /// The random 90 /// </summary> 91 private Random random = null; 92 93 /// <summary> 94 /// The value title 95 /// </summary> 96 private string value_title = ""; 97 98 /// <summary> 99 /// The left right 100 /// </summary> 101 private int leftRight = 50; 102 103 /// <summary> 104 /// Up dowm 105 /// </summary> 106 private int upDowm = 50; 107 108 /// <summary> 109 /// The data list 110 /// </summary> 111 private Dictionary<string, CurveItem> data_list = null; 112 113 /// <summary> 114 /// The data text 115 /// </summary> 116 private string[] data_text = null; 117 118 /// <summary> 119 /// The auxiliary lines 120 /// </summary> 121 private List<AuxiliaryLine> auxiliary_lines; 122 123 /// <summary> 124 /// The auxiliary labels 125 /// </summary> 126 private List<AuxiliaryLable> auxiliary_Labels; 127 128 /// <summary> 129 /// The mark texts 130 /// </summary> 131 private List<MarkText> MarkTexts; 132 133 /// <summary> 134 /// The font size9 135 /// </summary> 136 private Font font_size9 = null; 137 138 /// <summary> 139 /// The font size12 140 /// </summary> 141 private Font font_size12 = null; 142 143 /// <summary> 144 /// The brush deep 145 /// </summary> 146 private Brush brush_deep = null; 147 148 /// <summary> 149 /// The pen normal 150 /// </summary> 151 private Pen pen_normal = null; 152 153 /// <summary> 154 /// The pen dash 155 /// </summary> 156 private Pen pen_dash = null; 157 158 /// <summary> 159 /// The color normal 160 /// </summary> 161 private Color color_normal = Color.DeepPink; 162 163 /// <summary> 164 /// The color deep 165 /// </summary> 166 private Color color_deep = Color.DimGray; 167 168 /// <summary> 169 /// The color dash 170 /// </summary> 171 private Color color_dash = Color.FromArgb(232, 232, 232); 172 173 /// <summary> 174 /// The color mark font 175 /// </summary> 176 private Color color_mark_font = Color.DodgerBlue; 177 178 /// <summary> 179 /// The brush mark font 180 /// </summary> 181 private Brush brush_mark_font = Brushes.DodgerBlue; 182 183 /// <summary> 184 /// The format left 185 /// </summary> 186 private StringFormat format_left = null; 187 188 /// <summary> 189 /// The format right 190 /// </summary> 191 private StringFormat format_right = null; 192 193 /// <summary> 194 /// The format center 195 /// </summary> 196 private StringFormat format_center = null; 197 198 /// <summary> 199 /// The is render right coordinate 200 /// </summary> 201 private bool isRenderRightCoordinate = true; 202 203 /// <summary> 204 /// The curve name width 205 /// </summary> 206 private int curveNameWidth = 100; 207 208 /// <summary> 209 /// The components 210 /// </summary> 211 private IContainer components = null; 212 213 /// <summary> 214 /// 获取或设置控件的背景色。 215 /// </summary> 216 /// <value>The color of the back.</value> 217 /// <PermissionSet> 218 /// <IPermission class="System.Security.Permissions.FileIOPermission, mscorlib, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Unrestricted="true" /> 219 /// </PermissionSet> 220 [Browsable(true)] 221 [Description("获取或设置控件的背景色")] 222 [Category("自定义")] 223 [DefaultValue(typeof(Color), "Transparent")] 224 [EditorBrowsable(EditorBrowsableState.Always)] 225 public override Color BackColor 226 { 227 get 228 { 229 return base.BackColor; 230 } 231 set 232 { 233 base.BackColor = value; 234 } 235 } 236 237 /// <summary> 238 /// Gets or sets the value maximum left. 239 /// </summary> 240 /// <value>The value maximum left.</value> 241 [Category("自定义")] 242 [Description("获取或设置图形的左纵坐标的最大值,该值必须大于最小值")] 243 [Browsable(true)] 244 [DefaultValue(100f)] 245 public float ValueMaxLeft 246 { 247 get 248 { 249 return value_max_left; 250 } 251 set 252 { 253 value_max_left = value; 254 Invalidate(); 255 } 256 } 257 258 /// <summary> 259 /// Gets or sets the value minimum left. 260 /// </summary> 261 /// <value>The value minimum left.</value> 262 [Category("自定义")] 263 [Description("获取或设置图形的左纵坐标的最小值,该值必须小于最大值")] 264 [Browsable(true)] 265 [DefaultValue(0f)] 266 public float ValueMinLeft 267 { 268 get 269 { 270 return value_min_left; 271 } 272 set 273 { 274 value_min_left = value; 275 Invalidate(); 276 } 277 } 278 279 /// <summary> 280 /// Gets or sets the value maximum right. 281 /// </summary> 282 /// <value>The value maximum right.</value> 283 [Category("自定义")] 284 [Description("获取或设置图形的右纵坐标的最大值,该值必须大于最小值")] 285 [Browsable(true)] 286 [DefaultValue(100f)] 287 public float ValueMaxRight 288 { 289 get 290 { 291 return value_max_right; 292 } 293 set 294 { 295 value_max_right = value; 296 Invalidate(); 297 } 298 } 299 300 /// <summary> 301 /// Gets or sets the value minimum right. 302 /// </summary> 303 /// <value>The value minimum right.</value> 304 [Category("自定义")] 305 [Description("获取或设置图形的右纵坐标的最小值,该值必须小于最大值")] 306 [Browsable(true)] 307 [DefaultValue(0f)] 308 public float ValueMinRight 309 { 310 get 311 { 312 return value_min_right; 313 } 314 set 315 { 316 value_min_right = value; 317 Invalidate(); 318 } 319 } 320 321 /// <summary> 322 /// Gets or sets the value segment. 323 /// </summary> 324 /// <value>The value segment.</value> 325 [Category("自定义")] 326 [Description("获取或设置图形的纵轴分段数")] 327 [Browsable(true)] 328 [DefaultValue(5)] 329 public int ValueSegment 330 { 331 get 332 { 333 return value_Segment; 334 } 335 set 336 { 337 value_Segment = value; 338 Invalidate(); 339 } 340 } 341 342 /// <summary> 343 /// Gets or sets a value indicating whether this instance is abscissa strech. 344 /// </summary> 345 /// <value><c>true</c> if this instance is abscissa strech; otherwise, <c>false</c>.</value> 346 [Category("自定义")] 347 [Description("获取或设置所有的数据是否强制在一个界面里显示")] 348 [Browsable(true)] 349 [DefaultValue(false)] 350 public bool IsAbscissaStrech 351 { 352 get 353 { 354 return value_IsAbscissaStrech; 355 } 356 set 357 { 358 value_IsAbscissaStrech = value; 359 Invalidate(); 360 } 361 } 362 363 /// <summary> 364 /// Gets or sets the strech data count maximum. 365 /// </summary> 366 /// <value>The strech data count maximum.</value> 367 [Category("自定义")] 368 [Description("获取或设置拉伸模式下的最大数据量")] 369 [Browsable(true)] 370 [DefaultValue(300)] 371 public int StrechDataCountMax 372 { 373 get 374 { 375 return value_StrechDataCountMax; 376 } 377 set 378 { 379 value_StrechDataCountMax = value; 380 Invalidate(); 381 } 382 } 383 384 /// <summary> 385 /// Gets or sets a value indicating whether this instance is render dash line. 386 /// </summary> 387 /// <value><c>true</c> if this instance is render dash line; otherwise, <c>false</c>.</value> 388 [Category("自定义")] 389 [Description("获取或设置虚线是否进行显示")] 390 [Browsable(true)] 391 [DefaultValue(true)] 392 public bool IsRenderDashLine 393 { 394 get 395 { 396 return value_IsRenderDashLine; 397 } 398 set 399 { 400 value_IsRenderDashLine = value; 401 Invalidate(); 402 } 403 } 404 405 /// <summary> 406 /// Gets or sets the color lines and text. 407 /// </summary> 408 /// <value>The color lines and text.</value> 409 [Category("自定义")] 410 [Description("获取或设置坐标轴及相关信息文本的颜色")] 411 [Browsable(true)] 412 [DefaultValue(typeof(Color), "DimGray")] 413 public Color ColorLinesAndText 414 { 415 get 416 { 417 return color_deep; 418 } 419 set 420 { 421 color_deep = value; 422 InitializationColor(); 423 Invalidate(); 424 } 425 } 426 427 /// <summary> 428 /// Gets or sets the color dash lines. 429 /// </summary> 430 /// <value>The color dash lines.</value> 431 [Category("自定义")] 432 [Description("获取或设置虚线的颜色")] 433 [Browsable(true)] 434 public Color ColorDashLines 435 { 436 get 437 { 438 return color_dash; 439 } 440 set 441 { 442 color_dash = value; 443 if (pen_dash != null) 444 pen_dash.Dispose(); 445 pen_dash = new Pen(color_dash); 446 pen_dash.DashStyle = DashStyle.Custom; 447 pen_dash.DashPattern = new float[2] 448 { 449 5f, 450 5f 451 }; 452 Invalidate(); 453 } 454 } 455 456 /// <summary> 457 /// Gets or sets the interval abscissa text. 458 /// </summary> 459 /// <value>The interval abscissa text.</value> 460 [Category("自定义")] 461 [Description("获取或设置纵向虚线的分隔情况,单位为多少个数据")] 462 [Browsable(true)] 463 [DefaultValue(100)] 464 public int IntervalAbscissaText 465 { 466 get 467 { 468 return value_IntervalAbscissaText; 469 } 470 set 471 { 472 value_IntervalAbscissaText = value; 473 Invalidate(); 474 } 475 } 476 477 /// <summary> 478 /// Gets or sets the text add format. 479 /// </summary> 480 /// <value>The text add format.</value> 481 [Category("自定义")] 482 [Description("获取或设置实时数据新增时文本相对应于时间的格式化字符串,默认HH:mm")] 483 [Browsable(true)] 484 [DefaultValue("HH:mm")] 485 public string TextAddFormat 486 { 487 get 488 { 489 return textFormat; 490 } 491 set 492 { 493 textFormat = value; 494 Invalidate(); 495 } 496 } 497 498 /// <summary> 499 /// Gets or sets the title. 500 /// </summary> 501 /// <value>The title.</value> 502 [Category("自定义")] 503 [Description("获取或设置图标的标题信息")] 504 [Browsable(true)] 505 [DefaultValue("")] 506 public string Title 507 { 508 get 509 { 510 return value_title; 511 } 512 set 513 { 514 value_title = value; 515 Invalidate(); 516 } 517 } 518 519 /// <summary> 520 /// Gets or sets a value indicating whether this instance is render right coordinate. 521 /// </summary> 522 /// <value><c>true</c> if this instance is render right coordinate; otherwise, <c>false</c>.</value> 523 [Category("自定义")] 524 [Description("获取或设置是否显示右侧的坐标系信息")] 525 [Browsable(true)] 526 [DefaultValue(true)] 527 public bool IsRenderRightCoordinate 528 { 529 get 530 { 531 return isRenderRightCoordinate; 532 } 533 set 534 { 535 isRenderRightCoordinate = value; 536 Invalidate(); 537 } 538 } 539 540 /// <summary> 541 /// Gets or sets the width of the curve name. 542 /// </summary> 543 /// <value>The width of the curve name.</value> 544 [Browsable(true)] 545 [Description("获取或设置曲线名称的布局宽度")] 546 [Category("自定义")] 547 [DefaultValue(100)] 548 public int CurveNameWidth 549 { 550 get 551 { 552 return curveNameWidth; 553 } 554 set 555 { 556 if (value > 10) 557 { 558 curveNameWidth = value; 559 } 560 } 561 } 562 563 /// <summary> 564 /// Initializes a new instance of the <see cref="UCCurve" /> class. 565 /// </summary> 566 public UCCurve() 567 { 568 InitializeComponent(); 569 random = new Random(); 570 data_list = new Dictionary<string, CurveItem>(); 571 auxiliary_lines = new List<AuxiliaryLine>(); 572 MarkTexts = new List<MarkText>(); 573 auxiliary_Labels = new List<AuxiliaryLable>(); 574 format_left = new StringFormat 575 { 576 LineAlignment = StringAlignment.Center, 577 Alignment = StringAlignment.Near 578 }; 579 format_right = new StringFormat 580 { 581 LineAlignment = StringAlignment.Center, 582 Alignment = StringAlignment.Far 583 }; 584 format_center = new StringFormat 585 { 586 LineAlignment = StringAlignment.Center, 587 Alignment = StringAlignment.Center 588 }; 589 font_size9 = new Font("微软雅黑", 9f); 590 font_size12 = new Font("微软雅黑", 12f); 591 InitializationColor(); 592 pen_dash = new Pen(color_deep); 593 pen_dash.DashStyle = DashStyle.Custom; 594 pen_dash.DashPattern = new float[2] 595 { 596 5f, 597 5f 598 }; 599 SetStyle(ControlStyles.UserPaint | ControlStyles.SupportsTransparentBackColor, true); 600 SetStyle(ControlStyles.ResizeRedraw, true); 601 SetStyle(ControlStyles.OptimizedDoubleBuffer, true); 602 SetStyle(ControlStyles.AllPaintingInWmPaint, true); 603 } 604 605 /// <summary> 606 /// Initializations the color. 607 /// </summary> 608 private void InitializationColor() 609 { 610 if (pen_normal != null) 611 pen_normal.Dispose(); 612 if (brush_deep != null) 613 brush_deep.Dispose(); 614 pen_normal = new Pen(color_deep); 615 brush_deep = new SolidBrush(color_deep); 616 } 617 618 /// <summary> 619 /// Sets the curve text. 620 /// </summary> 621 /// <param name="descriptions">The descriptions.</param> 622 public void SetCurveText(string[] descriptions) 623 { 624 data_text = descriptions; 625 Invalidate(); 626 } 627 628 /// <summary> 629 /// Sets the left curve. 630 /// </summary> 631 /// <param name="key">The key.</param> 632 /// <param name="data">The data.</param> 633 /// <param name="lineColor">Color of the line.</param> 634 public void SetLeftCurve(string key, float[] data, Color? lineColor = null) 635 { 636 SetCurve(key, true, data, lineColor, 1f, false); 637 } 638 639 /// <summary> 640 /// Sets the left curve. 641 /// </summary> 642 /// <param name="key">The key.</param> 643 /// <param name="data">The data.</param> 644 /// <param name="lineColor">Color of the line.</param> 645 /// <param name="isSmooth">if set to <c>true</c> [is smooth].</param> 646 public void SetLeftCurve(string key, float[] data, Color? lineColor, bool isSmooth = false) 647 { 648 SetCurve(key, true, data, lineColor, 1f, isSmooth); 649 } 650 651 /// <summary> 652 /// Sets the right curve. 653 /// </summary> 654 /// <param name="key">The key.</param> 655 /// <param name="data">The data.</param> 656 /// <param name="lineColor">Color of the line.</param> 657 public void SetRightCurve(string key, float[] data, Color? lineColor = null) 658 { 659 SetCurve(key, false, data, lineColor, 1f, false); 660 } 661 662 /// <summary> 663 /// Sets the right curve. 664 /// </summary> 665 /// <param name="key">The key.</param> 666 /// <param name="data">The data.</param> 667 /// <param name="lineColor">Color of the line.</param> 668 /// <param name="isSmooth">if set to <c>true</c> [is smooth].</param> 669 public void SetRightCurve(string key, float[] data, Color? lineColor, bool isSmooth = false) 670 { 671 SetCurve(key, false, data, lineColor, 1f, isSmooth); 672 } 673 674 /// <summary> 675 /// Sets the curve. 676 /// </summary> 677 /// <param name="key">The key.</param> 678 /// <param name="isLeft">if set to <c>true</c> [is left].</param> 679 /// <param name="data">The data.</param> 680 /// <param name="lineColor">Color of the line.</param> 681 /// <param name="thickness">The thickness.</param> 682 /// <param name="isSmooth">if set to <c>true</c> [is smooth].</param> 683 public void SetCurve(string key, bool isLeft, float[] data, Color? lineColor, float thickness, bool isSmooth) 684 { 685 if (data_list.ContainsKey(key)) 686 { 687 if (data == null) 688 { 689 data = new float[0]; 690 } 691 data_list[key].Data = data; 692 } 693 else 694 { 695 if (data == null) 696 { 697 data = new float[0]; 698 } 699 data_list.Add(key, new CurveItem 700 { 701 Data = data, 702 MarkText = new string[data.Length], 703 LineThickness = thickness, 704 LineColor = lineColor ?? ControlHelper.Colors[data_list.Count + 13], 705 IsLeftFrame = isLeft, 706 IsSmoothCurve = isSmooth 707 }); 708 if (data_text == null) 709 { 710 data_text = new string[data.Length]; 711 } 712 } 713 Invalidate(); 714 } 715 716 /// <summary> 717 /// Removes the curve. 718 /// </summary> 719 /// <param name="key">The key.</param> 720 public void RemoveCurve(string key) 721 { 722 if (data_list.ContainsKey(key)) 723 { 724 data_list.Remove(key); 725 } 726 if (data_list.Count == 0) 727 { 728 data_text = new string[0]; 729 } 730 Invalidate(); 731 } 732 733 /// <summary> 734 /// Removes all curve. 735 /// </summary> 736 public void RemoveAllCurve() 737 { 738 int count = data_list.Count; 739 data_list.Clear(); 740 if (data_list.Count == 0) 741 { 742 data_text = new string[0]; 743 } 744 if (count > 0) 745 { 746 Invalidate(); 747 } 748 } 749 750 /// <summary> 751 /// Removes all curve data. 752 /// </summary> 753 public void RemoveAllCurveData() 754 { 755 int count = data_list.Count; 756 foreach (KeyValuePair<string, CurveItem> item in data_list) 757 { 758 item.Value.Data = new float[0]; 759 item.Value.MarkText = new string[0]; 760 } 761 data_text = new string[0]; 762 if (count > 0) 763 { 764 Invalidate(); 765 } 766 } 767 768 /// <summary> 769 /// Gets the curve item. 770 /// </summary> 771 /// <param name="key">The key.</param> 772 /// <returns>CurveItem.</returns> 773 public CurveItem GetCurveItem(string key) 774 { 775 if (data_list.ContainsKey(key)) 776 { 777 return data_list[key]; 778 } 779 return null; 780 } 781 782 /// <summary> 783 /// Saves to bitmap. 784 /// </summary> 785 /// <returns>Bitmap.</returns> 786 public Bitmap SaveToBitmap() 787 { 788 return SaveToBitmap(base.Width, base.Height); 789 } 790 791 /// <summary> 792 /// Saves to bitmap. 793 /// </summary> 794 /// <param name="width">The width.</param> 795 /// <param name="height">The height.</param> 796 /// <returns>Bitmap.</returns> 797 public Bitmap SaveToBitmap(int width, int height) 798 { 799 Bitmap bitmap = new Bitmap(width, height); 800 Graphics graphics = Graphics.FromImage(bitmap); 801 OnPaint(new PaintEventArgs(graphics, new Rectangle(0, 0, width, height))); 802 return bitmap; 803 } 804 805 /// <summary> 806 /// Adds the curve data. 807 /// </summary> 808 /// <param name="key">The key.</param> 809 /// <param name="values">The values.</param> 810 /// <param name="markTexts">The mark texts.</param> 811 /// <param name="isUpdateUI">if set to <c>true</c> [is update UI].</param> 812 private void AddCurveData(string key, float[] values, string[] markTexts, bool isUpdateUI) 813 { 814 if ((values != null && values.Length < 1) || !data_list.ContainsKey(key)) 815 { 816 return; 817 } 818 CurveItem CurveItem = data_list[key]; 819 if (CurveItem.Data != null) 820 { 821 if (value_IsAbscissaStrech) 822 { 823 ControlHelper.AddArrayData(ref CurveItem.Data, values, value_StrechDataCountMax); 824 ControlHelper.AddArrayData(ref CurveItem.MarkText, markTexts, value_StrechDataCountMax); 825 } 826 else 827 { 828 ControlHelper.AddArrayData(ref CurveItem.Data, values, 4096); 829 ControlHelper.AddArrayData(ref CurveItem.MarkText, markTexts, 4096); 830 } 831 if (isUpdateUI) 832 { 833 Invalidate(); 834 } 835 } 836 } 837 838 /// <summary> 839 /// Adds the curve time. 840 /// </summary> 841 /// <param name="count">The count.</param> 842 private void AddCurveTime(int count) 843 { 844 AddCurveTime(count, DateTime.Now.ToString(textFormat)); 845 } 846 847 /// <summary> 848 /// Adds the curve time. 849 /// </summary> 850 /// <param name="count">The count.</param> 851 /// <param name="text">The text.</param> 852 private void AddCurveTime(int count, string text) 853 { 854 if (data_text != null) 855 { 856 string[] array = new string[count]; 857 for (int i = 0; i < array.Length; i++) 858 { 859 array[i] = text; 860 } 861 if (value_IsAbscissaStrech) 862 { 863 ControlHelper.AddArrayData(ref data_text, array, value_StrechDataCountMax); 864 } 865 else 866 { 867 ControlHelper.AddArrayData(ref data_text, array, 4096); 868 } 869 } 870 } 871 872 /// <summary> 873 /// Adds the curve data. 874 /// </summary> 875 /// <param name="key">The key.</param> 876 /// <param name="value">The value.</param> 877 public void AddCurveData(string key, float value) 878 { 879 AddCurveData(key, new float[1] 880 { 881 value 882 }); 883 } 884 885 /// <summary> 886 /// Adds the curve data. 887 /// </summary> 888 /// <param name="key">The key.</param> 889 /// <param name="value">The value.</param> 890 /// <param name="markText">The mark text.</param> 891 public void AddCurveData(string key, float value, string markText) 892 { 893 AddCurveData(key, new float[1] 894 { 895 value 896 }, new string[1] 897 { 898 markText 899 }); 900 } 901 902 /// <summary> 903 /// Adds the curve data. 904 /// </summary> 905 /// <param name="key">The key.</param> 906 /// <param name="values">The values.</param> 907 public void AddCurveData(string key, float[] values) 908 { 909 AddCurveData(key, values, null); 910 } 911 912 /// <summary> 913 /// Adds the curve data. 914 /// </summary> 915 /// <param name="key">The key.</param> 916 /// <param name="values">The values.</param> 917 /// <param name="markTexts">The mark texts.</param> 918 public void AddCurveData(string key, float[] values, string[] markTexts) 919 { 920 if (markTexts == null) 921 { 922 markTexts = new string[values.Length]; 923 } 924 AddCurveData(key, values, markTexts, false); 925 if (values != null && values.Length != 0) 926 { 927 AddCurveTime(values.Length); 928 } 929 Invalidate(); 930 } 931 932 /// <summary> 933 /// Adds the curve data. 934 /// </summary> 935 /// <param name="keys">The keys.</param> 936 /// <param name="values">The values.</param> 937 public void AddCurveData(string[] keys, float[] values) 938 { 939 AddCurveData(keys, values, null); 940 } 941 942 /// <summary> 943 /// Adds the curve data. 944 /// </summary> 945 /// <param name="axisText">The axis text.</param> 946 /// <param name="keys">The keys.</param> 947 /// <param name="values">The values.</param> 948 public void AddCurveData(string axisText, string[] keys, float[] values) 949 { 950 AddCurveData(axisText, keys, values, null); 951 } 952 953 /// <summary> 954 /// Adds the curve data. 955 /// </summary> 956 /// <param name="keys">The keys.</param> 957 /// <param name="values">The values.</param> 958 /// <param name="markTexts">The mark texts.</param> 959 /// <exception cref="ArgumentNullException">keys 960 /// or 961 /// values</exception> 962 /// <exception cref="Exception">两个参数的数组长度不一致。 963 /// or 964 /// 两个参数的数组长度不一致。</exception> 965 public void AddCurveData(string[] keys, float[] values, string[] markTexts) 966 { 967 if (keys == null) 968 { 969 throw new ArgumentNullException("keys"); 970 } 971 if (values == null) 972 { 973 throw new ArgumentNullException("values"); 974 } 975 if (markTexts == null) 976 { 977 markTexts = new string[keys.Length]; 978 } 979 if (keys.Length != values.Length) 980 { 981 throw new Exception("两个参数的数组长度不一致。"); 982 } 983 if (keys.Length != markTexts.Length) 984 { 985 throw new Exception("两个参数的数组长度不一致。"); 986 } 987 for (int i = 0; i < keys.Length; i++) 988 { 989 AddCurveData(keys[i], new float[1] 990 { 991 values[i] 992 }, new string[1] 993 { 994 markTexts[i] 995 }, false); 996 } 997 AddCurveTime(1); 998 Invalidate(); 999 } 1000 1001 /// <summary> 1002 /// Adds the curve data. 1003 /// </summary> 1004 /// <param name="axisText">The axis text.</param> 1005 /// <param name="keys">The keys.</param> 1006 /// <param name="values">The values.</param> 1007 /// <param name="markTexts">The mark texts.</param> 1008 /// <exception cref="ArgumentNullException">keys 1009 /// or 1010 /// values</exception> 1011 /// <exception cref="Exception">两个参数的数组长度不一致。 1012 /// or 1013 /// 两个参数的数组长度不一致。</exception> 1014 public void AddCurveData(string axisText, string[] keys, float[] values, string[] markTexts) 1015 { 1016 if (keys == null) 1017 { 1018 throw new ArgumentNullException("keys"); 1019 } 1020 if (values == null) 1021 { 1022 throw new ArgumentNullException("values"); 1023 } 1024 if (markTexts == null) 1025 { 1026 markTexts = new string[keys.Length]; 1027 } 1028 if (keys.Length != values.Length) 1029 { 1030 throw new Exception("两个参数的数组长度不一致。"); 1031 } 1032 if (keys.Length != markTexts.Length) 1033 { 1034 throw new Exception("两个参数的数组长度不一致。"); 1035 } 1036 for (int i = 0; i < keys.Length; i++) 1037 { 1038 AddCurveData(keys[i], new float[1] 1039 { 1040 values[i] 1041 }, new string[1] 1042 { 1043 markTexts[i] 1044 }, false); 1045 } 1046 AddCurveTime(1, axisText); 1047 Invalidate(); 1048 } 1049 1050 /// <summary> 1051 /// Sets the curve visible. 1052 /// </summary> 1053 /// <param name="key">The key.</param> 1054 /// <param name="visible">if set to <c>true</c> [visible].</param> 1055 public void SetCurveVisible(string key, bool visible) 1056 { 1057 if (data_list.ContainsKey(key)) 1058 { 1059 CurveItem CurveItem = data_list[key]; 1060 CurveItem.Visible = visible; 1061 Invalidate(); 1062 } 1063 } 1064 1065 /// <summary> 1066 /// Sets the curve visible. 1067 /// </summary> 1068 /// <param name="keys">The keys.</param> 1069 /// <param name="visible">if set to <c>true</c> [visible].</param> 1070 public void SetCurveVisible(string[] keys, bool visible) 1071 { 1072 foreach (string key in keys) 1073 { 1074 if (data_list.ContainsKey(key)) 1075 { 1076 CurveItem CurveItem = data_list[key]; 1077 CurveItem.Visible = visible; 1078 } 1079 } 1080 Invalidate(); 1081 } 1082 1083 /// <summary> 1084 /// Adds the left auxiliary. 1085 /// </summary> 1086 /// <param name="value">The value.</param> 1087 public void AddLeftAuxiliary(float value) 1088 { 1089 AddLeftAuxiliary(value, ColorLinesAndText); 1090 } 1091 1092 /// <summary> 1093 /// Adds the left auxiliary. 1094 /// </summary> 1095 /// <param name="value">The value.</param> 1096 /// <param name="lineColor">Color of the line.</param> 1097 public void AddLeftAuxiliary(float value, Color lineColor) 1098 { 1099 AddLeftAuxiliary(value, lineColor, 1f, true); 1100 } 1101 1102 /// <summary> 1103 /// Adds the left auxiliary. 1104 /// </summary> 1105 /// <param name="value">The value.</param> 1106 /// <param name="lineColor">Color of the line.</param> 1107 /// <param name="lineThickness">The line thickness.</param> 1108 /// <param name="isDashLine">if set to <c>true</c> [is dash line].</param> 1109 public void AddLeftAuxiliary(float value, Color lineColor, float lineThickness, bool isDashLine) 1110 { 1111 AddAuxiliary(value, lineColor, lineThickness, isDashLine, true); 1112 } 1113 1114 /// <summary> 1115 /// Adds the right auxiliary. 1116 /// </summary> 1117 /// <param name="value">The value.</param> 1118 public void AddRightAuxiliary(float value) 1119 { 1120 AddRightAuxiliary(value, ColorLinesAndText); 1121 } 1122 1123 /// <summary> 1124 /// Adds the right auxiliary. 1125 /// </summary> 1126 /// <param name="value">The value.</param> 1127 /// <param name="lineColor">Color of the line.</param> 1128 public void AddRightAuxiliary(float value, Color lineColor) 1129 { 1130 AddRightAuxiliary(value, lineColor, 1f, true); 1131 } 1132 1133 /// <summary> 1134 /// Adds the right auxiliary. 1135 /// </summary> 1136 /// <param name="value">The value.</param> 1137 /// <param name="lineColor">Color of the line.</param> 1138 /// <param name="lineThickness">The line thickness.</param> 1139 /// <param name="isDashLine">if set to <c>true</c> [is dash line].</param> 1140 public void AddRightAuxiliary(float value, Color lineColor, float lineThickness, bool isDashLine) 1141 { 1142 AddAuxiliary(value, lineColor, lineThickness, isDashLine, false); 1143 } 1144 1145 /// <summary> 1146 /// Adds the auxiliary. 1147 /// </summary> 1148 /// <param name="value">The value.</param> 1149 /// <param name="lineColor">Color of the line.</param> 1150 /// <param name="lineThickness">The line thickness.</param> 1151 /// <param name="isDashLine">if set to <c>true</c> [is dash line].</param> 1152 /// <param name="isLeft">if set to <c>true</c> [is left].</param> 1153 private void AddAuxiliary(float value, Color lineColor, float lineThickness, bool isDashLine, bool isLeft) 1154 { 1155 auxiliary_lines.Add(new AuxiliaryLine 1156 { 1157 Value = value, 1158 LineColor = lineColor, 1159 PenDash = new Pen(lineColor) 1160 { 1161 DashStyle = DashStyle.Custom, 1162 DashPattern = new float[2] 1163 { 1164 5f, 1165 5f 1166 } 1167 }, 1168 PenSolid = new Pen(lineColor), 1169 IsDashStyle = isDashLine, 1170 IsLeftFrame = isLeft, 1171 LineThickness = lineThickness, 1172 LineTextBrush = new SolidBrush(lineColor) 1173 }); 1174 Invalidate(); 1175 } 1176 1177 /// <summary> 1178 /// Removes the auxiliary. 1179 /// </summary> 1180 /// <param name="value">The value.</param> 1181 public void RemoveAuxiliary(float value) 1182 { 1183 int num = 0; 1184 for (int num2 = auxiliary_lines.Count - 1; num2 >= 0; num2--) 1185 { 1186 if (auxiliary_lines[num2].Value == value) 1187 { 1188 auxiliary_lines[num2].Dispose(); 1189 auxiliary_lines.RemoveAt(num2); 1190 num++; 1191 } 1192 } 1193 if (num > 0) 1194 { 1195 Invalidate(); 1196 } 1197 } 1198 1199 /// <summary> 1200 /// Removes all auxiliary. 1201 /// </summary> 1202 public void RemoveAllAuxiliary() 1203 { 1204 int count = auxiliary_lines.Count; 1205 auxiliary_lines.Clear(); 1206 if (count > 0) 1207 { 1208 Invalidate(); 1209 } 1210 } 1211 1212 /// <summary> 1213 /// Adds the auxiliary label. 1214 /// </summary> 1215 /// <param name="auxiliaryLable">The auxiliary lable.</param> 1216 public void AddAuxiliaryLabel(AuxiliaryLable auxiliaryLable) 1217 { 1218 auxiliary_Labels.Add(auxiliaryLable); 1219 } 1220 1221 /// <summary> 1222 /// Removes the auxiliary lable. 1223 /// </summary> 1224 /// <param name="auxiliaryLable">The auxiliary lable.</param> 1225 public void RemoveAuxiliaryLable(AuxiliaryLable auxiliaryLable) 1226 { 1227 if (auxiliary_Labels.Remove(auxiliaryLable)) 1228 { 1229 Invalidate(); 1230 } 1231 } 1232 1233 /// <summary> 1234 /// Removes all auxiliary lable. 1235 /// </summary> 1236 public void RemoveAllAuxiliaryLable() 1237 { 1238 int count = auxiliary_Labels.Count; 1239 auxiliary_Labels.Clear(); 1240 if (count > 0) 1241 { 1242 Invalidate(); 1243 } 1244 } 1245 1246 /// <summary> 1247 /// Adds the mark text. 1248 /// </summary> 1249 /// <param name="markText">The mark text.</param> 1250 public void AddMarkText(MarkText markText) 1251 { 1252 MarkTexts.Add(markText); 1253 if (data_list.Count > 0) 1254 { 1255 Invalidate(); 1256 } 1257 } 1258 1259 /// <summary> 1260 /// Adds the mark text. 1261 /// </summary> 1262 /// <param name="strCurveKey">The string curve key.</param> 1263 /// <param name="intValueIndex">Index of the int value.</param> 1264 /// <param name="strText">The string text.</param> 1265 /// <param name="textColor">Color of the text.</param> 1266 public void AddMarkText(string strCurveKey, int intValueIndex, string strText, Color? textColor = null) 1267 { 1268 AddMarkText(new MarkText() { CurveKey = strCurveKey, PositionStyle = MarkTextPositionStyle.Auto, Text = strText, TextColor = textColor, Index = intValueIndex }); 1269 } 1270 1271 /// <summary> 1272 /// Removes the mark text. 1273 /// </summary> 1274 /// <param name="markText">The mark text.</param> 1275 public void RemoveMarkText(MarkText markText) 1276 { 1277 MarkTexts.Remove(markText); 1278 if (data_list.Count > 0) 1279 { 1280 Invalidate(); 1281 } 1282 } 1283 1284 /// <summary> 1285 /// Removes all mark text. 1286 /// </summary> 1287 public void RemoveAllMarkText() 1288 { 1289 MarkTexts.Clear(); 1290 if (data_list.Count > 0) 1291 { 1292 Invalidate(); 1293 } 1294 } 1295 1296 /// <summary> 1297 /// 引发 <see cref="E:System.Windows.Forms.Control.MouseMove" /> 事件。 1298 /// </summary> 1299 /// <param name="e">包含事件数据的 <see cref="T:System.Windows.Forms.MouseEventArgs" />。</param> 1300 protected override void OnMouseMove(MouseEventArgs e) 1301 { 1302 base.OnMouseMove(e); 1303 bool flag = false; 1304 foreach (KeyValuePair<string, CurveItem> item in data_list) 1305 { 1306 if (item.Value.TitleRegion.Contains(e.Location)) 1307 { 1308 flag = true; 1309 break; 1310 } 1311 } 1312 Cursor = (flag ? Cursors.Hand : Cursors.Arrow); 1313 } 1314 1315 /// <summary> 1316 /// Handles the <see cref="E:MouseDown" /> event. 1317 /// </summary> 1318 /// <param name="e">包含事件数据的 <see cref="T:System.Windows.Forms.MouseEventArgs" />。</param> 1319 protected override void OnMouseDown(MouseEventArgs e) 1320 { 1321 base.OnMouseDown(e); 1322 foreach (KeyValuePair<string, CurveItem> item in data_list) 1323 { 1324 if (item.Value.TitleRegion.Contains(e.Location)) 1325 { 1326 item.Value.LineRenderVisiable = !item.Value.LineRenderVisiable; 1327 Invalidate(); 1328 break; 1329 } 1330 } 1331 } 1332 1333 /// <summary> 1334 /// 引发 <see cref="E:System.Windows.Forms.Control.Paint" /> 事件。 1335 /// </summary> 1336 /// <param name="e">包含事件数据的 <see cref="T:System.Windows.Forms.PaintEventArgs" />。</param> 1337 protected override void OnPaint(PaintEventArgs e) 1338 { 1339 try 1340 { 1341 Graphics graphics = e.Graphics; 1342 graphics.SetGDIHigh(); 1343 if (BackColor != Color.Transparent) 1344 { 1345 graphics.Clear(BackColor); 1346 } 1347 int width = base.Width; 1348 int height = base.Height; 1349 if (width < 120 || height < 60) 1350 { 1351 return; 1352 } 1353 Point[] array = new Point[4] 1354 { 1355 new Point(leftRight - 1, upDowm - 8), 1356 new Point(leftRight - 1, height - upDowm), 1357 new Point(width - leftRight, height - upDowm), 1358 new Point(width - leftRight, upDowm - 8) 1359 }; 1360 graphics.DrawLine(pen_normal, array[0], array[1]); 1361 graphics.DrawLine(pen_normal, array[1], array[2]); 1362 if (isRenderRightCoordinate) 1363 { 1364 graphics.DrawLine(pen_normal, array[2], array[3]); 1365 } 1366 1367 if (!string.IsNullOrEmpty(value_title)) 1368 { 1369 graphics.DrawString(value_title, font_size9, brush_deep, new Rectangle(0, 0, width - 1, 20), format_center); 1370 } 1371 1372 if (data_list.Count > 0) 1373 { 1374 float num = leftRight + 10; 1375 foreach (KeyValuePair<string, CurveItem> item in data_list) 1376 { 1377 if (item.Value.Visible) 1378 { 1379 var titleSize=graphics.MeasureString(item.Key, Font); 1380 SolidBrush solidBrush = item.Value.LineRenderVisiable ? new SolidBrush(item.Value.LineColor) : new SolidBrush(Color.FromArgb(80, item.Value.LineColor)); 1381 graphics.FillRectangle(solidBrush, num + 8f, 24f, 20f, 14f); 1382 graphics.DrawString(item.Key, Font, solidBrush, new PointF(num + 30f, 24f+(14 - titleSize.Height) / 2)); 1383 item.Value.TitleRegion = new RectangleF(num, 24f, 60f, 18f); 1384 solidBrush.Dispose(); 1385 num += titleSize.Width + 30; 1386 } 1387 } 1388 } 1389 1390 1391 for (int i = 0; i < auxiliary_Labels.Count; i++) 1392 { 1393 if (!string.IsNullOrEmpty(auxiliary_Labels[i].Text)) 1394 { 1395 int num2 = (auxiliary_Labels[i].LocationX > 1f) ? ((int)auxiliary_Labels[i].LocationX) : ((int)(auxiliary_Labels[i].LocationX * (float)width)); 1396 int num3 = (int)graphics.MeasureString(auxiliary_Labels[i].Text, Font).Width + 3; 1397 Point[] points = new Point[6] 1398 { 1399 new Point(num2, 11), 1400 new Point(num2 + 10, 20), 1401 new Point(num2 + num3 + 10, 20), 1402 new Point(num2 + num3 + 10, 0), 1403 new Point(num2 + 10, 0), 1404 new Point(num2, 11) 1405 }; 1406 graphics.FillPolygon(auxiliary_Labels[i].TextBack, points); 1407 graphics.DrawString(auxiliary_Labels[i].Text, Font, auxiliary_Labels[i].TextBrush, new Rectangle(num2 + 7, 0, num3 + 3, 20), format_center); 1408 } 1409 } 1410 ControlHelper.PaintTriangle(graphics, brush_deep, new Point(leftRight - 1, upDowm - 8), 4, GraphDirection.Upward); 1411 if (isRenderRightCoordinate) 1412 { 1413 ControlHelper.PaintTriangle(graphics, brush_deep, new Point(width - leftRight, upDowm - 8), 4, GraphDirection.Upward); 1414 } 1415 for (int j = 0; j < auxiliary_lines.Count; j++) 1416 { 1417 if (auxiliary_lines[j].IsLeftFrame) 1418 { 1419 auxiliary_lines[j].PaintValue = ControlHelper.ComputePaintLocationY(value_max_left, value_min_left, height - upDowm - upDowm, auxiliary_lines[j].Value) + (float)upDowm; 1420 } 1421 else 1422 { 1423 auxiliary_lines[j].PaintValue = ControlHelper.ComputePaintLocationY(value_max_right, value_min_right, height - upDowm - upDowm, auxiliary_lines[j].Value) + (float)upDowm; 1424 } 1425 } 1426 for (int k = 0; k <= value_Segment; k++) 1427 { 1428 float value = (float)((double)k * (double)(value_max_left - value_min_left) / (double)value_Segment + (double)value_min_left); 1429 float num4 = ControlHelper.ComputePaintLocationY(value_max_left, value_min_left, height - upDowm - upDowm, value) + (float)upDowm; 1430 if (IsNeedPaintDash(num4)) 1431 { 1432 graphics.DrawLine(pen_normal, leftRight - 4, num4, leftRight - 1, num4); 1433 RectangleF layoutRectangle = new RectangleF(0f, num4 - 9f, leftRight - 4, 20f); 1434 graphics.DrawString(value.ToString(), font_size9, brush_deep, layoutRectangle, format_right); 1435 if (isRenderRightCoordinate) 1436 { 1437 float num5 = (float)k * (value_max_right - value_min_right) / (float)value_Segment + value_min_right; 1438 graphics.DrawLine(pen_normal, width - leftRight + 1, num4, width - leftRight + 4, num4); 1439 layoutRectangle.Location = new PointF(width - leftRight + 4, num4 - 9f); 1440 graphics.DrawString(num5.ToString(), font_size9, brush_deep, layoutRectangle, format_left); 1441 } 1442 if (k > 0 && value_IsRenderDashLine) 1443 { 1444 graphics.DrawLine(pen_dash, leftRight, num4, width - leftRight, num4); 1445 } 1446 } 1447 } 1448 if (value_IsRenderDashLine) 1449 { 1450 if (value_IsAbscissaStrech) 1451 { 1452 float num6 = (float)(width - leftRight * 2) * 1f / (float)(value_StrechDataCountMax - 1); 1453 int num7 = CalculateDataCountByOffect(num6); 1454 for (int l = 0; l < value_StrechDataCountMax; l += num7) 1455 { 1456 if (l > 0 && l < value_StrechDataCountMax - 1) 1457 { 1458 graphics.DrawLine(pen_dash, (float)l * num6 + (float)leftRight, upDowm, (float)l * num6 + (float)leftRight, height - upDowm - 1); 1459 } 1460 if (data_text != null && l < data_text.Length && (float)l * num6 + (float)leftRight < (float)(data_text.Length - 1) * num6 + (float)leftRight - 40f) 1461 { 1462 graphics.DrawString(layoutRectangle: new Rectangle((int)((float)l * num6), height - upDowm + 1, leftRight * 2, upDowm), s: data_text[l], font: font_size9, brush: brush_deep, format: format_center); 1463 } 1464 } 1465 string[] array2 = data_text; 1466 if (array2 != null && array2.Length > 1) 1467 { 1468 if (data_text.Length < value_StrechDataCountMax) 1469 { 1470 graphics.DrawLine(pen_dash, (float)(data_text.Length - 1) * num6 + (float)leftRight, upDowm, (float)(data_text.Length - 1) * num6 + (float)leftRight, height - upDowm - 1); 1471 } 1472 graphics.DrawString(layoutRectangle: new Rectangle((int)((float)(data_text.Length - 1) * num6 + (float)leftRight) - leftRight, height - upDowm + 1, leftRight * 2, upDowm), s: data_text[data_text.Length - 1], font: font_size9, brush: brush_deep, format: format_center); 1473 } 1474 } 1475 else if (value_IntervalAbscissaText > 0) 1476 { 1477 int num8 = width - 2 * leftRight + 1; 1478 for (int m = leftRight; m < width - leftRight; m += value_IntervalAbscissaText) 1479 { 1480 if (m != leftRight) 1481 { 1482 graphics.DrawLine(pen_dash, m, upDowm, m, height - upDowm - 1); 1483 } 1484 if (data_text == null) 1485 { 1486 continue; 1487 } 1488 int num9 = (num8 > data_text.Length) ? data_text.Length : num8; 1489 if (m - leftRight < data_text.Length && num9 - (m - leftRight) > 40) 1490 { 1491 if (data_text.Length <= num8) 1492 { 1493 graphics.DrawString(layoutRectangle: new Rectangle(m - leftRight, height - upDowm + 1, leftRight * 2, upDowm), s: data_text[m - leftRight], font: font_size9, brush: brush_deep, format: format_center); 1494 } 1495 else 1496 { 1497 graphics.DrawString(layoutRectangle: new Rectangle(m - leftRight, height - upDowm + 1, leftRight * 2, upDowm), s: data_text[m - leftRight + data_text.Length - num8], font: font_size9, brush: brush_deep, format: format_center); 1498 } 1499 } 1500 } 1501 string[] array3 = data_text; 1502 if (array3 != null && array3.Length > 1) 1503 { 1504 if (data_text.Length >= num8) 1505 { 1506 graphics.DrawString(layoutRectangle: new Rectangle(width - leftRight - leftRight, height - upDowm + 1, leftRight * 2, upDowm), s: data_text[data_text.Length - 1], font: font_size9, brush: brush_deep, format: format_center); 1507 } 1508 else 1509 { 1510 graphics.DrawLine(pen_dash, data_text.Length + leftRight - 1, upDowm, data_text.Length + leftRight - 1, height - upDowm - 1); 1511 graphics.DrawString(layoutRectangle: new Rectangle(data_text.Length + leftRight - 1 - leftRight, height - upDowm + 1, leftRight * 2, upDowm), s: data_text[data_text.Length - 1], font: font_size9, brush: brush_deep, format: format_center); 1512 } 1513 } 1514 } 1515 } 1516 for (int n = 0; n < auxiliary_lines.Count; n++) 1517 { 1518 if (auxiliary_lines[n].IsLeftFrame) 1519 { 1520 graphics.DrawLine(auxiliary_lines[n].GetPen(), leftRight - 4, auxiliary_lines[n].PaintValue, leftRight - 1, auxiliary_lines[n].PaintValue); 1521 graphics.DrawString(layoutRectangle: new RectangleF(0f, auxiliary_lines[n].PaintValue - 9f, leftRight - 4, 20f), s: auxiliary_lines[n].Value.ToString(), font: font_size9, brush: auxiliary_lines[n].LineTextBrush, format: format_right); 1522 } 1523 else 1524 { 1525 graphics.DrawLine(auxiliary_lines[n].GetPen(), width - leftRight + 1, auxiliary_lines[n].PaintValue, width - leftRight + 4, auxiliary_lines[n].PaintValue); 1526 graphics.DrawString(layoutRectangle: new RectangleF(width - leftRight + 4, auxiliary_lines[n].PaintValue - 9f, leftRight - 4, 20f), s: auxiliary_lines[n].Value.ToString(), font: font_size9, brush: auxiliary_lines[n].LineTextBrush, format: format_left); 1527 } 1528 graphics.DrawLine(auxiliary_lines[n].GetPen(), leftRight, auxiliary_lines[n].PaintValue, width - leftRight, auxiliary_lines[n].PaintValue); 1529 } 1530 if (value_IsAbscissaStrech) 1531 { 1532 foreach (MarkText MarkText in MarkTexts) 1533 { 1534 foreach (KeyValuePair<string, CurveItem> item2 in data_list) 1535 { 1536 if (item2.Value.Visible && item2.Value.LineRenderVisiable && !(item2.Key != MarkText.CurveKey)) 1537 { 1538 float[] data = item2.Value.Data; 1539 if (data != null && data.Length > 1) 1540 { 1541 float num10 = (float)(width - leftRight * 2) * 1f / (float)(value_StrechDataCountMax - 1); 1542 if (MarkText.Index >= 0 && MarkText.Index < item2.Value.Data.Length) 1543 { 1544 PointF pointF = new PointF((float)leftRight + (float)MarkText.Index * num10, ControlHelper.ComputePaintLocationY(item2.Value.IsLeftFrame ? value_max_left : value_max_right, item2.Value.IsLeftFrame ? value_min_left : value_min_right, height - upDowm - upDowm, item2.Value.Data[MarkText.Index]) + (float)upDowm); 1545 graphics.FillEllipse(new SolidBrush(MarkText.TextColor ?? item2.Value.LineColor), new RectangleF(pointF.X - 3f, pointF.Y - 3f, 6f, 6f)); 1546 switch ((MarkText.PositionStyle == MarkTextPositionStyle.Auto) ? MarkText.CalculateDirectionFromDataIndex(item2.Value.Data, MarkText.Index) : MarkText.PositionStyle) 1547 { 1548 case MarkTextPositionStyle.Left: 1549 graphics.DrawString(MarkText.Text, Font, new SolidBrush(MarkText.TextColor ?? item2.Value.LineColor), new RectangleF(pointF.X - 100f, pointF.Y - (float)Font.Height, 100 - MarkText.MarkTextOffect, Font.Height * 2), format_right); 1550 break; 1551 case MarkTextPositionStyle.Up: 1552 graphics.DrawString(MarkText.Text, Font, new SolidBrush(MarkText.TextColor ?? item2.Value.LineColor), new RectangleF(pointF.X - 100f, pointF.Y - (float)Font.Height - (float)MarkText.MarkTextOffect, 200f, Font.Height + 2), format_center); 1553 break; 1554 case MarkTextPositionStyle.Right: 1555 graphics.DrawString(MarkText.Text, Font, new SolidBrush(MarkText.TextColor ?? item2.Value.LineColor), new RectangleF(pointF.X + (float)MarkText.MarkTextOffect, pointF.Y - (float)Font.Height, 100f, Font.Height * 2), format_left); 1556 break; 1557 case MarkTextPositionStyle.Down: 1558 graphics.DrawString(MarkText.Text, Font, new SolidBrush(MarkText.TextColor ?? item2.Value.LineColor), new RectangleF(pointF.X - 100f, pointF.Y + (float)MarkText.MarkTextOffect, 200f, Font.Height + 2), format_center); 1559 break; 1560 } 1561 } 1562 } 1563 } 1564 } 1565 } 1566 foreach (CurveItem value2 in data_list.Values) 1567 { 1568 if (value2.Visible && value2.LineRenderVisiable) 1569 { 1570 float[] data2 = value2.Data; 1571 if (data2 != null && data2.Length > 1) 1572 { 1573 float num11 = (float)(width - leftRight * 2) * 1f / (float)(value_StrechDataCountMax - 1); 1574 PointF[] array4 = new PointF[value2.Data.Length]; 1575 for (int num12 = 0; num12 < value2.Data.Length; num12++) 1576 { 1577 array4[num12].X = (float)leftRight + (float)num12 * num11; 1578 array4[num12].Y = ControlHelper.ComputePaintLocationY(value2.IsLeftFrame ? value_max_left : value_max_right, value2.IsLeftFrame ? value_min_left : value_min_right, height - upDowm - upDowm, value2.Data[num12]) + (float)upDowm; 1579 if (!string.IsNullOrEmpty(value2.MarkText[num12])) 1580 { 1581 using (Brush brush = new SolidBrush(value2.LineColor)) 1582 { 1583 graphics.FillEllipse(brush, new RectangleF(array4[num12].X - 3f, array4[num12].Y - 3f, 6f, 6f)); 1584 switch (MarkText.CalculateDirectionFromDataIndex(value2.Data, num12)) 1585 { 1586 case MarkTextPositionStyle.Left: 1587 graphics.DrawString(value2.MarkText[num12], Font, brush, new RectangleF(array4[num12].X - 100f, array4[num12].Y - (float)Font.Height, 100 - MarkText.MarkTextOffect, Font.Height * 2), format_right); 1588 break; 1589 case MarkTextPositionStyle.Up: 1590 graphics.DrawString(value2.MarkText[num12], Font, brush, new RectangleF(array4[num12].X - 100f, array4[num12].Y - (float)Font.Height - (float)MarkText.MarkTextOffect, 200f, Font.Height + 2), format_center); 1591 break; 1592 case MarkTextPositionStyle.Right: 1593 graphics.DrawString(value2.MarkText[num12], Font, brush, new RectangleF(array4[num12].X + (float)MarkText.MarkTextOffect, array4[num12].Y - (float)Font.Height, 100f, Font.Height * 2), format_left); 1594 break; 1595 case MarkTextPositionStyle.Down: 1596 graphics.DrawString(value2.MarkText[num12], Font, brush, new RectangleF(array4[num12].X - 100f, array4[num12].Y + (float)MarkText.MarkTextOffect, 200f, Font.Height + 2), format_center); 1597 break; 1598 } 1599 } 1600 } 1601 } 1602 using (Pen pen2 = new Pen(value2.LineColor, value2.LineThickness)) 1603 { 1604 if (value2.IsSmoothCurve) 1605 { 1606 graphics.DrawCurve(pen2, array4); 1607 } 1608 else 1609 { 1610 graphics.DrawLines(pen2, array4); 1611 } 1612 } 1613 } 1614 } 1615 } 1616 } 1617 else 1618 { 1619 foreach (MarkText MarkText2 in MarkTexts) 1620 { 1621 foreach (KeyValuePair<string, CurveItem> item3 in data_list) 1622 { 1623 if (item3.Value.Visible && item3.Value.LineRenderVisiable && !(item3.Key != MarkText2.CurveKey)) 1624 { 1625 float[] data3 = item3.Value.Data; 1626 if (data3 != null && data3.Length > 1 && MarkText2.Index >= 0 && MarkText2.Index < item3.Value.Data.Length) 1627 { 1628 PointF pointF2 = new PointF(leftRight + MarkText2.Index, ControlHelper.ComputePaintLocationY(item3.Value.IsLeftFrame ? value_max_left : value_max_right, item3.Value.IsLeftFrame ? value_min_left : value_min_right, height - upDowm - upDowm, item3.Value.Data[MarkText2.Index]) + (float)upDowm); 1629 graphics.FillEllipse(new SolidBrush(MarkText2.TextColor ?? item3.Value.LineColor), new RectangleF(pointF2.X - 3f, pointF2.Y - 3f, 6f, 6f)); 1630 switch ((MarkText2.PositionStyle == MarkTextPositionStyle.Auto) ? MarkText.CalculateDirectionFromDataIndex(item3.Value.Data, MarkText2.Index) : MarkText2.PositionStyle) 1631 { 1632 case MarkTextPositionStyle.Left: 1633 graphics.DrawString(MarkText2.Text, Font, new SolidBrush(MarkText2.TextColor ?? item3.Value.LineColor), new RectangleF(pointF2.X - 100f, pointF2.Y - (float)Font.Height, 100 - MarkText.MarkTextOffect, Font.Height * 2), format_right); 1634 break; 1635 case MarkTextPositionStyle.Up: 1636 graphics.DrawString(MarkText2.Text, Font, new SolidBrush(MarkText2.TextColor ?? item3.Value.LineColor), new RectangleF(pointF2.X - 100f, pointF2.Y - (float)Font.Height - (float)MarkText.MarkTextOffect, 200f, Font.Height + 2), format_center); 1637 break; 1638 case MarkTextPositionStyle.Right: 1639 graphics.DrawString(MarkText2.Text, Font, new SolidBrush(MarkText2.TextColor ?? item3.Value.LineColor), new RectangleF(pointF2.X + (float)MarkText.MarkTextOffect, pointF2.Y - (float)Font.Height, 100f, Font.Height * 2), format_left); 1640 break; 1641 case MarkTextPositionStyle.Down: 1642 graphics.DrawString(MarkText2.Text, Font, new SolidBrush(MarkText2.TextColor ?? item3.Value.LineColor), new RectangleF(pointF2.X - 100f, pointF2.Y + (float)MarkText.MarkTextOffect, 200f, Font.Height + 2), format_center); 1643 break; 1644 } 1645 } 1646 } 1647 } 1648 } 1649 foreach (CurveItem value3 in data_list.Values) 1650 { 1651 if (value3.Visible && value3.LineRenderVisiable) 1652 { 1653 float[] data4 = value3.Data; 1654 if (data4 != null && data4.Length > 1) 1655 { 1656 int num13 = width - 2 * leftRight + 1; 1657 PointF[] array5; 1658 if (value3.Data.Length <= num13) 1659 { 1660 array5 = new PointF[value3.Data.Length]; 1661 for (int num14 = 0; num14 < value3.Data.Length; num14++) 1662 { 1663 array5[num14].X = leftRight + num14; 1664 array5[num14].Y = ControlHelper.ComputePaintLocationY(value3.IsLeftFrame ? value_max_left : value_max_right, value3.IsLeftFrame ? value_min_left : value_min_right, height - upDowm - upDowm, value3.Data[num14]) + (float)upDowm; 1665 DrawMarkPoint(graphics, value3.MarkText[num14], array5[num14], value3.LineColor, MarkText.CalculateDirectionFromDataIndex(value3.Data, num14)); 1666 } 1667 } 1668 else 1669 { 1670 array5 = new PointF[num13]; 1671 for (int num15 = 0; num15 < array5.Length; num15++) 1672 { 1673 int num16 = num15 + value3.Data.Length - num13; 1674 array5[num15].X = leftRight + num15; 1675 array5[num15].Y = ControlHelper.ComputePaintLocationY(value3.IsLeftFrame ? value_max_left : value_max_right, value3.IsLeftFrame ? value_min_left : value_min_right, height - upDowm - upDowm, value3.Data[num16]) + (float)upDowm; 1676 DrawMarkPoint(graphics, value3.MarkText[num16], array5[num15], value3.LineColor, MarkText.CalculateDirectionFromDataIndex(value3.Data, num16)); 1677 } 1678 } 1679 using (Pen pen3 = new Pen(value3.LineColor, value3.LineThickness)) 1680 { 1681 if (value3.IsSmoothCurve) 1682 { 1683 graphics.DrawCurve(pen3, array5); 1684 } 1685 else 1686 { 1687 graphics.DrawLines(pen3, array5); 1688 } 1689 } 1690 } 1691 } 1692 } 1693 } 1694 base.OnPaint(e); 1695 } 1696 catch (Exception exc) 1697 { 1698 e.Graphics.DrawString(exc.Message, this.Font, Brushes.Black, 10, 10); 1699 } 1700 } 1701 1702 /// <summary> 1703 /// Draws the mark point. 1704 /// </summary> 1705 /// <param name="g">The g.</param> 1706 /// <param name="markText">The mark text.</param> 1707 /// <param name="center">The center.</param> 1708 /// <param name="color">The color.</param> 1709 /// <param name="markTextPosition">The mark text position.</param> 1710 private void DrawMarkPoint(Graphics g, string markText, PointF center, Color color, MarkTextPositionStyle markTextPosition) 1711 { 1712 if (!string.IsNullOrEmpty(markText)) 1713 { 1714 using (Brush brush = new SolidBrush(color)) 1715 { 1716 DrawMarkPoint(g, markText, center, brush, markTextPosition); 1717 } 1718 } 1719 } 1720 1721 /// <summary> 1722 /// Draws the mark point. 1723 /// </summary> 1724 /// <param name="g">The g.</param> 1725 /// <param name="markText">The mark text.</param> 1726 /// <param name="center">The center.</param> 1727 /// <param name="brush">The brush.</param> 1728 /// <param name="markTextPosition">The mark text position.</param> 1729 private void DrawMarkPoint(Graphics g, string markText, PointF center, Brush brush, MarkTextPositionStyle markTextPosition) 1730 { 1731 if (!string.IsNullOrEmpty(markText)) 1732 { 1733 g.FillEllipse(brush, new RectangleF(center.X - 3f, center.Y - 3f, 6f, 6f)); 1734 switch (markTextPosition) 1735 { 1736 case MarkTextPositionStyle.Left: 1737 g.DrawString(markText, Font, brush, new RectangleF(center.X - 100f, center.Y - (float)Font.Height, 100 - MarkText.MarkTextOffect, Font.Height * 2), format_right); 1738 break; 1739 case MarkTextPositionStyle.Up: 1740 g.DrawString(markText, Font, brush, new RectangleF(center.X - 100f, center.Y - (float)Font.Height - (float)MarkText.MarkTextOffect, 200f, Font.Height + 2), format_center); 1741 break; 1742 case MarkTextPositionStyle.Right: 1743 g.DrawString(markText, Font, brush, new RectangleF(center.X + (float)MarkText.MarkTextOffect, center.Y - (float)Font.Height, 100f, Font.Height * 2), format_left); 1744 break; 1745 case MarkTextPositionStyle.Down: 1746 g.DrawString(markText, Font, brush, new RectangleF(center.X - 100f, center.Y + (float)MarkText.MarkTextOffect, 200f, Font.Height + 2), format_center); 1747 break; 1748 } 1749 } 1750 } 1751 1752 /// <summary> 1753 /// Determines whether [is need paint dash] [the specified paint value]. 1754 /// </summary> 1755 /// <param name="paintValue">The paint value.</param> 1756 /// <returns><c>true</c> if [is need paint dash] [the specified paint value]; otherwise, <c>false</c>.</returns> 1757 private bool IsNeedPaintDash(float paintValue) 1758 { 1759 for (int i = 0; i < auxiliary_lines.Count; i++) 1760 { 1761 if (Math.Abs(auxiliary_lines[i].PaintValue - paintValue) < (float)font_size9.Height) 1762 { 1763 return false; 1764 } 1765 } 1766 return true; 1767 } 1768 1769 /// <summary> 1770 /// Calculates the data count by offect. 1771 /// </summary> 1772 /// <param name="offect">The offect.</param> 1773 /// <returns>System.Int32.</returns> 1774 private int CalculateDataCountByOffect(float offect) 1775 { 1776 if (value_IntervalAbscissaText > 0) 1777 { 1778 return value_IntervalAbscissaText; 1779 } 1780 if (offect > 40f) 1781 { 1782 return 1; 1783 } 1784 offect = 40f / offect; 1785 return (int)Math.Ceiling(offect); 1786 } 1787 1788 /// <summary> 1789 /// Releases unmanaged and - optionally - managed resources. 1790 /// </summary> 1791 /// <param name="disposing">为 true 则释放托管资源和非托管资源;为 false 则仅释放非托管资源。</param> 1792 protected override void Dispose(bool disposing) 1793 { 1794 if (disposing && components != null) 1795 { 1796 components.Dispose(); 1797 } 1798 base.Dispose(disposing); 1799 } 1800 1801 /// <summary> 1802 /// Initializes the component. 1803 /// </summary> 1804 private void InitializeComponent() 1805 { 1806 SuspendLayout(); 1807 base.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; 1808 BackColor = System.Drawing.Color.Transparent; 1809 base.Name = "HslCurve"; 1810 base.Size = new System.Drawing.Size(417, 205); 1811 ResumeLayout(false); 1812 } 1813 } 1814 }
最后的话
如果你喜欢的话,请到 https://gitee.com/kwwwvagaa/net_winform_custom_control 点个星星吧