Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/21: Рейтинг темы: голосов - 21, средняя оценка - 4.57
0 / 0 / 1
Регистрация: 16.01.2013
Сообщений: 61

Создание события Click для нарисованного объекта

10.04.2015, 12:42. Показов 4154. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Если функция, которая рисует сетку объектов

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
using (Graphics g = this.CreateGraphics())
                {
                    using (Brush brushErase = new SolidBrush(this.BackColor))
                    {
                        for (int i = 0; i < pnSites.Count; i++)
                        {
                            //g.FillRectangle(brushErase, cX, cY, iNumber, iNumber);
                            if (cX < this.Width-40  && !_bFinish)
                            {
                                
                                g.DrawImage(this._hBitmap, cX, cY, iNumberW, iNumber);
                                g.DrawString(pnSites[i].PN, new Font("Tahoma", 6), Brushes.White, cX, cY);
                                //Показывает тулТип
                                //ToolTip _ToolTip = new System.Windows.Forms.ToolTip();
                                //ToolTip = _ToolTip;
                                g.Flush();
                                cX += iNumberW;
Все хорошо. Отображается много прямоугольников для мониторинга. Но возникает вопрос в другом. Как для каждого нарисованного прямоугольника сделать нажатие? Чтобы при нажатии по нему можно было вывести информацию по этому квадратику.

Если есть какие-то другие варианты решения отображения и обработки прямоугольников буду благодарен за совет.
Поскольку как правильно выбрать здесь подход, даже не представляю.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.04.2015, 12:42
Ответы с готовыми решениями:

Создание динамического события для объекта подключаемого из dll (динамика)
Всем привет, помогите. мучаюсь уже битый час... \ Суть такова. есть главная форма, у нее есть метод View, из подключаемой библиотеке...

Реализовать метод Гаусса для события button.Click
Всем доброго времени суток. Пишу программу по решению СЛАУ методом Гаусса. Матрица у меня состоит из textBox'ов, которые создаются...

Определение границ нарисованного объекта
Задача такова: определить границы нарисованного объекта. Пытаюсь это сделать с помощью определение и сравнения цвета пикселя, но почему-то...

11
83 / 78 / 14
Регистрация: 14.06.2012
Сообщений: 261
10.04.2015, 16:19
Отлавливать onClick для формы.
Потом по координатам смотреть, какой из них нажат.
1
0 / 0 / 1
Регистрация: 16.01.2013
Сообщений: 61
12.04.2015, 11:32  [ТС]
А как же мне тогда идентифицировать каждый прямоугольник. Ну передать его надпись при клике. Если это не возможно, то какой альтернатив я могу использовать для данной задачи. Прямоугольников могут быть тысячи и это важный момент.
0
26 / 26 / 29
Регистрация: 11.02.2012
Сообщений: 101
12.04.2015, 11:49
Создать класс прямоугольников. В нем метод рисующих их.
И статический метод определяющий который прямоугольник выбран, или давать всем прямоугольникам разные цвета и по цвету точки определять прямоугольник.
0
0 / 0 / 1
Регистрация: 16.01.2013
Сообщений: 61
12.04.2015, 14:16  [ТС]
Разные цвета давать нельзя. Поскольку вырисовывается цвет у прямоугольников в зависимости от ситуации. А можно какой нибудь примерчик с классом прямоугольников? Чтоб понять, как это делать?
0
 Аватар для Patagolik
6 / 5 / 2
Регистрация: 12.04.2015
Сообщений: 35
12.04.2015, 16:53
Человечество уже придумало "класс прямоугольников".

System.Windows.Shapes

И примеры там есть.
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
12.04.2015, 18:05
Лучший ответ Сообщение было отмечено dima-z04 как решение

Решение

Цитата Сообщение от dima-z04 Посмотреть сообщение
Ну передать его надпись при клике. ... Прямоугольников могут быть тысячи
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Windows.Forms;
 
namespace WindowsFormsApplication274
{
    public partial class Form1 : Form
    {
        private List<Figure> figures = new List<Figure>();
        private ToolTip tt;
 
        public Form1()
        {
            InitializeComponent();
 
            SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw | ControlStyles.UserPaint, true);
 
            tt = new ToolTip();
 
            Width = 500;
            Height = 500;
            BuildFigures();
        }
 
        private void BuildFigures()
        {
            var rnd = new Random();
 
            for (int i = 0; i < 1000; i++)
            {
                var f = Figure.CreateSquare(20 + rnd.Next(20));
                f.Name = Name = "Square " + i;
                f.Location = new Point(rnd.Next(Width), rnd.Next(Height));
                figures.Add(f);
 
                f = Figure.CreateCircle(20 + rnd.Next(20));
                f.Name = Name = "Circle " + i;
                f.Location = new Point(rnd.Next(Width), rnd.Next(Height));
                figures.Add(f);
            }
        }
 
        protected override void OnPaint(PaintEventArgs e)
        {
            foreach (var f in figures)
                f.Draw(e.Graphics);
        }
 
        protected override void OnMouseDown(MouseEventArgs e)
        {
            base.OnMouseDown(e);
 
            if (e.Button == MouseButtons.Left)
                foreach (var f in figures.Reverse<Figure>())
                    if (f.HitTest(e.Location))
                    {
                        tt.Show(f.Name, this);
                        break;
                    }
        }
    }
 
    class Figure
    {
        public Point Location { get; set; }
        public GraphicsPath Path { get; set; }
        public string Name { get; set; }
 
        public bool HitTest(Point point)
        {
            point.Offset(-Location.X, -Location.Y);
            return Path.IsVisible(point);
        }
 
        public void Offset(int dx, int dy)
        {
            Location = new Point(Location.X + dx, Location.Y + dy);
        }
 
        public static Figure CreateSquare(int size)
        {
            var res = new Figure();
            res.Path = new GraphicsPath();
            res.Path.AddRectangle(new Rectangle(0, 0, size, size));
 
            return res;
        }
 
        public static Figure CreateCircle(int size)
        {
            var res = new Figure();
            res.Path = new GraphicsPath();
            res.Path.AddEllipse(new Rectangle(0, 0, size, size));
 
            return res;
        }
 
        public void Draw(Graphics g)
        {
            var state = g.Save();
            g.TranslateTransform(Location.X, Location.Y);
            g.FillPath(Brushes.Silver, Path);
            g.DrawPath(Pens.Black, Path);
            g.Restore(state);
        }
    }
}
Тысячи их:
3
0 / 0 / 1
Регистрация: 16.01.2013
Сообщений: 61
14.04.2015, 09:02  [ТС]
Еще вопрос, как сделать чтобы эти нарисованные прямоугольники не изменяя своих свойств при изменении размеров формы занимали свободное пространство? Масштабировались. Сейчас форма имеет жестко заданные размеры. Если ее раздвигать, то образуется пустое место. Элементы не перерисовываются.
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
14.04.2015, 09:11
Цитата Сообщение от dima-z04 Посмотреть сообщение
как сделать чтобы эти нарисованные прямоугольники не изменяя своих свойств при изменении размеров формы занимали свободное пространство? Масштабировались.
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Windows.Forms;
 
namespace WindowsFormsApplication274
{
    public partial class Form1 : Form
    {
        private List<Figure> figures = new List<Figure>();
        private ToolTip tt;
        private Size SourceSize = new Size(500, 500);
 
        public Form1()
        {
            InitializeComponent();
 
            SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw | ControlStyles.UserPaint, true);
 
            tt = new ToolTip();
 
            Size = SourceSize;
            BuildFigures();
        }
 
        private void BuildFigures()
        {
            var rnd = new Random();
 
            for (int i = 0; i < 1000; i++)
            {
                var f = Figure.CreateSquare(20 + rnd.Next(20));
                f.Name = Name = "Square " + i;
                f.Location = new Point(rnd.Next(Width), rnd.Next(Height));
                figures.Add(f);
 
                f = Figure.CreateCircle(20 + rnd.Next(20));
                f.Name = Name = "Circle " + i;
                f.Location = new Point(rnd.Next(Width), rnd.Next(Height));
                figures.Add(f);
            }
        }
 
        protected override void OnPaint(PaintEventArgs e)
        {
            e.Graphics.ScaleTransform(1f*Width/SourceSize.Width, 1f*Height/SourceSize.Height);
            foreach (var f in figures)
                f.Draw(e.Graphics);
        }
 
        PointF AbsoluteToVirtual(Point p)
        {
            return new PointF(p.X*SourceSize.Width/Width, p.Y*SourceSize.Height/Height);
        }
 
        protected override void OnMouseDown(MouseEventArgs e)
        {
            base.OnMouseDown(e);
 
            if (e.Button == MouseButtons.Left)
            {
                var p = AbsoluteToVirtual(e.Location);
                foreach (var f in figures.Reverse<Figure>())
                    if (f.HitTest(p))
                    {
                        tt.Show(f.Name, this);
                        break;
                    }
            }
        }
    }
 
    class Figure
    {
        public PointF Location { get; set; }
        public GraphicsPath Path { get; set; }
        public string Name { get; set; }
 
        public bool HitTest(PointF point)
        {
            return Path.IsVisible(point.X - Location.X, point.Y - Location.Y);
        }
 
        public void Offset(int dx, int dy)
        {
            Location = new PointF(Location.X + dx, Location.Y + dy);
        }
 
        public static Figure CreateSquare(int size)
        {
            var res = new Figure();
            res.Path = new GraphicsPath();
            res.Path.AddRectangle(new Rectangle(0, 0, size, size));
 
            return res;
        }
 
        public static Figure CreateCircle(int size)
        {
            var res = new Figure();
            res.Path = new GraphicsPath();
            res.Path.AddEllipse(new Rectangle(0, 0, size, size));
 
            return res;
        }
 
        public void Draw(Graphics g)
        {
            var state = g.Save();
            g.TranslateTransform(Location.X, Location.Y);
            g.FillPath(Brushes.Silver, Path);
            g.DrawPath(Pens.Black, Path);
            g.Restore(state);
        }
    }
}
1
0 / 0 / 1
Регистрация: 16.01.2013
Сообщений: 61
14.04.2015, 12:50  [ТС]
Да. Спасибо большое. Все работает как надо.

Есть только небольшая проблема.

Поместил данную функцию в делегат. Который вызывается по таймеру, чтоб перекрашивать состояние прямоугольников в зависимости от ситуации.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 void dbProvider_Figure(object sender, DbEventArgs args)
        {
 
            if (this.InvokeRequired)
            {
                this.BeginInvoke((MethodInvoker)delegate() { dbProvider_Figure(sender, args); });
                return;
            }
 
 
            pnSites = (List<PNSite>)args.GetDynamicData("pnSites");
            BuildFigures(pnSites);    //передаем кол-во и св-ва прямоугольников
 
        }
Все хорошо, все работает, но цвета прямоугольников на форме изменяются только после того как я дерну форму. А не самостоятельно по времени. В чем может быть причина?
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
14.04.2015, 15:19
Цитата Сообщение от dima-z04 Посмотреть сообщение
Все хорошо, все работает, но цвета прямоугольников на форме изменяются только после того как я дерну форму. А не самостоятельно по времени. В чем может быть причина?
Вызывайте метод Invalidate(), если хотите обновить графику на форме.
0
0 / 0 / 1
Регистрация: 16.01.2013
Сообщений: 61
14.04.2015, 17:43  [ТС]
То что надо. Принудительно запускать перерисовку изображения на форме.

Кстати, как быть с ситуаций, когда координаты нарисованных объектов выходят за пределы формы? Т.е. поначалу мы их рисуем все хорошо, а потом координаты выходят за пределы формы. Получается, что по факту объекты есть, но в нарисованной форме мы их не видим и скрол бар не помогает
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.04.2015, 17:43
Помогаю со студенческими работами здесь

Перемещение нарисованного объекта по форме мышью
В чем, собственно, проблема. Необходимо реализовать передвижение мышью нарисованной линии по форме. Я себе это представляю примерно...

Движение нарисованного объекта с помощью стрелок клавиатуры
Подскажите как нарисовать объект (Например Круг) и затем с помощью стрелок клавиатуры перемещать этот объект?

Обработка события Click в TextBox
Здравствуйте . Возник вопрос по событию Click. Есть матрица 3 на 3 : int mas =new int; //массив ...... TextBox tb1 = new...

Обработчик события ButAdd.Click
Добрый день, только начал изучать С#. Вопрос заключается в следующем: Создаю приложение winforms, осуществляющее задачи добавления книг,...

Прекращение действия события Click
Пишу игру крестики-нолики. Не знаю как остановить событие Cells.Click, при выйгрыше одной из сторон. Вот код формы: public partial...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru