📄 ddrawbox.cs
字号:
#region "刻度标签"
/// <summary>
/// 获取或设置刻度标签
/// </summary>
public string LabelCalibrate
{
set
{
if (_labelcalibrate != value)
{
_labelcalibrate = value;
if (_showcalibrate)
{
Draw(false);
}
}
}
get
{
return _labelcalibrate;
}
}
#endregion
#region "激活的感兴趣区"
/// <summary>
/// 获取或设置激活的感兴趣区
/// </summary>
public string ActivatedROI
{
set
{
if (_activatedroi != value)
{
_activatedroi = value;
Draw(false);
}
}
get
{
return _activatedroi;
}
}
#endregion
#region "激活的感兴趣区颜色"
/// <summary>
/// 获取或设置激活的感兴趣区颜色
/// </summary>
public Color ActivatedColor
{
set
{
if (_activatedcolor != value)
{
_activatedcolor = value;
Draw(false);
}
}
get
{
return _activatedcolor;
}
}
#endregion
#endregion
#endregion
#region "构造函数"
/// <summary>
/// 构造函数
/// </summary>
public DDrawBox()
{
_data = new int[0];
_datastart = 1;
_dataend = 0;
//
_calibratecoefficient = new double[0];
_showcalibrate = false;
//
_databmp = new Bitmap(100, 50);
_g = Graphics.FromImage(_databmp);
Image = _databmp;
//
_pencoordinate = new Pen(Color.Lime);
_pendata = new Pen(Color.White);
_pengrid = new Pen(Color.LightGreen);
_penselectline = new Pen(Color.LightGreen);
//
_brushcoordinate = new SolidBrush(Color.Lime);
_brushdata = new SolidBrush(Color.White);
_brushregion = new SolidBrush(Color.LightGreen);
_brushfill = new SolidBrush(Color.Black);
//
_coordinate = MyCoordinate.Line;
//
_minX = 0;
_minY = 0;
_maxY = 256;
_maxX = 1024;
_p = new Point[2];
//
_selectedx = -1;
_regionstartx = -1;
_regionendx = -1;
//
_fillcolor = Color.Black;
_coordinatecolor = Color.Lime;
_datacolor = Color.White;
_selectlinecolor = Color.LightGreen;
_regioncolor = Color.LightGreen;
_gridcolor = Color.LightGreen;
_activatedcolor = Color.Red;
//
_fill = true;
//
_px = new ArrayList();
_py = new ArrayList();
//
_paintgridx = false;
_paintgridy = false;
//
_roi = new Hashtable();
//
_activatedroi = "";
//
this.Size = new Size(100, 50);
}
#endregion
#region "方法"
#region "受保护的方法"
#region "在改变大小时改变绘制位图的大小"
/// <summary>
/// 在改变大小时要改变绘制位图的大小
/// </summary>
/// <param name="e"></param>
protected override void OnResize(System.EventArgs e)
{
base.OnResize(e);
//改变位图大小
if ((Width > 0) && (Height > 0))
{
_databmp.Dispose();
_databmp = new Bitmap(Width, Height);
Image = _databmp;
_g = Graphics.FromImage(_databmp);
//重画
Draw(true);
}
}
#endregion
#region "绘制背景和坐标"
/// <summary>
/// 绘制背景和坐标
/// </summary>
protected void PaintBG()
{
int height = _databmp.Height;
int width = _databmp.Width;
_g.Clear(_fillcolor);
//画y坐标线
_g.DrawLine(_pencoordinate, 25, 10, 25, height - 15);
//画x坐标线
_g.DrawLine(_pencoordinate, 25, height - 15, width - 25, height - 15);
using (Font vf = new Font("Tahoma", 7, FontStyle.Regular), vf1 = new Font("Tahoma", 6, FontStyle.Regular))
{
int basecount;
if (_maxX < 10000)
{
basecount = (int)((width - 50) / _g.MeasureString(_maxX.ToString() + "9", vf).Width);
}
else
{
basecount = (int)((width - 50) / _g.MeasureString("9.9E9", vf).Width);
}
int cbase = 1;
//确定x坐标基数
foreach (int n in nbase)
{
cbase = n;
if ((_maxX - _minX) / n < basecount)
{
break;
}
}
//画x坐标点
int tmpx;
_px.Clear();
for (int i = (int)(_minX / cbase) - 1; cbase * i <= _maxX; i++)
{
if (cbase * i >= _minX)
{
tmpx = 25 + (int)((double)(cbase * i - _minX) * (width - 50) / (_maxX - _minX));
_g.DrawLine(_pencoordinate, tmpx, height - 15, tmpx, height - 10);
string s = Convert.ToString(cbase * i);
if (cbase * i >= 10000)
{
s = s[0] + "." + s[1] + "E" + Convert.ToString(s.Length - 1);
}
else
{
if (cbase * i <= -1000)
{
s = "-" + s[1] + "." + s[2] + "E" + Convert.ToString(s.Length - 2);
}
}
_g.DrawString(s, vf, _brushcoordinate, tmpx + 1 - _g.MeasureString(s, vf).Width / 2, height - 10);
_px.Add(tmpx);
}
}
basecount = (int)((height - 30) / _g.MeasureString("1", vf).Height) + 1;
cbase = 1;
//确定y坐标基数
foreach (int n in nbase)
{
cbase = n;
if ((_maxY - _minY)/ n < basecount)
{
break;
}
}
//画y坐标点
int tmpy;
_py.Clear();
for (int i = (int)(_minY / cbase) - 1; cbase * i <= _maxY; i++)
{
if (cbase * i >= _minY)
{
tmpy = height - 15 - (int)((double)(cbase * i - _minY) * (height - 30) / (_maxY - _minY));
_g.DrawLine(_pencoordinate, 20, tmpy, 25, tmpy);
string s = Convert.ToString(cbase * i);
if (cbase * i >= 10000)
{
s = s[0] + "." + s[1] + "E" + Convert.ToString(s.Length - 1);
_g.DrawString(s, vf, _brushcoordinate, (25 - _g.MeasureString(s, vf).Width) / 2, tmpy - _g.MeasureString(s, vf).Height + 1);
}
else
{
if (cbase * i <= -1000)
{
s = "-" + s[1] + "." + s[2] + "E" + Convert.ToString(s.Length - 2);
_g.DrawString(s, vf1, _brushcoordinate, (25 - _g.MeasureString(s, vf1).Width) / 2, tmpy - _g.MeasureString(s, vf1).Height + 1);
}
else
{
_g.DrawString(s, vf, _brushcoordinate, (25 - _g.MeasureString(s, vf).Width) / 2, tmpy - _g.MeasureString(s, vf).Height + 1);
}
}
_py.Add(tmpy);
}
}
}//using font
}
#endregion
#region "把数据转换为要绘制的点的坐标"
/// <summary>
/// 绘制数据
/// </summary>
protected void BuildDataPoint()
{
// 绘画区域超过了数据区
if ((_dataend < _minX) || (_datastart > _maxX))
{
return;
}
int maxy = _databmp.Height - 30;
float dy = (float)maxy / (_maxY - _minY);
int maxx = _databmp.Width - 49;
float dx = (float)maxx / (_maxX - _minX);
int maxdrawx = Math.Min(_dataend, _maxX);
int mindrawx = Math.Max(_datastart, _minX);
//绘画点数
int n = maxdrawx - mindrawx + 1;
int x;
int y;
maxy += 15;
//左下角的点
_p[0].X = (int)((mindrawx - _minX) * dx) + 25;
_p[0].Y = maxy;
//右下角的点
_p[_p.GetUpperBound(0)].X = (int)((maxdrawx - _minX) * dx) + 25;
_p[_p.GetUpperBound(0)].Y = maxy;
int datax;
if (_datastart >= _minX)
{
datax = 0;
}
else
{
datax = _minX - _datastart;
}
//根据不同的数据坐标来绘画
if (_coordinate == MyCoordinate.Line)
{
for (int i = 0; i < n; i++)
{
x = _p[0].X + (int)(i * dx);
y = (int)(maxy - (_data[i + datax] - _minY) * dy);
if (y < 15)
{
y = 15;
} if (y > maxy)
{
y = maxy;
}
_p[i + 1].X = x;
_p[i + 1].Y = y;
}
}
else
{
int k;
k = (int)(_maxY / Math.Log10(_maxY));
for (int i = 0; i < n; i++)
{
x = _p[0].X + (int)(i * dx);
y = (int)(maxy - k * Math.Log10(_data[i + datax] - _minY) * dy);
if (y < 15)
{
y = 15;
} if (y > maxy)
{
y = maxy;
}
_p[i + 1].X = x;
_p[i + 1].Y = y;
}
}
}
#endregion
#region "绘制网格、选择线和选择区域"
/// <summary>
/// 绘制网格、选择线和选择区域
/// </summary>
protected void PaintSelected()
{
int maxx = _databmp.Width - 49;
float dx = (float)maxx / (_maxX - _minX);
//清除显示区
_g.FillRectangle(_brushfill, 26, 0, maxx, Height - 15);
//显示选择区域
if ((_regionstartx >= _minX) && (_regionendx <= _maxX) && (_regionstartx < _regionendx))
{
_g.FillRectangle(_brushregion, 25 + (int)((_regionstartx - _minX) * dx), 15, (int)((_regionendx - _regionstartx) * dx), Height - 30);
}
//显示x网格
if (_paintgridx)
{
foreach (int x in _px)
{
_g.DrawLine(_pengrid, x, 15, x, Height - 15);
}
}
//显示y网格
if (_paintgridy)
{
foreach (int y in _py)
{
_g.DrawLine(_pengrid, 25, y, Width - 25, y);
}
}
//显示数据
if (_fill)
{
_p[0].Y = Height - 15;
_p[_p.GetUpperBound(0)].Y = Height - 15;
_g.FillPolygon(_brushdata, _p);
}
_p[0].Y = _p[1].Y;
_p[_p.GetUpperBound(0)].Y = _p[_p.GetUpperBound(0) - 1].Y;
_g.DrawLines(_pendata, _p);
//显示道址及其计数
if ((_selectedx >= _minX) && (_selectedx <= _maxX))
{
using (Font font = new Font(FontFamily.GenericSerif, 9, FontStyle.Regular))
{
string info;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -