前段时间做项目,需要用到绘制波形控件,要求控件能够拖动坐标点的坐标,并将其更新的数据显示在表格中。
本来想网上找找,看有没有现成的,减少工作量,找了半天都没有。有网友推荐微软自家的Chart绘图控件,用了一下,没找到拖动坐标点功能,只能放弃。寻思了半天决定自己绘制此控件。
下面先展示下控件的效果:
现在来讲一下此控件的整体构思:
此控件的绘制始终以坐标轴的原点为中心进行绘制坐标轴、刻度值、坐标点。之所以选择坐标轴原点为中心,一是考虑到控件要填加鼠标拖拽坐标轴功能;而是考虑到有正负半轴,所以选坐标轴原点坐标为中心,是最好的选择,也是最佳方案。整体大的架构确定好,就可以进行绘制了,其他的附带的一些鼠标功能只需要围绕着这个大的框架做就可以了。
绘制坐标轴和刻度的Code:
#region 绘制坐标轴、刻度线刻度
/// <summary>
/// 绘制坐标轴、刻度线刻度
/// </summary>
/// <param name="g">Graphics对象</param>
/// <param name="penXY">绘制X、Y轴画笔</param>
/// <param name="penLine">绘制刻度线画笔</param>
/// <param name="colorScale">刻度线刻度字体颜色</param>
private void Draw_Coordinate_Scale(Graphics g, Pen penXY, Pen penLine, Color colorScale)
{
try
{
#region 绘制方格和坐标刻度
switch (CoordinateMode)
{
#region 横坐标模式
case CoordinateModeEnum.AbscissaMode:
#region 绘制X、Y坐标轴
//X轴
g.DrawLine(penLine, new PointF((float)(LiftMargin), AxisParameterSetS.OriginPointF.Y), new PointF((float)(this.Size.Width - RightMargin), AxisParameterSetS.OriginPointF.Y));
#endregion
#region 绘制原点坐标刻度
g.DrawString("0", new Font("微软雅黑", ScaleFontSize, FontStyle.Bold), new SolidBrush(colorScale), (float)LiftMargin, AxisParameterSetS.OriginPointF.Y);
#endregion
//Y+ ---
for (int i = 1; i < (AxisParameterSetS.OriginPointF.Y - AboveMargin) / AxisParameterSetS.CellSize.Height; i++)
{
g.DrawString((i * CellYScale).ToString(AxisParameterSetS.ScaleDecimalPoint), new Font("微软雅黑", ScaleFontSize, FontStyle.Bold), new SolidBrush(colorScale), (float)(LiftMargin), (float)(AxisParameterSetS.OriginPointF.Y - i * AxisParameterSetS.CellSize.Height - ScaleFontDeviation));
g.DrawLine(penLine, new PointF((float)(LiftMargin), (float)(AxisParameterSetS.OriginPointF.Y - i * AxisParameterSetS.CellSize.Height)), new PointF((float)(this.Size.Width - RightMargin), (float)(AxisParameterSetS.OriginPointF.Y - i * AxisParameterSetS.CellSize.Height)));
}
//Y- ---
for (int i = 1; i < (this.Size.Height - AxisParameterSetS.OriginPointF.Y - BelowMargin) / AxisParameterSetS.CellSize.Height; i++)
{
g.DrawString((-i * CellYScale).ToString(AxisParameterSetS.ScaleDecimalPoint), new Font("微软雅黑", ScaleFontSize, FontStyle.Bold), new SolidBrush(colorScale), (float)(LiftMargin), (float)(AxisParameterSetS.OriginPointF.Y + i * AxisParameterSetS.CellSize.Height - ScaleFontDeviation));
g.DrawLine(penLine, new PointF((float)(LiftMargin), (float)(AxisParameterSetS.OriginPointF.Y + i * AxisParameterSetS.CellSize.Height)), new PointF((float)(this.Size.Width - RightMargin), (float)(AxisParameterSetS.OriginPointF.Y + i * AxisParameterSetS.CellSize.Height)));