0 / 0 / 1
Регистрация: 16.01.2013
Сообщений: 61
1

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

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

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

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)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.04.2015, 12:42
Ответы с готовыми решениями:

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

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

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

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

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

System.Windows.Shapes

И примеры там есть.
0
Эксперт .NETАвтор FAQ
10409 / 5139 / 1824
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
12.04.2015, 18:05 7
Лучший ответ Сообщение было отмечено 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);
        }
    }
}
Тысячи их:
Создание события Click для нарисованного объекта
3
0 / 0 / 1
Регистрация: 16.01.2013
Сообщений: 61
14.04.2015, 09:02  [ТС] 8
Еще вопрос, как сделать чтобы эти нарисованные прямоугольники не изменяя своих свойств при изменении размеров формы занимали свободное пространство? Масштабировались. Сейчас форма имеет жестко заданные размеры. Если ее раздвигать, то образуется пустое место. Элементы не перерисовываются.
0
Эксперт .NETАвтор FAQ
10409 / 5139 / 1824
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
14.04.2015, 09:11 9
Цитата Сообщение от 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  [ТС] 10
Да. Спасибо большое. Все работает как надо.

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

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

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
10409 / 5139 / 1824
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
14.04.2015, 15:19 11
Цитата Сообщение от dima-z04 Посмотреть сообщение
Все хорошо, все работает, но цвета прямоугольников на форме изменяются только после того как я дерну форму. А не самостоятельно по времени. В чем может быть причина?
Вызывайте метод Invalidate(), если хотите обновить графику на форме.
0
0 / 0 / 1
Регистрация: 16.01.2013
Сообщений: 61
14.04.2015, 17:43  [ТС] 12
То что надо. Принудительно запускать перерисовку изображения на форме.

Кстати, как быть с ситуаций, когда координаты нарисованных объектов выходят за пределы формы? Т.е. поначалу мы их рисуем все хорошо, а потом координаты выходят за пределы формы. Получается, что по факту объекты есть, но в нарисованной форме мы их не видим и скрол бар не помогает
0
14.04.2015, 17:43
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.04.2015, 17:43
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru