Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
0 / 0 / 0
Регистрация: 24.06.2017
Сообщений: 9

Отметки на изображении

16.07.2017, 13:57. Показов 2603. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Такой вопрос, необходимо ставить n'ое(много) колличество отметок по определенным координатам на изображении. Отметки могут быть любого вида, это не важно, но необходимо что бы эти отметки можно было удалять и добавлять, так же желательно что бы при наведении на отметку появлялся title. Проблема в том что из-за нехватки опыта не знаю как реализовать.
Все на что хватило ума так это отрисовывать отметки(все) поверх изображения при каждом изменении одной из отметок, но в таком случае просто нереально сделать какой то title для каждой из отметок(.
Прошу вашей помощи, хотя бы указать в какую сторону смотреть)

Добавлено через 17 часов 19 минут
Возможно мне следует смотреть в сторону opengl?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.07.2017, 13:57
Ответы с готовыми решениями:

Отметки на карте
Довольно тягостно ищется информация работе с картой в X-Code, кому-ниубдь когда нибудь доводилось создавать отметки на карте? Из того, что...

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

Проверка отметки RadioButton
if (radioButton.Checked) {действие } Подскажите, я хочу, чтобы при выборе первой кнопки выполнялось определенно условие, но на запись...

13
 Аватар для netBool
325 / 304 / 173
Регистрация: 16.11.2010
Сообщений: 1,069
Записей в блоге: 9
16.07.2017, 15:01
Цитата Сообщение от f1nkz Посмотреть сообщение
Все на что хватило ума так это отрисовывать отметки(все) поверх изображения при каждом изменении одной из отметок, но в таком случае просто нереально сделать какой то title для каждой из отметок(.
Почему не реально?
Цитата Сообщение от f1nkz Посмотреть сообщение
Проблема в том что из-за нехватки опыта не знаю как реализовать.
Мое мнение: если нехватка опыта, то в сторону opengl лучше не смотреть.

А вообще надо исходить из ситуации. Что за изображение? Что за отметки? Какова частота изменений/добавлений отметок? Если на обычном джедае+ будет тормозить, то тогда нужно будет посмореть в сторону опенджиэль
1
0 / 0 / 0
Регистрация: 24.06.2017
Сообщений: 9
16.07.2017, 15:33  [ТС]
Цитата Сообщение от netBool Посмотреть сообщение
А вообще надо исходить из ситуации. Что за изображение? Что за отметки? Какова частота изменений/добавлений отметок? Если на обычном джедае+ будет тормозить, то тогда нужно будет посмореть в сторону опенджиэль
netBool вне форума Обратить внимание администрации на это сообщение
Имеется просто изображение в picturebox по клику в определенном месте по нему или же по заданым заранее координатам, нам необходимо пометить эту область, таких отметок может быть очень много (0-10000), вся проблема в том что мне нужен title для отметок(всплывающаа информация при наведении или при клике по ней, это не важно, главное что бы мы получали информацию о отметке), так же должна быть возможность удаления любой из отметок.
Я реализовал это просто записью координатов отметок(в качестве отметок я использовал маленькое изображение) в массив, и через DrawImage отрисовывал отметки в нужных местах поверх изображения, при удалении+добавлении отметки, отрисовывал все отметки по новой. Но мне необходим title к отметкам, как я и писал выше, поиски в интернете ничего нужного не дали.
0
310 / 318 / 119
Регистрация: 29.10.2011
Сообщений: 1,006
16.07.2017, 16:38
f1nkz, не игру ли часом делаете?

Добавлено через 11 минут
Можно с ToolTip поиграться. Но проще самому отрисовывать по надобности
0
0 / 0 / 0
Регистрация: 24.06.2017
Сообщений: 9
16.07.2017, 17:24  [ТС]
Цитата Сообщение от sldp Посмотреть сообщение
f1nkz, не игру ли часом делаете?
нет, не игру
Цитата Сообщение от sldp Посмотреть сообщение
Можно с ToolTip поиграться. Но проще самому отрисовывать по надобности
на сколько я понимаю tooltip отображает подсказки для элементов управления, у меня проблема и заключается в том что я не понимаю как реализовать каждую отметку по-отдельности что бы к ним привязать tooltip, так как отметок может быть большое колличество(не использовать же n'oe колличество picturebox?, это как то не правильно или я ошибаюсь), а сторонних подходящих библиотек не знаю и как я уже говорил поиск не помогает
0
 Аватар для netBool
325 / 304 / 173
Регистрация: 16.11.2010
Сообщений: 1,069
Записей в блоге: 9
16.07.2017, 18:00
Лучший ответ Сообщение было отмечено f1nkz как решение

Решение

Цитата Сообщение от f1nkz Посмотреть сообщение
вся проблема в том что мне нужен title для отметок(всплывающаа информация при наведении или при клике по ней, это не важно, главное что бы мы получали информацию о отметке)
Можно сделать DrawString при наведении курсора мыши в определенную область пространства (где находится метка), + чтобы лучше выделялась надпись, сделать на фоне FillRectangle.
А чтобы именно выплывала красиво, еще и таймер навесить. Но тогда прорисовку только в обработчике Paint делать
1
964 / 485 / 241
Регистрация: 02.06.2016
Сообщений: 760
16.07.2017, 18:15
f1nkz, какой тип приложения? если это winforms, то сделай компонент с двумя картинками - на одной исходное изображение, на второй - метки, на OnPaint последовательно их рисуешь. При изменении списка/меток - перерисовываешь картинку с метками. На движение мышки - вычисляешь из координат нужную метку и что-то делаешь (добавляшь tootip, дорисовывешь информацию, стираешь метку с буфера меток), нужно разделить метки по квадратам, чтобы быстрее обрабатывать координаты.

если wpf - то можно делать также или попробовать рисовать геометрии (первая ссылка, не знаю что там конкретно), для последнего случая используешь VisualHelper.HitTest - он покажет какая метка под курсором (работает примерно так: для каждого нарисованного пикселя хранится объект), 10000 объектов это не так много чтобы не попробовать, но и не так мало, чтобы не тормозило на слабых компьютерах, если пишешь курсач и тд, то можно найти баланс производительности показать один раз и забыть про него.
1
0 / 0 / 0
Регистрация: 24.06.2017
Сообщений: 9
16.07.2017, 18:18  [ТС]
Цитата Сообщение от netBool Посмотреть сообщение
Можно сделать DrawString при наведении курсора мыши в определенную область пространства (где находится метка), + чтобы лучше выделялась надпись, сделать на фоне FillRectangle.
А чтобы именно выплывала красиво, еще и таймер навесить. Но тогда прорисовку только в обработчике Paint делать
огромное спасибо за ответ, пока что это одно из наилучих предложений, натолкнуло меня на мысль что есть же событие изменения положения курсора и можно просто при изменении положения проверять это положение и при наведении на нужные мне координаты, как вы и подметили вызывать нужную функцию))
0
 Аватар для Рядовой
1524 / 914 / 329
Регистрация: 17.05.2015
Сообщений: 3,438
16.07.2017, 18:24
f1nkz, GDI+ в стоке не поддерживает полупрозрачности, поэтому я взял такой класс на этом форуме
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
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace MarkImage
{
    public partial class TransparentPanel : Panel
    {
        public TransparentPanel()
        {
            SetStyle(ControlStyles.Opaque, true);
            TextMark = string.Empty;
        }
 
        protected override CreateParams CreateParams
        {
            get
            {
                const int WS_EX_TRANSPARENT = 0x00000020;
                CreateParams createParams = base.CreateParams;
                createParams.ExStyle |= WS_EX_TRANSPARENT;
                return createParams;
            }
        }
 
        protected override void OnPaint(PaintEventArgs e)
        {
            e.Graphics.DrawString(TextMark, new Font("Arial", 16), Brushes.Black, 0, 0);
            e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(100, Color.Gray)),
             0, 0, Width, Height);
        }
        public string TextMark;
        protected override void OnMove(EventArgs e)
        {
            if (Parent != null)
                Parent.Invalidate(Bounds, true);
        }
    }
}
Примерно накидал такое, отметки создаются левой кнопкой мыши
Миниатюры
Отметки на изображении  
Вложения
Тип файла: rar MarkImage.rar (146.2 Кб, 16 просмотров)
1
964 / 485 / 241
Регистрация: 02.06.2016
Сообщений: 760
16.07.2017, 18:50
Рядовой, попробуй 10000 таких контролов на форму накидать
0
 Аватар для Рядовой
1524 / 914 / 329
Регистрация: 17.05.2015
Сообщений: 3,438
16.07.2017, 19:27
Цитата Сообщение от Aael Посмотреть сообщение
попробуй 10000 таких контролов на форму накидать
10000 ЛЮБЫХ контролов загнут форму, а простой квадрат с текстом как-то уныло смотрится
0
964 / 485 / 241
Регистрация: 02.06.2016
Сообщений: 760
16.07.2017, 19:33
Лучший ответ Сообщение было отмечено f1nkz как решение

Решение

Цитата Сообщение от Рядовой Посмотреть сообщение
10000 ЛЮБЫХ контролов загнут форму, а простой квадрат с текстом как-то уныло смотрится
значит это не выход, а насчет формы - мы ведь не знаем, что там у тс за метки.

Прикрепил самую простую реализация варианта с двумя буферами, который я описывал выше.
Вложения
Тип файла: zip WindowsFormsApp1.zip (27.6 Кб, 21 просмотров)
1
0 / 0 / 0
Регистрация: 24.06.2017
Сообщений: 9
16.07.2017, 19:52  [ТС]
Цитата Сообщение от Aael Посмотреть сообщение
значит это не выход, а насчет формы - мы ведь не знаем, что там у тс за метки.
Прикрепил самую простую реализация варианта с двумя буферами, который я описывал выше.
Огромное спасибо, это то что нужно))

p.s. нет, это не курсовая. Просто я из тех кто начинает изучать язык с практики и не ищу легких путей))
0
310 / 318 / 119
Регистрация: 29.10.2011
Сообщений: 1,006
16.07.2017, 19:56
Кликните здесь для просмотра всего текста
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.Linq;
using System.Net;
using System.Windows.Forms;
 
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        private readonly List<Marker> _markers = new List<Marker>();
        private readonly Тotification _totification = new Тotification();
        private bool _isDrawTotification = false;
 
        public Form1()
        {
            InitializeComponent();
 
            SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.UserPaint, true);
 
            Marker.Image = Image.FromStream(new WebClient().OpenRead("https://cdn1.iconfinder.com/data/icons/Map-Markers-Icons-Demo-PNG/128/Map-Marker-Marker-Outside-Azure.png"));
            Marker.Size = new Size(64, 64);
        }
 
        protected override void OnMouseClick(MouseEventArgs e)
        {
            base.OnMouseClick(e);
 
            _markers.Add(new Marker { Location = e.Location, Description = $"Marker №{_markers.Count + 1}" });
            Invalidate();
        }
 
        protected override void OnMouseMove(MouseEventArgs e)
        {
            base.OnMouseMove(e);
 
            var marker = _markers.FirstOrDefault(m => m.Contains(e.Location));
 
            if (marker != null)
            {
                _totification.Description = marker.Description;
                _totification.Location = e.Location;
 
                _isDrawTotification = true;
            }
            else
                _isDrawTotification = false;
 
            Invalidate();
        }
 
        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);
            
            foreach (var marker in _markers)
                marker.Draw(e.Graphics);
 
            if (_isDrawTotification)
                _totification.Draw(e.Graphics);
        }
    }
 
    class Marker
    {
        public static Image Image { get; set; }
        public static Size Size { get; set; }
 
        public Point Location { get; set; }
 
        public string Description { get; set; }
 
        public bool Contains(Point point)
        {
            return new Rectangle(Location, Image.Size).Contains(point);
        }
 
        public void Draw(Graphics graphics)
        {
            graphics.DrawImage(Image, new Rectangle(Location, Size));
        }
    }
 
    class Тotification
    {
        public string Title { get; set; } = "Title";
        public string Description { get; set; } = "Description";
 
        public Font Font { get; set; } = new Font("Microsoft Sans Serif", 8F);
 
        public Point Location { get; set; }
        public Size Size { get; set; } = new Size(200, 50);
 
        public Color TextColor { get; set; } = Color.Black;
        public Color BorderColor { get; set; } = Color.Black;
        public Color BackgroundColor { get; set; } = Color.LightYellow;
        public bool IsBorderDraw { get; set; } = true;
 
        public void Draw(Graphics graphics)
        {
            var rectangle = new Rectangle(Location, Size);
 
            using (var brushBackground = new SolidBrush(BackgroundColor))
                graphics.FillRectangle(brushBackground, rectangle);
 
            using (var brushText = new SolidBrush(TextColor))
            {
                graphics.DrawString(Title, Font, brushText, rectangle, new StringFormat { LineAlignment = StringAlignment.Near, Alignment = StringAlignment.Center });
                graphics.DrawString(Description, Font, brushText, rectangle, new StringFormat { LineAlignment = StringAlignment.Center, Alignment = StringAlignment.Near });
            }
 
            if (IsBorderDraw)
                using (var penBorder = new Pen(BorderColor))
                    graphics.DrawRectangle(penBorder, rectangle);
        }
    }
}
Миниатюры
Отметки на изображении  
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.07.2017, 19:56
Помогаю со студенческими работами здесь

Отметки строк в Dbgrid
Есть ли в DbGrid свойство, что б можно было отмечать строки? Что то типо чек бокса... но что б не в самой БД отмечать, а конкретно в...

Отметки О Прочтении В Папках
Добрый день. Есть 2 сервака в кластере. На них лежит мейл-база пользователя. Репликация кластерная и обычная каждые 2 часа. На базах...

Сделать отметки на графике от -п до п
Вот листинг (это кусок программы в котором нужно проставить на графике отметки от начала синусоиды -п а в конце п ,ну и желательно -п/2 и...

View как сделать отметки
Здравствуйте. Есть один животрепещущий вопрос... Имеется вьюха...Во вьюхе есть записи названий каких либо работ. Вопрос вот в чём......

Как скрыть отметки в RadioButton?
Как скрыть отметки в радиобаттоне? есть тест, там несколько ответов, и нужно чтобы программа знала правильный ответ, и чтобы пользователь...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Контроль корректности заполнения дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru