bool check = false; //проверка для заполнения первых 2 столбцов private void Canvas_Panel_MouseDown(object sender, MouseEventArgs e) { Pen pen_default = new Pen(Color.MediumBlue, 3); //карандаш для круга по умолчанию Pen pen_selected = new Pen(Color.Red, 3); //карандаш для выбранного круга Pen pen_for_line = new Pen(Color.GhostWhite, 2); //карандаш для соединительных линий if (e.Button == MouseButtons.Right) //если нажата правая кнопка мыши { koortoch[n].rad = 15; koortoch[n].x = e.X - koortoch[n].rad; koortoch[n].y = e.Y - koortoch[n].rad; Canvas_Panel.CreateGraphics().DrawEllipse(pen_default, koortoch[n].x, koortoch[n].y, koortoch[n].rad * 2, koortoch[n].rad * 2); //рисуем круг { //данные необходимые для рисования соединительных линий String drawString = (n + 1).ToString(); Font drawFont = new Font("Arial", 14); SolidBrush drawBrush = new SolidBrush(Color.DarkBlue); PointF drawPoint = new PointF(koortoch[n].x + koortoch[n].rad / 2, koortoch[n].y + koortoch[n].rad / 2); //выводим цифру внутри вершины Canvas_Panel.CreateGraphics().DrawString(drawString, drawFont, drawBrush, drawPoint); } n++; //увеличиваем счётчик вершины if (check == false) { var column1 = new DataGridViewColumn(); //"специальный" певрый столбец column1.HeaderText = "0"; //текст в шапке column1.ReadOnly = true; //значение в этой колонке нельзя править column1.Name = "0"; //текстовое имя колонки, его можно использовать вместо обращений по индексу column1.CellTemplate = new DataGridViewTextBoxCell(); column1.DefaultCellStyle.BackColor = Color.White; //цвет фона column1.DefaultCellStyle.ForeColor = Color.Black; //цвет текста Matrica_DataGridView.Columns.Add(column1); //добавляем стобец //добавляем следующий столбец Matrica_DataGridView.Columns.Add("1", "1"); Matrica_DataGridView[0, 0].Value = 1; check = true; } else { //добавляем строку и столбец for (int i = n; i < n + 1; ++i) { Matrica_DataGridView.Columns.Add(i.ToString(), i.ToString()); Matrica_DataGridView.Rows.Add(); } //заполняем самый первый столбец порядковыми чсилами for (int i = 0; i < n; ++i) { Matrica_DataGridView[0, i].Value = i + 1; } } } if (e.Button == MouseButtons.Left) //если нажата левая кнопка мыши { if (versh == -1) //если пока не запомнили ни одну из вершин { for (int i = 0; i < n; i++) //проверяем попал ли щелчок мыши на какую-то из вершин { if (e.X - koortoch[i].rad <= koortoch[i].x + koortoch[i].rad && e.X - koortoch[i].rad >= koortoch[i].x - koortoch[i].rad && e.Y - koortoch[i].rad <= koortoch[i].y + koortoch[i].rad && e.Y - koortoch[i].rad >= koortoch[i].y - koortoch[i].rad) { versh = i; //если попали, то запоминаем вершину по которой щелкнули Canvas_Panel.CreateGraphics().DrawEllipse(pen_selected, koortoch[i].x, koortoch[i].y, koortoch[i].rad * 2, koortoch[i].rad * 2); //выделяем круг break; //выходим из цикла } } } else //если по одной из вершин уже раннее щелкнули(запомнили), то { int toversh = -1; for (int i = 0; i < n; i++) //проверяем попал ли щелчок мыши на какую-то из вершин { if (e.X - koortoch[i].rad <= koortoch[i].x + koortoch[i].rad && e.X - koortoch[i].rad >= koortoch[i].x - koortoch[i].rad && e.Y - koortoch[i].rad <= koortoch[i].y + koortoch[i].rad && e.Y - koortoch[i].rad >= koortoch[i].y - koortoch[i].rad) { toversh = i;//если попали, то запоминаем вершину по которой щелкнули //выделяем круг Canvas_Panel.CreateGraphics().DrawEllipse(pen_selected, koortoch[i].x, koortoch[i].y, koortoch[i].rad * 2, koortoch[i].rad * 2); break;//выходим из цикла } } if ((toversh != -1) && (versh != toversh))//если щелкнули сначала по одной, а потом по другой вершине { //центр первой выделенной вершины Point p1 = new Point(koortoch[versh].x + koortoch[versh].rad, koortoch[versh].y + koortoch[versh].rad); //центр второй выделенной вершины Point p2 = new Point(koortoch[toversh].x + koortoch[toversh].rad, koortoch[toversh].y + koortoch[toversh].rad); //рисуем соединительную линию Canvas_Panel.CreateGraphics().DrawLine(pen_for_line, p1, p2); //отмечаем в мартрице смежностей пути Matrica_DataGridView[versh + 1, toversh].Value = 1; Matrica_DataGridView[toversh + 1, versh].Value = 1; //возвращаем круги в состояние по умолчанию Canvas_Panel.CreateGraphics().DrawEllipse(pen_default, koortoch[versh].x, koortoch[versh].y, koortoch[versh].rad * 2, koortoch[versh].rad * 2); Canvas_Panel.CreateGraphics().DrawEllipse(pen_default, koortoch[toversh].x, koortoch[toversh].y, koortoch[toversh].rad * 2, koortoch[toversh].rad * 2); versh = -1;//сбрасываем значение для дальнейшей работы } } } }
int versh = -1; //понадобиться нам для обработки различных ситуаций при нажатии мыши private void Canvas_Panel_MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Right) // Если нажата правая кнопка мыши { Pen pen_default = new Pen(Color.Blue, 2); koortoch[n].rad = 15; koortoch[n].x = e.X - koortoch[n].rad; koortoch[n].y = e.Y - koortoch[n].rad; Canvas_Panel.CreateGraphics().DrawEllipse(pen_default, koortoch[n].x, koortoch[n].y, koortoch[n].rad * 2, koortoch[n].rad * 2); String drawString = (n + 1).ToString(); Font drawFont = new Font("Arial", 14); SolidBrush drawBrush = new SolidBrush(Color.Black); PointF drawPoint = new PointF(koortoch[n].x + koortoch[n].rad / 2, koortoch[n].y + koortoch[n].rad / 2); Canvas_Panel.CreateGraphics().DrawString(drawString, drawFont, drawBrush, drawPoint); n++; } if (e.Button == MouseButtons.Left) // Если нажата левая кнопка мыши { Pen pen_selected = new Pen(Color.Red, 2); if (versh == -1) //если пока не запомнили ни одну из вершин { for (int i = 0; i < n; i++) //проверяем попал ли щелчок мыши на какую-то из вершин { if (e.X - koortoch[i].rad <= koortoch[i].x + koortoch[i].rad && e.X - koortoch[i].rad >= koortoch[i].x - koortoch[i].rad && e.Y - koortoch[i].rad <= koortoch[i].y + koortoch[i].rad && e.Y - koortoch[i].rad >= koortoch[i].y - koortoch[i].rad) { versh = i;//если попали, то запоминаем вершину по которой щелкнули Canvas_Panel.CreateGraphics().DrawEllipse(pen_selected, koortoch[i].x, koortoch[i].y, koortoch[i].rad * 2, koortoch[i].rad * 2); break; } } } else //если по одной из вершин уже раннее щелкнули(запомнили), то { int toversh = -1; for (int i = 0; i < n; i++) //проверяем попал ли щелчок мыши на какую-то из вершин { if (e.X - koortoch[i].rad <= koortoch[i].x + koortoch[i].rad && e.X - koortoch[i].rad >= koortoch[i].x - koortoch[i].rad && e.Y - koortoch[i].rad <= koortoch[i].y + koortoch[i].rad && e.Y - koortoch[i].rad >= koortoch[i].y - koortoch[i].rad) { toversh = i;//если попали, то запоминаем вершину по которой щелкнули Canvas_Panel.CreateGraphics().DrawEllipse(pen_selected, koortoch[i].x, koortoch[i].y, koortoch[i].rad * 2, koortoch[i].rad * 2); break; } } if ((toversh != -1) && (versh != toversh))//если щелкнули сначала по одной, а потом по другой вершине { Point p1 = new Point(koortoch[versh].x + koortoch[versh].rad, koortoch[versh].y + koortoch[versh].rad); Point p2 = new Point(koortoch[toversh].x + koortoch[toversh].rad, koortoch[toversh].y + koortoch[toversh].rad); Canvas_Panel.CreateGraphics().DrawLine(pen_selected, p1, p2); toversh = -1; versh = -1; } } } Result_TextBox.Text = versh.ToString(); }