//*********************************************** Дорисовка *****************************************// private Bitmap PaintBitmap(Bitmap btmBack, FractureLine flt) { //добавить на существующий битмап одну линию //нужна для временного отображения ожидаемого результата (рисования отрезка. Или 2-х отрезков, если переносится промежуточная точка Graphics grBack = Graphics.FromImage(btmBack); Point p1 = new Point(); Point p2 = new Point(); Pen Ptch; //int mx = 1; //Масштаб по x и y //int my = 1; Ptch = new Pen(Color.LimeGreen, (float)(flt.Pero.Width + 1)); if (flt.points.Count > 0) { p1 = flt.points[0]; //начало рисования } for (int t = 0; t < flt.points.Count; t++) { p2 = flt.points[t]; Rectangle r1 = new Rectangle(new Point(p2.X - (int)(Ptch.Width / 2), p2.Y - (int)(Ptch.Width / 2)), new Size((int)Ptch.Width, (int)Ptch.Width)); grBack.DrawLine(flt.Pero, p1, p2); grBack.DrawEllipse(Ptch, r1); p1 = p2; } return(btmBack); }
//копия линии public FractureLine Clone() { FractureLine f = new FractureLine(); f.pen = (Pen)this.pen.Clone(); for (int i = 0; i < this.points.Count; i++) { f.points.Add(this.points[i]); } return(f); }
private void button1_Click(object sender, EventArgs e) { //создать новую линию FractureLine fl_tmp = new FractureLine(); flAddLine = true; flAddPoint = true; fl_tmp.Pero = p1; fl_tmp.Name = "Линия" + (FL.Count + 1).ToString(); FL.Add(fl_tmp); IndActiveFL = FL.Count - 1; lbListOfLines.Items.Add(fl_tmp.Name); lbListOfLines.SelectedIndex = lbListOfLines.Items.Count - 1; }
private bool OpenFile(string Path) { try { using (BinaryReader reader = new BinaryReader(File.Open(Path, FileMode.Open))) { string info = reader.ReadString(); //вводное инфо о файле int countLine = reader.ReadInt32(); //кол-во строк FL.Clear(); //чистим существующий список линий for (int i = 0; i < countLine; i++) { //читаем с файла линии во временную линию FractureLine fl_tmp = new FractureLine(); fl_tmp.Name = reader.ReadString(); info = reader.ReadString(); //инфо о пере для линии float PenWidth = reader.ReadSingle(); //указываем значение пера - толщина, затем цвет Color PenColor = Color.FromArgb(reader.ReadInt32()); fl_tmp.Pero = new Pen(PenColor, PenWidth); info = reader.ReadString(); //метка о начале инфо о точках int countPoint = reader.ReadInt32(); //кол-во точек for (int ti = 0; ti < countPoint; ti++) { //координаты, и добавляем точку int x = reader.ReadInt32(); int y = reader.ReadInt32(); Point p1 = new Point(x, y); fl_tmp.AddPoint(p1); } lbListOfLines.Items.Add(fl_tmp.Name); //добавляем в список линию FL.Add(fl_tmp); //добавляем линию в List } pbMainGrafWin.Image = PaintBitmap(pbMainGrafWin.Width, pbMainGrafWin.Height, FL); //рисуем в PictBoxe reader.Close(); //закрываем файл } return(true); } catch { return(false); } }
private void pbMainGrafWin_MouseMove(object sender, MouseEventArgs e) { //ищем наведение мышкой на какую либо линию и подсвечиваем if (!flAddLine && !flAddPoint && !flMoveLine && !flMovePoint) { for (int i = 0; i < FL.Count; i++) { int ti = FL[i].InsidePoint(new Point(e.X, e.Y)); if (ti >= 0) { tsslFindLine.BackColor = Color.LimeGreen; lbListOfLines.SelectedIndex = i; break; } else { //listBox1.SelectedIndex = -1; tsslFindLine.BackColor = Color.Coral; } } } if (IndActiveFL >= 0) { //работаем с активной фигурой FractureLine FL_tmp = new FractureLine(); //временная линия FL_tmp.Pero = new Pen(Color.Silver, 1); if (e.Button == MouseButtons.Left) { if (flMoveLine) { //двигать линию //созданаем копию из активной линии во временную линию, для визульного отображения будующей позиции линии FL_tmp = FL[IndActiveFL].Clone(); FL_tmp.Pero = new Pen(Color.Silver, 1); //таскаем временную линию за мышью FL_tmp.Move(e.X - PMoveBegin.X, e.Y - PMoveBegin.Y); pbMainGrafWin.Image = PaintBitmap(pbMainGrafWin.Width, pbMainGrafWin.Height, FL); pbMainGrafWin.Image = PaintBitmap((Bitmap)pbMainGrafWin.Image, FL_tmp); //дорисовываем будющее положение переносимой линии } if (flMovePoint) { //перемещаем точку в активной линии if (IndActivePoint == 0) { //обработка перемещения первой точки FL_tmp.AddPoint(new Point(e.X, e.Y)); FL_tmp.AddPoint(FL[IndActiveFL].points[IndActivePoint + 1]); } else if (IndActivePoint > 0 && IndActivePoint < FL[IndActiveFL].points.Count - 1) { //обработка перемещения излома FL_tmp.AddPoint(FL[IndActiveFL].points[IndActivePoint - 1]); FL_tmp.AddPoint(new Point(e.X, e.Y)); FL_tmp.AddPoint(FL[IndActiveFL].points[IndActivePoint + 1]); } else if (IndActivePoint == FL[IndActiveFL].points.Count - 1) { //обработка перемещения последней точки FL_tmp.AddPoint(FL[IndActiveFL].points[IndActivePoint - 1]); FL_tmp.AddPoint(new Point(e.X, e.Y)); } pbMainGrafWin.Image = PaintBitmap(pbMainGrafWin.Width, pbMainGrafWin.Height, FL); //рисуем начальную картину pbMainGrafWin.Image = PaintBitmap((Bitmap)pbMainGrafWin.Image, FL_tmp); //дорисовываем будующие изменения } } if (flAddPoint) { if (FL[IndActiveFL].points.Count > 0) { FL_tmp.Pero = new Pen(Color.Silver, 1); IndActivePoint = FL[IndActiveFL].points.Count - 1; FL_tmp.AddPoint(FL[IndActiveFL].points[IndActivePoint]); FL_tmp.AddPoint(new Point(e.X, e.Y)); pbMainGrafWin.Image = PaintBitmap(pbMainGrafWin.Width, pbMainGrafWin.Height, FL); pbMainGrafWin.Image = PaintBitmap((Bitmap)pbMainGrafWin.Image, FL_tmp); //дорисовываем предполагаемую точку + перенос линии } } } lblCoordPB1.Text = e.X.ToString() + " : " + e.Y.ToString(); //показать координаты мышки в рабочей области }