Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/40: Рейтинг темы: голосов - 40, средняя оценка - 4.88
116 / 116 / 42
Регистрация: 27.02.2013
Сообщений: 899

Удаление нарисованных фигур

25.12.2016, 22:46. Показов 7501. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброе время суток! Как можно реализовать удаление нарисованных фигур? Мышкой тыкаешь, например, на прямоуголник, он выделятся, нажимаешь delete и он удаляется.
Ниже привожу код, как рисуются объекты:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
 Point startPos;      // mouse-down position
        Point currentPos;    // current mouse position
        bool drawing;        // busy drawing
        List<Rectangle> rectangles = new List<Rectangle>();  // previous rectangles
        private bool drawRect = false;
 
         private Rectangle getRectangle()
         {
            return new Rectangle(
                Math.Min(startPos.X, currentPos.X),
                Math.Min(startPos.Y, currentPos.Y),
                Math.Abs(startPos.X - currentPos.X),
                Math.Abs(startPos.Y - currentPos.Y));
         }
 
         private void chart1_MouseDown(object sender, MouseEventArgs e)
         {
                currentPos = startPos = e.Location;
                drawing = true;
         }
 
        private void chart1_MouseMove(object sender, MouseEventArgs e)
        {
                currentPos = e.Location;
                if (drawing) chart1.Invalidate();
         }
 
         private void chart1_MouseUp(object sender, MouseEventArgs e)
        {
                 if (drawing)
                {                  
                    drawing = false;
                    var rc = getRectangle();
                    if (rc.Width > 0 && rc.Height > 0) rectangles.Add(rc);               
                    chart1.Invalidate();
                }
         }
 
        SolidBrush brush = new SolidBrush(Color.FromArgb(15, Color.Black));
        private void chart1_Paint(object sender, PaintEventArgs e)
        {
            if (drawRect == true)
            {
               
                if (rectangles.Count > 0)
                {
                    e.Graphics.DrawRectangles(Pens.Black, rectangles.ToArray());
                }
                if (drawing)
                {
                    e.Graphics.DrawRectangle(Pens.Red, getRectangle());
                }
        
                e.Graphics.FillRectangle(brush, getRectangle());
 
            }
        }
 
        private void chart1_PostPaint(object sender, ChartPaintEventArgs e)
        {
            var cg = e.ChartGraphics;
            var brush = new SolidBrush(Color.FromArgb(15, Color.Black));
           cg.Graphics.FillRectangle(brush, getRectangle());
        }
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.12.2016, 22:46
Ответы с готовыми решениями:

Перекрытие bitmap-ом нарисованных фигур в PictureBox
Доброго времени суток, уважаемые программисты. А проблема такова: я рисую на PictureBox фигуры и так как они выходят за пределы,...

Перемещение и удаление отрисованных на PictureBox фигур
Столкнулся с необходимостью нанесения на PictureBox нескольких составных фигур, каждая из которых состоит из эллипса и текстовой подписи...

Перемещение нарисованных фигур
&lt;!DOCTYPE html&gt; &lt;html&gt; &lt;head&gt; &lt;link rel = &quot;stylesheet&quot; href = &quot;index.css&quot;&gt; &lt;script src=&quot;canvas.js&quot;&gt;&lt;/script&gt; ...

6
 Аватар для Sanya_sa
912 / 816 / 333
Регистрация: 03.02.2015
Сообщений: 5,276
Записей в блоге: 9
25.12.2016, 23:46
C#
1
rectangles.RemoveAt(CurenIndex);
CurenIndex - это индекс в списке rectangles.
Определить данный индекс по клику можно примерно так:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// Это в обработчике клика e.X и e.Y координаты клика
 
for (int i = 0; i < rectangles.Count; i++)
{
 
   var it = rectangles[i];
 
   if (Math.Abs(e.X -  it.X) < it.Width && Math.Abs(e.Y -  it.Y) < it.Height)
   {
      CurenIndex = i;
      return;
   }
 
}
Добавлено через 5 минут
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int RemoveRec(List<Rectangle> items, Point clickPos)
{
 
for (int i = 0; i < items.Count; i++)
{
 
  var it = items[i];
 
  if (Math.Abs(e.X - *it.X) < it.Width && Math.Abs(e.Y - *it.Y) < it.Height)
  {
     return i;
  }
}
 
return -1;
 
}
1
116 / 116 / 42
Регистрация: 27.02.2013
Сообщений: 899
27.12.2016, 22:42  [ТС]
Sanya_sa, а можете подсказать, как сделать чтобы выбранный прямоугольник еще выделялся цветом другим при щелчке?
0
 Аватар для Sanya_sa
912 / 816 / 333
Регистрация: 03.02.2015
Сообщений: 5,276
Записей в блоге: 9
28.12.2016, 08:47
Цитата Сообщение от blackstar Посмотреть сообщение
Sanya_sa, а можете подсказать, как сделать чтобы выбранный прямоугольник еще выделялся цветом другим при щелчке?
Да, сделайте Rectangle curentRect; и при попадании в фигуру задайте координаты той фигуры в которую попали, если не попали то curentRect = null, в OnPaint проверяйте if(curentRect != null) то красим прямоугольник, для краски используем полупрозрачный цвет.
1
5 / 4 / 2
Регистрация: 24.09.2016
Сообщений: 416
24.12.2021, 10:44
Sanya_sa, когда есть Rectangle - то теперь понятно как выявить щелчок по нему. А когда нарисован полигон (ромб)
C#
1
myGraphics.DrawPolygon(pen, myPoints);
из 4 точек Point[] myPoints = { new Point(10, 2), new Point(15, 9), new Point(10, 17), new Point(5, 9), new Point(10, 2) };
то как узнать что именно на нем был щелчок ?
0
 Аватар для ViterAlex
8951 / 4863 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
24.12.2021, 11:02
DLD, если предполагаются сложные контуры, то нужно использовать GraphicsPath. У него есть метод IsVisible, который поможет определить попадание точки в контур.
1
5 / 4 / 2
Регистрация: 24.09.2016
Сообщений: 416
25.12.2021, 10:21
ViterAlex, спасибо что ответили
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.12.2021, 10:21
Помогаю со студенческими работами здесь

Подкиньте код нарисованных фигур в с++
Подкиньте код для рисования фигур. Хочу попробовать что-то нарисовать

Поворот и масштабирование нарисованных фигур
Доброго дня всем, такая проблема у меня. есть программа что при нажатий на одну кнопку на форме появляеться треугольник а при нажатий на...

Искажение нарисованных полигонами фигур
Рисую с помощью GL_TRIANGLES конус. С разных позиций наблюдателя он выглядит по-разному. Вот так он выглядит с искажениями (первый...

Поиск нарисованных фигур на плоскости и определение их координат
Есть поле в клетку 5Х5, есть зараженная зона на этом поле. Нужно определить координаты зараженных квадратов. Я что-то писал, но ничего...

Необходимо реализовать перемещение нарисованных фигур в клиентской области.
Дайте направление на верный путь. Есть простейший графический редактор на основе диалоговых окон. В нём я рисую, например, круг и его...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка SDL3, Box2D, FreeType и SDL3_ttf из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru