close

Вход

Забыли?

вход по аккаунту

?

Код программы составной элемент

код для вставкиСкачать

Министерство образования и науки Российской Федерации
федеральное государственное бюджетное образовательное учреждение высшего профессионального образования
Ульяновский Государственный Технический Университет
СОСТАВНОЙ ЭЛЕМЕНТ УПРАВЛЕНИЯ ADVANCE IMAGE LISTBOX
КОД ПРОГРАММЫ
A.B. 00007-05 КП 01
Листов 22
Содержание
1.Введение3
2. Текст программы Advance Image Listbox на исходном языке3
2.1. Свойства составного элемента управления Advance Image Listbox3
2.2. События составного элемента управления6
2.2.1. Инициализация событий6
2.3. Методы класса AdvanceImageListBox7
2.3.1. Методы с уровнем доступа protected7
2.3.2. Методы с уровнем доступа public16
2.4. Конструкторы класса AdvanceImageListBox18
2.5. Перестроение изображения в компоненте PictureBox19
2.6. Реализация дополнительной функциональности19
2.6.1. Изменение значений записей в компоненте AdvanceListBox19
2.6.2. Масштабирование изображения20
2.6.3. Масштабирование компонента AdvanceImageListBox20
2.7. Классы, определяющие аргументы событий21
1.ВВЕДЕНИЕ
В данном программном документе приведен исходный код составного элемента управления Advance Image ListBox. Текст программы реализован в виде символической записи на исходном языке. Исходным языком данной разработки является Visual C# 2010. Среда разработки, компилятор - Microsoft Visual C# Express 2010 (английская версия).
2. ТЕКСТ ПРОГРАММЫ ADVANCE IMAGE LISTBOX НА ИСХОДНОМ ЯЗЫКЕ
2.1. Свойства составного элемента управления Advance Image Listbox
public enum Scales { nearby, medium, far };
public enum RegimeOfBuilding { all, firstQuarter, secondQuarter, thirdQuarter, fourthQuarter };
public enum RegimeOfSituating { leftRegime, rightRegime };
private Color colorOfNetting; //цвет сетки +
private Color colorOfGraphic; //цвет графика +
private Color colorOfAxes; //цвет осей +
private Color oddColorOfItems; //цвет нечетных строчек листбокса //совмещенное свойство +
private Color evenColorOfItems; //цвет четных строчек листбокса //совмещенное свойство +
private Scales scaleValue; //для определения шага пользователем или программистом +
private RegimeOfBuilding regimeOfBuildingGraph; //режим построения графика +
private bool buildANetting; //строить сетку +
private bool buildAnAxes; //строить ли оси +
private bool writeADotsOnGraphic; //подписывать ли точки на графике +
private Font fontOfRecord; //шрифт подписи точки
private bool drawBySplines; //отрисовку графика производить гладкими линиями +
private string signX; //подпись осиX графика +
private string signY; //подпись осиY графика +
private bool userChangeScale; //определяет может ли пользователь менять масштаб +
private bool userChangeValues; //пользовательское изменение координат в листбоксе +
private Color backgroundPicture; //задает фон графика.
[Description("Задает цвет фона графика")]
[CategoryAttribute("Appearance")]
[DefaultValueAttribute(typeof(Color), "White")]
public Color BackgroundPicture
{
get { return backgroundPicture; }
set { backgroundPicture = value; }
}
[Description("Может ли пользователь изменять масштаб")]
[CategoryAttribute("Appearance")]
[DefaultValueAttribute(true)]
public bool UserChangeScale
{
get { return userChangeScale; }
set { userChangeScale = value; }
}
[Description("Задает масштаб")]
[CategoryAttribute("Appearance")]
[DefaultValueAttribute(typeof(Scales), "medium")]
public Scales ScaleValue
{
get { return scaleValue; }
set
{
scaleValue = value;
if (scaleValue == Scales.far)
{
scaleGraph = availableScales[0];
}
if (scaleValue == Scales.medium)
{
scaleGraph = availableScales[(int)availableScales.Length / 2];
}
if (scaleValue == Scales.nearby)
{
scaleGraph = availableScales[availableScales.Length - 1];
}
}
}
[Description("Задает режим построения графика")]
[CategoryAttribute("Appearance")]
[DefaultValueAttribute(typeof(RegimeOfBuilding), "all")]
public RegimeOfBuilding RegimeOfBuildingGraph
{
get { return regimeOfBuildingGraph; }
set { regimeOfBuildingGraph = value; }
}
[Description("Задает подпись к оси X")]
[CategoryAttribute("Appearance")]
[DefaultValueAttribute("Ox")]
public string SignX
{
get { return signX; }
set { signX = value; }
}
[Description("Задает подпись к оси Y")]
[CategoryAttribute("Appearance")]
[DefaultValueAttribute("Oy")]
public string SignY
{
get { return signY; }
set { signY = value; }
}
[Description("Задает цвет сетки графика")]
[CategoryAttribute("Appearance")]
[DefaultValueAttribute(typeof(Color), "Silver")]
public Color ColorOfNetting
{
get { return colorOfNetting; }
set { colorOfNetting = value; }
}
[Description("Задает цвет графика")]
[CategoryAttribute("Appearance")]
[DefaultValueAttribute(typeof(Color), "Red")]
public Color ColorOfGraphic
{
get { return colorOfGraphic; }
set { colorOfGraphic = value; }
}
[Description("Строить ли сетку")]
[CategoryAttribute("Appearance")]
[DefaultValueAttribute(true)]
public bool BuildANetting
{
get { return buildANetting; }
set { buildANetting = value; }
}
[Description("Задает цвет осей")]
[CategoryAttribute("Appearance")]
[DefaultValueAttribute(typeof(Color), "Black")]
public Color ColorOfAxes
{
get { return colorOfAxes; }
set { colorOfAxes = value; }
}
[Description("Строить ли оси")]
[CategoryAttribute("Appearance")]
[DefaultValueAttribute(true)]
public bool BuildAnAxes
{
get { return buildAnAxes; }
set { buildAnAxes = value; }
}
[Description("Задает подписи точкам графика")]
[CategoryAttribute("Appearance")]
[DefaultValueAttribute(false)]
public bool WriteADotsOnGraphic
{
get { return writeADotsOnGraphic; }
set { writeADotsOnGraphic = value; }
}
[Description("Задает шрифт подписи точек графика")]
[CategoryAttribute("Appearance")]
[DefaultValueAttribute(false)]
public Font FontOfRecord
{
get { return fontOfRecord; }
set { fontOfRecord = value; }
}
[Description("Рисовать сплайнами или прямыми линиями")]
[CategoryAttribute("Appearance")]
[DefaultValueAttribute(false)]
public bool DrawBySplines
{
get { return drawBySplines; }
set { drawBySplines = value; }
}
[Description("Задает цвет четных строк листбокса")]
[CategoryAttribute("Appearance")]
[DefaultValueAttribute(typeof(Color), "Red")]
public Color EvenColorOfItems
{
get { return evenColorOfItems; }
set
{
evenColorOfItems = value;
this.advlistBoxForValues.EvenColor = evenColorOfItems;
}
}
[Description("Задает цвет осей нечетных строк листбокса")]
[CategoryAttribute("Appearance")]
[DefaultValueAttribute(typeof(Color), "Black")]
public Color OddColorOfItems
{
get { return oddColorOfItems; }
set
{
oddColorOfItems = value;
this.advlistBoxForValues.OddColor = oddColorOfItems;
}
}
[Description("Может ли пользователь изменять данные в листбоксе")]
[CategoryAttribute("Data")]
[DefaultValueAttribute(true)]
public bool UserChangeValues
{
get { return userChangeValues; }
set { userChangeValues = value; }
}
2.2. События составного элемента управления
2.2.1. Инициализация событий
[Description("Событие начала построения графика")]
[CategoryAttribute("Behavior")]
public event StartOfDrawingProcessHandler eStartOfDrawingprocess;
[Description("Событие окончания построения графика")]
[CategoryAttribute("Behavior")]
public event EndOfDrawingProcessHandler eEndOfDrawingprocess;
[Description("Событие отрисовки i-ой подписи к графику")]
[CategoryAttribute("Behavior")]
public event DrawingRecordsHandler eDrawingIRecord;
[Description("Событие отрисовки графика")]
[CategoryAttribute("Behavior")]
public event DrawingGraphHandler eDrawingGraphic;
[Description("Событие выполнения i-го шага построения")]
[CategoryAttribute("Behavior")]
public event BuildingStepHandler eBuildingStep;
[Description("Событие изменения значения в листбоксе")]
[CategoryAttribute("Data")]
public event ChangeItemHandler eChangeItem;
[Description("Событие изменения масштаба изображения пользователем")]
[CategoryAttribute("Behavior")]
public event ChangeScaleHandler eChangeScale;
2.2.2. Реализация событий
//делегат для события начала построения графика
public delegate void StartOfDrawingProcessHandler(object sender, StartDrawingEventArgs e);
//представление события startOfDrawingprocess в виде метода
protected virtual void OnStartOfDrawing(StartDrawingEventArgs e)
{
if (eStartOfDrawingprocess != null)
eStartOfDrawingprocess(this, e);
}
public delegate void EndOfDrawingProcessHandler(object sender, EndDrawingEventArgs e);
//представление события endOfDrawingprocess в виде метода
protected virtual void OnEndOfDrawing(EndDrawingEventArgs e)
{
if (eEndOfDrawingprocess != null)
eEndOfDrawingprocess(this, e);
}
//событие отрисовки i подписи строки
public delegate void DrawingRecordsHandler(object sender, GraphicRecordsEventArgs e);
//функция
protected virtual void OnDrawingRecords(GraphicRecordsEventArgs e)
{
if (eDrawingIRecord != null)
eDrawingIRecord(this, e);
}
//событие отриcовки графика
public delegate void DrawingGraphHandler(object sender, GraphEventArgs e);
//функция
protected virtual void OnDrawingGraph(GraphEventArgs e)
{
if (eDrawingGraphic != null)
eDrawingGraphic(this, e);
}
//событие отрисовки i-го шага построения
public delegate void BuildingStepHandler(object sender, BuildingStepArgs e);
//функция
protected virtual void OnBuildingStep(BuildingStepArgs e)
{
if (eBuildingStep != null)
eBuildingStep(this, e);
}
//событие изменения итема
public delegate void ChangeItemHandler(object sender, ChangeItemArgs e);
//функция
protected virtual void OnChangeItem(ChangeItemArgs e)
{
if (eChangeItem != null)
eChangeItem(this, e);
}
//событие изменения масштаба изображения пользователем
//объявление делегата
public delegate void ChangeScaleHandler(object sender, EventArgs e);
protected virtual void OnChangeScale(EventArgs e)
{
if (eChangeScale != null)
{
eChangeScale(this, e);
}
}
2.3. Методы класса AdvanceImageListBox
2.3.1. Методы с уровнем доступа protected
//случайным образом заполняем листбокс (для 3-го конструктора)
protected void SetRandomValuesInAdvList(int numberOfDots, int minInRange, int maxInRange)
{
Random rnd = new Random();
minInRange *= 10;
maxInRange *= 10;
for (int i = 0; i < numberOfDots; i++)
{
float x = rnd.Next(minInRange, maxInRange) / 100;
float y = rnd.Next(minInRange, maxInRange) / 100;
string record = x.ToString() + ";" + y.ToString();
this.advlistBoxForValues.Items.Add(record);
}
}
/*метод обработки i-го итема в строке*/
protected string[] TreatingOneItem(int index)
{
string[] coordinates = this.advlistBoxForValues.Items[index].ToString().Split(new char[] { ';'
});
return coordinates;
}
/*метод сохранения поинтов, по которым будет строится график*/
protected PointF[] GetAValuesFromListBoxInElement()
{
PointF[] points;
List<PointF> pointsCopy = new List<PointF>();
for (int i = 0; i < this.advlistBoxForValues.Items.Count; i++)
{
string[] str = TreatingOneItem(i);
try
{
float x = Convert.ToSingle(str[0]);
float y = Convert.ToSingle(str[1]);
if ((x < 100 && y < 100) && (x > -100 && y > -100))
{
PointF point = new PointF(x, y);
pointsCopy.Add(point);
}
else
{
this.advlistBoxForValues.Items.RemoveAt(i);
i--;
}
}
catch
{
this.advlistBoxForValues.Items.RemoveAt(i);
i--;
}
}
points = pointsCopy.ToArray();
return points;
}
//Предварительная сортировка значений перед построением
protected PointF[] SortingCoordinatesInOrder(PointF[] points)
{
try
{
for (int i = 0; i < points.Length; i++)
{
int min = i;
for (int j = i + 1; j < points.Length; j++)
{
if (points[j].X < points[min].X)
min = j;
}
if (min != i)
{
PointF tmp = points[i];
points[i] = points[min];
points[min] = tmp;
}
}
//выведем в advListbox в правильном порядке
for (int i = 0; i < points.Length; i++)
this.advlistBoxForValues.Items[i] = points[i].X.ToString() + ";" + points[i].Y.ToString();
return points;
}
catch
{
return null;
}
}
//Обработка значений из advlistbox для дальнейшего построения
protected PointF[] HandlingOfRecievedValues()
{
PointF[] pointsOfGraphic = this.GetAValuesFromListBoxInElement();
pointsOfGraphic = SortingCoordinatesInOrder(pointsOfGraphic);
if (pointsOfGraphic != null)
{
if (regimeOfBuildingGraph == RegimeOfBuilding.all)
return returnHandlingPointsInAllRegime(pointsOfGraphic);
if (regimeOfBuildingGraph == RegimeOfBuilding.firstQuarter)
return returnHandlingPointsInFirstQuarterRegime(pointsOfGraphic);
if (regimeOfBuildingGraph == RegimeOfBuilding.secondQuarter)
return returnHandlingPointsInSecondQuarterRegime(pointsOfGraphic);
if (regimeOfBuildingGraph == RegimeOfBuilding.thirdQuarter)
return returnHandlingPointsInThirdQuarterRegime(pointsOfGraphic);
if (regimeOfBuildingGraph == RegimeOfBuilding.fourthQuarter)
return returnHandlingPointsInFourthQuarterRegime(pointsOfGraphic);
return null;
}
else
{
return null;
}
}
//в случае режима all(строит все 4 четверти)
protected PointF[] returnHandlingPointsInAllRegime(PointF[] points)
{
//обработка точек
List<PointF> pointsOfGraphicCopy = new List<PointF>();
foreach (PointF p in points)
{
PointF tmpPoint = new PointF(this.pictureBoxForPainting.Width / 2 + p.X * scaleGraph,
this.pictureBoxForPainting.Height / 2 + (-1) * p.Y * scaleGraph);
pointsOfGraphicCopy.Add(tmpPoint);
}
points = pointsOfGraphicCopy.ToArray(); //заносим обработанные значения обратно в массив
return points;
}
//в режиме FirstQuarter
protected PointF[] returnHandlingPointsInFirstQuarterRegime(PointF[] points)
{
//обработка точек
List<PointF> pointsOfGraphicCopy = new List<PointF>();
foreach (PointF p in points)
{
PointF tmpPoint = new PointF(p.X * scaleGraph, this.pictureBoxForPainting.Height + (-1) * p.Y
* scaleGraph);
pointsOfGraphicCopy.Add(tmpPoint);
}
points = pointsOfGraphicCopy.ToArray(); //заносим обработанные значения обратно в массив
return points;
}
//в режиме SecondQuarter
protected PointF[] returnHandlingPointsInSecondQuarterRegime(PointF[] points)
{
//обработка точек
List<PointF> pointsOfGraphicCopy = new List<PointF>();
foreach (PointF p in points)
{
PointF tmpPoint = new PointF(this.pictureBoxForPainting.Width + p.X * scaleGraph,
this.pictureBoxForPainting.Height + (-1) * p.Y * scaleGraph);
pointsOfGraphicCopy.Add(tmpPoint);
}
points = pointsOfGraphicCopy.ToArray(); //заносим обработанные значения обратно в массив
return points;
}
//в режиме thirdQuarter
protected PointF[] returnHandlingPointsInThirdQuarterRegime(PointF[] points)
{
//обработка точек
List<PointF> pointsOfGraphicCopy = new List<PointF>();
foreach (PointF p in points)
{
PointF tmpPoint = new PointF(this.pictureBoxForPainting.Width + p.X * scaleGraph, (-1) * p.Y
* scaleGraph);
pointsOfGraphicCopy.Add(tmpPoint);
}
points = pointsOfGraphicCopy.ToArray(); //заносим обработанные значения обратно в массив
return points;
}
//в режиме fourthQuarter
protected PointF[] returnHandlingPointsInFourthQuarterRegime(PointF[] points)
{
//обработка точек
List<PointF> pointsOfGraphicCopy = new List<PointF>();
foreach (PointF p in points)
{
PointF tmpPoint = new PointF(p.X * scaleGraph, (-1) * p.Y * scaleGraph);
pointsOfGraphicCopy.Add(tmpPoint);
}
points = pointsOfGraphicCopy.ToArray(); //заносим обработанные значения обратно в массив
return points;
}
//отрисовка сетки
protected void DrawNetting(Graphics canvas)
{
Pen newPenForNetting = new Pen(colorOfNetting, 1);
if (regimeOfBuildingGraph == RegimeOfBuilding.all)
DrawNettingInAllRegime(canvas, newPenForNetting);
if (regimeOfBuildingGraph == RegimeOfBuilding.firstQuarter)
DrawNettingInFirstQuarterRegime(canvas, newPenForNetting);
if (regimeOfBuildingGraph == RegimeOfBuilding.secondQuarter)
DrawNettingInSecondQuarterRegime(canvas, newPenForNetting);
if (regimeOfBuildingGraph == RegimeOfBuilding.thirdQuarter)
DrawNettingInThirdQuarterRegime(canvas, newPenForNetting);
if (regimeOfBuildingGraph == RegimeOfBuilding.fourthQuarter)
DrawNettingInFourthQuarterRegime(canvas, newPenForNetting);
}
#region Отрисовка сетки для различных режимов
//построение сетки для случая выбора пользователем параметра all построения
protected void DrawNettingInAllRegime(Graphics canvas, Pen pen)
{
//построение вертикальной сетки
//в 2 и 3 четвертях
float i = this.pictureBoxForPainting.Width / 2;
while (i > 0)
{
canvas.DrawLine(pen, new PointF(i, 0), new PointF(i,
this.pictureBoxForPainting.Height));
i -= scaleGraph;
}
//в 1 и 4
i = this.pictureBoxForPainting.Width / 2;
while (i < this.pictureBoxForPainting.Width)
{
canvas.DrawLine(pen, new PointF(i, 0), new PointF(i,
this.pictureBoxForPainting.Height));
i += scaleGraph;
}
//построение горизонтальной сетки
//в 1 и 2 четвертях
i = this.pictureBoxForPainting.Height / 2;
while (i > 0)
{
canvas.DrawLine(pen, new PointF(0, i), new
PointF(this.pictureBoxForPainting.Width, i));
i -= scaleGraph;
}
//в 3 и 4 четвертях
i = this.pictureBoxForPainting.Height / 2;
while (i < this.pictureBoxForPainting.Height)
{
canvas.DrawLine(pen, new PointF(0, i), new PointF(this.pictureBoxForPainting.Width, i));
i += scaleGraph;
}
}
//отрисовка сетки в режиме FirstQuarter
protected void DrawNettingInFirstQuarterRegime(Graphics canvas, Pen pen)
{
float i = 0;
//вертикальная часть
while (i < this.pictureBoxForPainting.Width)
{
canvas.DrawLine(pen, new PointF(i, 0), new PointF(i,
this.pictureBoxForPainting.Height));
i += scaleGraph;
}
//горизонтальная часть
i = this.pictureBoxForPainting.Height;
while (i > 0)
{
canvas.DrawLine(pen, new PointF(0, i), new
PointF(this.pictureBoxForPainting.Width, i));
i -= scaleGraph;
}
}
//отрисовка сетки в режиме SecondQuarter
protected void DrawNettingInSecondQuarterRegime(Graphics canvas, Pen pen)
{
float i = this.pictureBoxForPainting.Width;
//вертикальная часть
while (i > 0)
{
canvas.DrawLine(pen, new PointF(i, 0), new PointF(i,
this.pictureBoxForPainting.Height));
i -= scaleGraph;
}
//горизонтальная часть
i = this.pictureBoxForPainting.Height;
while (i > 0)
{
canvas.DrawLine(pen, new PointF(this.pictureBoxForPainting.Width, i), new
PointF(0, i));
i -= scaleGraph;
}
}
//отрисовка сетки в режиме ThirdQuarter
protected void DrawNettingInThirdQuarterRegime(Graphics canvas, Pen pen)
{
float i = this.pictureBoxForPainting.Width;
//вертикальная часть
while (i > 0)
{
canvas.DrawLine(pen, new PointF(i, 0), new PointF(i,
this.pictureBoxForPainting.Height));
i -= scaleGraph;
}
//горизонтальная часть
i = 0;
while (i < this.pictureBoxForPainting.Height)
{
canvas.DrawLine(pen, new PointF(this.pictureBoxForPainting.Width, i), new
PointF(0, i));
i += scaleGraph;
}
}
//отрисовка сетки в режиме FourthQuarter
protected void DrawNettingInFourthQuarterRegime(Graphics canvas, Pen pen)
{
float i = 0;
//вертикальная часть
while (i < this.pictureBoxForPainting.Width)
{
canvas.DrawLine(pen, new PointF(i, 0), new PointF(i,
this.pictureBoxForPainting.Height));
i += scaleGraph;
}
//горизонтальная часть
i = 0;
while (i < this.pictureBoxForPainting.Height)
{
canvas.DrawLine(pen, new PointF(0, i), new PointF(this.pictureBoxForPainting.Width, i));
i += scaleGraph;
}
}
/*Построение осей*/
protected void DrawAxes(Graphics canvas)
{
Pen newPenForAxes = new Pen(colorOfAxes, 1);
newPenForAxes.EndCap = LineCap.ArrowAnchor; //устанавливаем параметр окончания отрисованной
линии(в данном случае стрелка) if (regimeOfBuildingGraph == RegimeOfBuilding.all)
DrawAxesInAllRegime(canvas, newPenForAxes);
if (regimeOfBuildingGraph == RegimeOfBuilding.firstQuarter)
DrawAxesInFirstQuarterRegime(canvas, newPenForAxes);
if (regimeOfBuildingGraph == RegimeOfBuilding.secondQuarter)
DrawAxesInSecondQuarterRegime(canvas, newPenForAxes);
if (regimeOfBuildingGraph == RegimeOfBuilding.thirdQuarter)
DrawAxesInThirdQuarterRegime(canvas, newPenForAxes);
if (regimeOfBuildingGraph == RegimeOfBuilding.fourthQuarter)
DrawAxesInFourthQuarterRegime(canvas, newPenForAxes);
}
//в нормальном режиме
protected void DrawAxesInAllRegime(Graphics canvas, Pen pen)
{
canvas.DrawLine(pen, new Point(this.pictureBoxForPainting.Width / 2, this.pictureBoxForPainting.Height), new Point(this.pictureBoxForPainting.Width / 2, 0)); //строим ось Oy
canvas.DrawLine(pen, new Point(0, this.pictureBoxForPainting.Height / 2), new Point(this.pictureBoxForPainting.Width, this.pictureBoxForPainting.Height / 2)); //строим ось Ox
try
{
//подписываем оси
//ось X
canvas.DrawString(signX, new Font(new FontFamily("Arial"),8, FontStyle.Regular), new
SolidBrush(colorOfAxes), new RectangleF(this.pictureBoxForPainting.Width - 30, this.pictureBoxForPainting.Height / 2 + 10, 25, canvas.MeasureString(signX, fontOfRecord).Width));
//ось Y
canvas.DrawString(signY, new Font(new FontFamily("Arial"), 8, FontStyle.Regular), new SolidBrush(colorOfAxes), new RectangleF(this.pictureBoxForPainting.Width / 2 - 30, 10, 25,
canvas.MeasureString(signY, fontOfRecord).Width));
}
catch
{
//...
}
}
//в режиме первой четверти
protected void DrawAxesInFirstQuarterRegime(Graphics canvas, Pen pen)
{
canvas.DrawLine(pen, new Point(0, this.pictureBoxForPainting.Height), new Point(0, 0)); //строим
ось Oy
canvas.DrawLine(pen, new Point(0, this.pictureBoxForPainting.Height - 3), new Point(this.pictureBoxForPainting.Width, this.pictureBoxForPainting.Height - 3)); //строим ось Ox
try
{
//подписываем оси
//ось X
canvas.DrawString(signX, new Font(new FontFamily("Arial"), 8, FontStyle.Regular), new SolidBrush(colorOfAxes), new RectangleF(this.pictureBoxForPainting.Width - 30, this.pictureBoxForPainting.Height - canvas.MeasureString(signX, fontOfRecord).Width, 30,
canvas.MeasureString(signX, fontOfRecord).Width));
//ось Y
canvas.DrawString(signY, new Font(new FontFamily("Arial"), 8, FontStyle.Regular), new SolidBrush(colorOfAxes), new RectangleF(10, 10, 30, canvas.MeasureString(signY, fontOfRecord).Width));
}
catch
{
//...
}
}
//в режиме второй четверти
protected void DrawAxesInSecondQuarterRegime(Graphics canvas, Pen pen)
{
canvas.DrawLine(pen, new Point(this.pictureBoxForPainting.Width - 3,
this.pictureBoxForPainting.Height), new Point(this.pictureBoxForPainting.Width - 3, 0)); //строим ось Oy
canvas.DrawLine(pen, new Point(this.pictureBoxForPainting.Width, this.pictureBoxForPainting.Height - 3), new Point(0, this.pictureBoxForPainting.Height - 3));
//строим ось Ox
try
{
//подписываем оси
//ось X
canvas.DrawString(signX, new Font(new FontFamily("Arial"), 8, FontStyle.Regular), new SolidBrush(colorOfAxes), new RectangleF(0, this.pictureBoxForPainting.Height - canvas.MeasureString(signX, fontOfRecord).Width, 30, canvas.MeasureString(signX, fontOfRecord).Width));
//ось Y
canvas.DrawString(signY, new Font(new FontFamily("Arial"), 8, FontStyle.Regular), new SolidBrush(colorOfAxes), new RectangleF(this.pictureBoxForPainting.Width - 30, 10, 30, canvas.MeasureString(signY, fontOfRecord).Width));
}
catch
{
//...
}
}
//в режиме третьей четверти
protected void DrawAxesInThirdQuarterRegime(Graphics canvas, Pen pen)
{
canvas.DrawLine(pen, new Point(this.pictureBoxForPainting.Width - 3, 0), new Point(this.pictureBoxForPainting.Width - 3, this.pictureBoxForPainting.Height)); //строим ось Oy
canvas.DrawLine(pen, new Point(this.pictureBoxForPainting.Width, 0), new Point(0, 0)); //строим ось Ox
try
{
//подписываем оси
//ось X
canvas.DrawString(signX, new Font(new FontFamily("Arial"), 8, FontStyle.Regular), new
SolidBrush(colorOfAxes), new RectangleF(10, 10, 30, canvas.MeasureString(signX, fontOfRecord).Width));
//ось Y
canvas.DrawString(signY, new Font(new FontFamily("Arial"), 8, FontStyle.Regular), new SolidBrush(colorOfAxes), new RectangleF(this.pictureBoxForPainting.Width - 30, this.pictureBoxForPainting.Height - canvas.MeasureString(signY, fontOfRecord).Width, 30, canvas.MeasureString(signY, fontOfRecord).Width));
}
catch
{
//...
}
}
//в режиме четвертой четверти
protected void DrawAxesInFourthQuarterRegime(Graphics canvas, Pen pen)
{
canvas.DrawLine(pen, new Point(0, 0), new Point(0, this.pictureBoxForPainting.Height)); //строим
ось Oy
canvas.DrawLine(pen, new Point(0, 0), new Point(this.pictureBoxForPainting.Width, 0)); //строим ось Ox
try
{
//подписываем оси
//ось X
canvas.DrawString(signX, new Font(new FontFamily("Arial"), 8, FontStyle.Regular), new
SolidBrush(colorOfAxes), new RectangleF(this.pictureBoxForPainting.Width - 30, 10, 30,
canvas.MeasureString(signX, fontOfRecord).Width));
//ось Y
canvas.DrawString(signY, new Font(new FontFamily("Arial"), 8, FontStyle.Regular), new
SolidBrush(colorOfAxes), new RectangleF(10, this.pictureBoxForPainting.Height - canvas.MeasureString(signX, fontOfRecord).Width, 30, canvas.MeasureString(signX, fontOfRecord).Width));
}
catch
{
//...
}
}
//Установка точек
protected void DrawColorDots(Graphics canvas)
{
PointF[] pointsOfGraphic = this.HandlingOfRecievedValues();
try
{
for (int i = 0; i < pointsOfGraphic.Length; i++)
{
try
{
if (i % 2 == 0)
canvas.FillEllipse(new SolidBrush(evenColorOfItems), new RectangleF(pointsOfGraphic[i].X - 1, pointsOfGraphic[i].Y - 1, 3, 3));
else
canvas.FillEllipse(new SolidBrush(oddColorOfItems), new RectangleF(pointsOfGraphic[i].X - 1, pointsOfGraphic[i].Y - 1, 3, 3));
}
catch
{
//...
}
}
}
catch
{
//...
}
}
//Подписи точек
protected void DrawDotsOnGraphic(PointF[] pointsOfGraphic, Graphics canvas)
{
PointF[] pointsForWriting = GetAValuesFromListBoxInElement();
if (pointsOfGraphic != null && pointsForWriting != null)
{
for (int i = 0; i < pointsForWriting.Length; i++)
{
string str = "{" + (pointsForWriting[i].X).ToString() + " ; " + (pointsForWriting[i].Y).ToString() + "}";
PointF posOfRecord = new PointF(pointsOfGraphic[i].X, pointsOfGraphic[i].Y + 2);
try
{
OnDrawingRecords(new GraphicRecordsEventArgs(str, i)); //событие отриcовки i-подписи if (i % 2 == 0)
canvas.DrawString(str, fontOfRecord, new SolidBrush(evenColorOfItems),
posOfRecord);
else
canvas.DrawString(str, fontOfRecord, new SolidBrush(oddColorOfItems),
posOfRecord);
}
catch
{
break;
}
}
}
else
return;
}
//построение графика
protected void DrawGraphic(Graphics canvas)
{
PointF[] pointsOfGraphic = HandlingOfRecievedValues();
if (pointsOfGraphic != null && pointsOfGraphic.Length > 1)
{
Pen newPenForDrawingGraphic = new Pen(colorOfGraphic, 1);
//отрисовывать сплайнами?
try
{
if (drawBySplines)
canvas.DrawCurve(newPenForDrawingGraphic, pointsOfGraphic);
else
canvas.DrawLines(newPenForDrawingGraphic, pointsOfGraphic);
OnDrawingGraph(new GraphEventArgs(pointsOfGraphic));
}
catch
{
//неизвестное исключение
}
}
}
//для предварительного определения числа шагов построения
protected int CountStepsOfBuilding()
{
int countSteps = 1;
bool[] arrayOfPermissions = new bool[] { buildAnAxes, buildANetting, writeADotsOnGraphic };
foreach (bool permission in arrayOfPermissions)
if (permission)
countSteps++;
return countSteps;
}
//этап построения
protected void StatusOfDrawing(int processingStep)
{
OnBuildingStep(new BuildingStepArgs(processingStep));
try
{
this.progressBarProcessing.Value += processingStep;
}
catch //если вдруг свойство value прогресс бара окажется больше 100 {
this.progressBarProcessing.Value = 100;
}
}
//рисование по принципу двойной буферизации
protected Bitmap DrawingInBitmap()
{
//используем принцип двойной буферизации
Bitmap doubleBufferImage = new Bitmap(this.pictureBoxForPainting.Width,
this.pictureBoxForPainting.Height);
Graphics canvasDrawingInImage = Graphics.FromImage(doubleBufferImage);
int stepOfProcessing = (int)100 / CountStepsOfBuilding(); //определяем на какое значение должно
изменяться свойство value
this.progressBarProcessing.Value = 0;
DateTime time_before_building = DateTime.Now; //определяем время начала построения
OnStartOfDrawing(new StartDrawingEventArgs(CountStepsOfBuilding())); //выбрасываем событие о начале построения в picturebox
canvasDrawingInImage.Clear(this.backgroundPicture); //заполняем фон изображения
if (buildANetting) //рисуем сетку
{
StatusOfDrawing(stepOfProcessing);
DrawNetting(canvasDrawingInImage);
}
if (buildAnAxes) //рисуем оси
{
StatusOfDrawing(stepOfProcessing);
DrawAxes(canvasDrawingInImage);
}
StatusOfDrawing(stepOfProcessing);
DrawGraphic(canvasDrawingInImage);
if (writeADotsOnGraphic) //подписываем точки
{
StatusOfDrawing(stepOfProcessing);
DrawDotsOnGraphic(HandlingOfRecievedValues(), canvasDrawingInImage);
DrawColorDots(canvasDrawingInImage);
}
progressBarProcessing.Value = 0; //устанавливаем value прогресс бара в 0
DateTime time_after_building = DateTime.Now; //время после построения
OnEndOfDrawing(new EndDrawingEventArgs(CountStepsOfBuilding(), time_after_building -
time_before_building)); //событие конца отрисовки графика
tmpBtmp = doubleBufferImage; //сохраняем полученный Bitmap в глобальную переменную для последующих операций(перерисовки)
return doubleBufferImage;
}
2.3.2. Методы с уровнем доступа public
/// <summary>
/// Рисуем в picturebox, используя принцип двойной буферизации
/// </summary>
public void Drawing()
{
this.pictureBoxForPainting.Refresh();
painted = false; //не рисовали
using (Graphics canvas = this.pictureBoxForPainting.CreateGraphics())
{
Bitmap tempBtmp = DrawingInBitmap();
canvas.DrawImage(tempBtmp, new Point(0, 0)); //рисуем в picturebox
}
painted = true; //нарисовали
}
/// <summary>
/// Сохранение графика в Bitmap
/// </summary>
public Bitmap SaveGraphicInBitmap()
{
if (tmpBtmp != null)
return tmpBtmp;
else
return new Bitmap(this.pictureBoxForPainting.Width, this.pictureBoxForPainting.Height);
}
/// <summary>
/// Удаление графика из pictureBox
/// </summary>
public void DeleteGraph()
{
painted = false;
tmpBtmp = null;
this.pictureBoxForPainting.BackColor = Color.White;
this.pictureBoxForPainting.Refresh();
}
#endregion
#region Работа с advanceListBox в составном элементе
/// <summary>
/// Добавление элемента в листбокс составного элемента
/// </summary>
public void addNewItemInList(object obj)
{
this.advlistBoxForValues.Items.Add(obj);
}
/// <summary>
/// Добавление группы элементов в листбокс составного элемента
/// </summary>
public void addNewCollectionInList(object[] collection)
{
this.advlistBoxForValues.Items.AddRange(collection);
}
/// <summary>
/// Удаление элемента из листбокса составного элемента
/// </summary>
public void DeleteItemFromeList(object obj)
{
while (this.advlistBoxForValues.FindStringExact(obj.ToString()) != -1) //удаление всех одинаковых
итемов
this.advlistBoxForValues.Items.Remove(obj);
}
/// <summary>
/// Удаление элемента по индексу из листбокса составного элемента
/// </summary>
public void DeleteItemByIndexFromeList(int index)
{
try
{
this.advlistBoxForValues.Items.RemoveAt(index);
}
catch
{
//...срабатывает если элемента под указанным индексом не существует
}
}
/// <summary>
/// Удаление всех элементов из листбокса составного элемента
/// </summary>
public void deleteAllItemsFromList()
{
this.advlistBoxForValues.Items.Clear();
}
/// <summary>
/// Возвращает true, если выделение было успешным, false, если выделить/снять выделение с указанных
элементов не удалось
/// </summary>
public bool selOrUnselItemsInRange(int startPos, int lastPos, bool value)
{
try
{
return this.advlistBoxForValues.SelectedAllItemsInRange(startPos, lastPos, value);
}
catch
{
return false;
}
}
/// <summary>
/// Заполнение из файла строк в advListbox
/// </summary>
public void GetAInformationFromFile(string wayToFile)
{
try
{
FileStream fStream = new FileStream(wayToFile, FileMode.Open, FileAccess.Read);
StreamReader sReader = new StreamReader(fStream);
List<string> listForAddingItems = new List<string>();
string tmpString = "";
while (tmpString != null)
{
tmpString = sReader.ReadLine();
listForAddingItems.Add(tmpString);
}
listForAddingItems.RemoveAt(listForAddingItems.Count - 1); //удалаяем последнюю пустую строку
object[] tmpCollection = listForAddingItems.ToArray();
this.advlistBoxForValues.Items.AddRange(tmpCollection);
}
catch (FileNotFoundException ex) //файл не найден
{
MessageBox.Show(ex.Message);
return;
}
catch
{
//перехват неизвестного исключения
return;
}
}
2.4. Конструкторы класса AdvanceImageListBox
//метод инициализации основных свойств компонента AdvanceImageListBox
private void InitializingOfProperties()
{
this.ScaleValue = Scales.medium; //масштаб построения
this.RegimeOfBuildingGraph = RegimeOfBuilding.all;
this.colorOfNetting = Color.Silver; //цвет сетки this.colorOfGraphic = Color.Red; //цвет графика this.colorOfAxes = Color.Black; //цвет осей this.buildANetting = true; //строить сетку this.buildAnAxes = true; //строить ли оси this.writeADotsOnGraphic = false; //подписывать ли точки на графике this.fontOfRecord = new Font(new FontFamily("Arial"), 8, FontStyle.Regular); //шрифт
подписи точки this.drawBySplines = false; //отрисовку графика производить гладкими линиями this.signX = "Ox"; //подпись осиX графика this.signY = "Oy"; //подпись осиY графика
this.advlistBoxForValues.ItemsSelectedForbidden = false;
this.userChangeValues = true;
this.userChangeScale = true;
this.backgroundPicture = Color.White;
//совмещенные свойства с advanceListBox
this.OddColorOfItems = Color.Green;
this.EvenColorOfItems = Color.Black;
//дополнительные события для реализации масштабирования
this.pictureBoxForPainting.MouseEnter += new EventHandler(pictureBoxForPainting_MouseEnter);
this.pictureBoxForPainting.MouseWheel += new MouseEventHandler(pictureBoxForPainting_MouseWheel);
this.pictureBoxForPainting.MouseLeave += new EventHandler(pictureBoxForPainting_MouseLeave);
}
//стандартный конструктор
public AdvanceImageListBox()
{
InitializeComponent();
InitializingOfProperties();
}
//конструктор, при использовании которого листбокс заполняется из файла
public AdvanceImageListBox(string wayToFile)
{
InitializeComponent();
InitializingOfProperties();
this.GetAInformationFromFile(wayToFile); //заполняем массив строк из списка
}
//конструктор, при использовании которого список заполняется случайными точками
public AdvanceImageListBox(int numberOfDots, int minInRange, int maxInRange)
{
InitializeComponent();
InitializingOfProperties();
this.SetRandomValuesInAdvList(numberOfDots, minInRange, maxInRange); //случайно заполним
список
}
2.5. Перестроение изображения в компоненте PictureBox
private void pictureBoxForPainting_Paint(object sender, PaintEventArgs e)
{
if (painted)
e.Graphics.DrawImage(tmpBtmp, new Point(0, 0));
}
2.6. Реализация дополнительной функциональности
2.6.1. Изменение значений записей в компоненте AdvanceListBox
//изменение значений прямо в листбоксе
private void advlistBoxForValues_MouseDoubleClick(object sender, MouseEventArgs e)
{
if (!(dialogWithUser)) //если функция изменения значения еще не применялась
{
if (this.advlistBoxForValues.SelectedIndex != -1 && userChangeValues)
{
this.advlistBoxForValues.Height -= 20;
this.advlistBoxForValues.Top = 23; TextBox fieldForInputingNewValues = new TextBox(); //поле для нового значения итема fieldForInputingNewValues.SetBounds(this.advlistBoxForValues.Location.X,
this.advlistBoxForValues.Location.Y - 20, this.advlistBoxForValues.Width, 20);
fieldForInputingNewValues.KeyDown += new KeyEventHandler(fieldForInputingNewValues_KeyDown);
this.Controls.Add(fieldForInputingNewValues);
fieldForInputingNewValues.Focus();
dialogWithUser = true;
}
}
}
//происходит при фокусе в поле для ввода
private void fieldForInputingNewValues_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyData == Keys.Enter)
{
if ((sender as TextBox).Text != "")
{
this.advlistBoxForValues.Items[this.advlistBoxForValues.SelectedIndex] = (sender as
TextBox).Text; //сохраняем значение в список на место выделенного элемента
OnChangeItem(new ChangeItemArgs(this.advlistBoxForValues.SelectedIndex)); // выбрасываем событие изменения итема в листбоксе
Drawing(); //при подстановке новых значений незамедлительно перерисовываем график
this.pictureBoxForPainting.Invalidate();
}
this.advlistBoxForValues.Top = 3;
this.advlistBoxForValues.Height += 20;
dialogWithUser = false;
(sender as TextBox).Dispose(); //удаляем поле для ввода
}
}
2.6.2. Масштабирование изображения
//когда наводим на picturebox ставим фокус на него
private void pictureBoxForPainting_MouseEnter(object sender, EventArgs e)
{
this.pictureBoxForPainting.Focus();
}
//когда уводим мышь, фокус переносим на advlistbox
private void pictureBoxForPainting_MouseLeave(object sender, EventArgs e)
{
this.advlistBoxForValues.Focus();
}
//обработка события вращение колесом мыши
private void pictureBoxForPainting_MouseWheel(object sender, MouseEventArgs e)
{
if (painted && userChangeScale)
{
scaleGraph = availableScales[currentScaleIndex];
if (e.Delta > 0)
{
if (currentScaleIndex <= availableScales.Length - 1)
{
currentScaleIndex++;
Drawing();
this.pictureBoxForPainting.Invalidate(); //Делает недействительной всю поверхность
элемента управления и вызывает его перерисовку
}
if (currentScaleIndex == availableScales.Length - 1)
{
currentScaleIndex--;
}
}
else
{
if (currentScaleIndex >= 0)
{
currentScaleIndex--;
Drawing();
this.pictureBoxForPainting.Invalidate(); //Делает недействительной всю поверхность
элемента управления и вызывает его перерисовку.
}
if (currentScaleIndex == -1)
{
currentScaleIndex++;
}
}
OnChangeScale(new EventArgs()); //выбрасываем событие о проведенном масштабировании
}
}
2.6.3. Масштабирование компонента AdvanceImageListBox //событие для переопределения размера picturebox-а при увеличении размера advlistbox-a
private void advlistBoxForValues_SizeChanged(object sender, EventArgs e)
{
this.pictureBoxForPainting.Left = this.advlistBoxForValues.Width + 5;
this.pictureBoxForPainting.Width = this.Width - this.pictureBoxForPainting.Left - 5;
}
//высоты элементов должны быть всегда равны
private void AdvanceImageListBox_Resize(object sender, EventArgs e)
{
this.pictureBoxForPainting.Height = this.advlistBoxForValues.Height;
}
2.7. Классы, определяющие аргументы событий
//класс для аргументов события начала построения графика
public class StartDrawingEventArgs
{
private int countOfBuildingSteps; //число шагов построения
public int CountOfBuildingSteps
{
get { return countOfBuildingSteps; }
protected set { countOfBuildingSteps = value; }
}
public StartDrawingEventArgs(int countOfSteps)
{
CountOfBuildingSteps = countOfSteps;
}
}
//класс для аргументов события конца построения графика
public class EndDrawingEventArgs
{
private int countOfBuildingSteps; //число шагов построения
private TimeSpan buildingTime; //промежуток времени
public int CountOfBuildingSteps
{
get { return countOfBuildingSteps; }
protected set { countOfBuildingSteps = value; }
}
public TimeSpan BuildingTime
{
get { return buildingTime; }
protected set { buildingTime = value; }
}
public EndDrawingEventArgs(int countOfSteps, TimeSpan time)
{
CountOfBuildingSteps = countOfSteps;
BuildingTime = time;
}
}
//класс аргументов события, происходящих при отрисовке i-ой подписи
public class GraphicRecordsEventArgs
{
private string recordText; //текст подписи
private int index; //индекс подписи
public string RecordText
{
protected set { recordText = value; }
get { return recordText; }
}
public int Index
{
protected set { index = value; }
get { return index; }
}
public GraphicRecordsEventArgs(string text, int numberOfRecord)
{
RecordText = text;
Index = numberOfRecord;
}
}
//класс аргументов события, происходящих при построении графика
public class GraphEventArgs
{
private PointF[] collectionOfBuildingPoints; //коллекция точек, по которой строится график
public PointF[] CollectionOfBuildingPoints
{
protected set { collectionOfBuildingPoints = value; }
get { return collectionOfBuildingPoints; }
}
public GraphEventArgs(PointF[] collection)
{
collectionOfBuildingPoints = collection;
}
}
////класс аргументов события, происходящих при выполнении i-го шага построения
public class BuildingStepArgs
{
private int stepOfBuilding; //номер текущего шага построения
public int StepOfBuilding
{
protected set { stepOfBuilding = value; }
get { return stepOfBuilding; }
}
public BuildingStepArgs(int indexOfStep)
{
stepOfBuilding = indexOfStep;
}
}
//класс аргументов события, происходящих при изменении записи в компоненте AdvanceImageListBox
public class ChangeItemArgs
{
private int indexOfChangeItem; //индекс изменяемой записи
public int IndexOfChangeItem
{
protected set { indexOfChangeItem = value; }
get { return indexOfChangeItem; }
}
public ChangeItemArgs(int index)
{
indexOfChangeItem = index;
}
}
22
А.В. 00007-05 КП 01
2012
Документ
Категория
Разное
Просмотров
19
Размер файла
85 Кб
Теги
элементы, программа, код, составной
1/--страниц
Пожаловаться на содержимое документа